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) ...@@ -137,26 +137,30 @@ int dedup_one_iovec(struct page_read *pr, struct iovec *iov)
return 0; 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++; pr->curr_pme++;
if (pr->curr_pme >= pr->nr_pmes) if (pr->curr_pme >= pr->nr_pmes)
return 0; 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; static int get_pagemap(struct page_read *pr, struct iovec *iov)
pr->cvaddr = (unsigned long)iov->iov_base; {
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"); pr_err("No parent for snapshot pagemap\n");
return -1; return -1;
} }
pagemap2iovec(pr->pe, iov);
return 1; return 1;
} }
...@@ -172,35 +176,23 @@ static void skip_pagemap_pages(struct page_read *pr, unsigned long len) ...@@ -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) static int seek_pagemap_page(struct page_read *pr, unsigned long vaddr)
{ {
int ret; pr->reset(pr);
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;
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) { if (vaddr >= start && vaddr < end) {
skip_pagemap_pages(pr, iov_end - pr->cvaddr); skip_pagemap_pages(pr, vaddr - pr->cvaddr);
new_pagemap: return 1;
ret = get_pagemap(pr, &iov);
if (ret <= 0)
return ret;
continue;
} }
skip_pagemap_pages(pr, vaddr - pr->cvaddr); if (end <= vaddr)
return 1; skip_pagemap_pages(pr, end - pr->cvaddr);
} }
return 0;
} }
static inline void pagemap_bound_check(PagemapEntry *pe, unsigned long vaddr, int nr) 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