Commit 70b072d4 authored by Mike Rapoport's avatar Mike Rapoport Committed by Pavel Emelyanov

criu: pagemap: introduce advance() helper for pagemap iteration

Signed-off-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent eba074c0
......@@ -137,26 +137,30 @@ int dedup_one_iovec(struct page_read *pr, struct iovec *iov)
return 0;
}
static int get_pagemap(struct page_read *pr, struct iovec *iov)
static int advance(struct page_read *pr)
{
PagemapEntry *pe;
pr->curr_pme++;
if (pr->curr_pme >= pr->nr_pmes)
return 0;
pe = pr->pmes[pr->curr_pme];
pr->pe = pr->pmes[pr->curr_pme];
pr->cvaddr = pr->pe->vaddr;
pagemap2iovec(pe, iov);
return 1;
}
pr->pe = pe;
pr->cvaddr = (unsigned long)iov->iov_base;
static int get_pagemap(struct page_read *pr, struct iovec *iov)
{
if (!advance(pr))
return 0;
if (pe->in_parent && !pr->parent) {
if (pr->pe->in_parent && !pr->parent) {
pr_err("No parent for snapshot pagemap\n");
return -1;
}
pagemap2iovec(pr->pe, iov);
return 1;
}
......@@ -172,35 +176,23 @@ static void skip_pagemap_pages(struct page_read *pr, unsigned long len)
static int seek_pagemap_page(struct page_read *pr, unsigned long vaddr)
{
int ret;
struct iovec iov;
if (pr->pe)
pagemap2iovec(pr->pe, &iov);
else
goto new_pagemap;
while (1) {
unsigned long iov_end;
if (vaddr < pr->cvaddr)
return 0;
pr->reset(pr);
iov_end = (unsigned long)iov.iov_base + iov.iov_len;
while (advance(pr)) {
unsigned long start = pr->pe->vaddr;
unsigned long len = pr->pe->nr_pages * PAGE_SIZE;
unsigned long end = start + len;
if (iov_end <= vaddr) {
skip_pagemap_pages(pr, iov_end - pr->cvaddr);
new_pagemap:
ret = get_pagemap(pr, &iov);
if (ret <= 0)
return ret;
continue;
if (vaddr >= start && vaddr < end) {
skip_pagemap_pages(pr, vaddr - pr->cvaddr);
return 1;
}
skip_pagemap_pages(pr, vaddr - pr->cvaddr);
return 1;
if (end <= vaddr)
skip_pagemap_pages(pr, end - pr->cvaddr);
}
return 0;
}
static inline void pagemap_bound_check(PagemapEntry *pe, unsigned long vaddr, int nr)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment