[CRIU] [RFC 1/2] pagemap: Introduce pagemap cache
Pavel Emelyanov
xemul at parallels.com
Thu Feb 13 04:00:53 PST 2014
On 02/13/2014 03:55 PM, Cyrill Gorcunov wrote:
> On Thu, Feb 13, 2014 at 03:40:37PM +0400, Pavel Emelyanov wrote:
>>> +static int pmc_fill_cache(pmc_t *pmc, unsigned long from)
>>> +{
>>> + size_t size_map, size_chunk, nr_vmas = 0;
>>> + size_t size_left = PAGEMAP_MAP_SIZE;
>>> + struct vma_area *vma, *prev = NULL;
>>> + unsigned long size_cov = 0;
>>> + unsigned long size_gap = 0;
>>> +
>>> + pmc->start = from;
>>
>> The from should be 2MB-aligned value.
>
> The VMAs addresses are always 4K aligned as minimum, how to cache
> addresses which are not 2M aligned?
You shouldn't. When you come here you should either cache all 2MB
region which covers the address you have, or just read a single vma.
>>> + pmc->end = from + PAGEMAP_MAP_SIZE;
>>> +
>>> + pr_trace("pmc_fill_cache %lx-%lx\n", pmc->start, pmc->end);
>>> +
>>> + vma = pmc_lookup_vma(pmc, from);
>>
>> The vma can be passed down by the caller. And the pmc api would look like
>>
>> u64 pagemap_read(unsigned long vaddr, struct vm_area_struct *vma)
>>
>> Where vma is the area from which to continue caching in case we've missed it.
>
> I don't see much point in it.
The huge and nasty pmc_lookup_vma goes away, the code becomes smaller and
easier to read.
> When we init cache we pass VMA list header
> which we remember (which in turn implies that VMA list is consistent when
> we use cache). Because we dump VMAs in sequent order the cache can find
> by self which VMA belongs to address passed by a caller.
>
>>> +
>>> + /* Cache might be partially filled */
>>> + pmc->end = from + size_cov;
>>> +
>>> + size_map = PAGEMAP_PFN_OFF(pmc->end - pmc->start);
>>
>> I don't get the arithmetic above. What is it about? You should calculate the
>> total length of vmas withing the 2MB chunk you're about to read and if this
>> value is less than X (X should be estimated constant) then just read the vma
>> length. The above maths seem to do more than that.
>
> The cache migh be partially filled. That is how
>
> - when we start filling the 2M cache at first we cache first chunk
> (note the VMA we're caching might be greater than 2M in size so
> we cache it one chunk by another).
>
> - another scenario -- the vma we've cached is small and there is space
> left in cache -- we lookup over forward VMAs to find if there VMAs
> which can fit the rest of the cache by whole (ie the next VMA must
> be small enough to fit the rest of 2M cache). So we can say 4 small
> VMAs which fit the 2M cache but their summary size is less than 2M.
> Thus at the final we count how many bytes in cache is filled, for
> statistics purpose.
Yet again. The cache fill criteria is -- the amount of PFNs we need from
this 2MB region is more than threshold. Nothing more.
> .
>
More information about the CRIU
mailing list