Commit b2dafe74 authored by Mike Rapoport's avatar Mike Rapoport Committed by Andrei Vagin

criu: lazy-pages: use new pagemap features

Pagemap now is more friendly to random accesses, enable use of new APIs.
Signed-off-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Acked-by: 's avatarAdrian Reber <areber@redhat.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent c12477da
...@@ -47,6 +47,8 @@ struct lazy_pages_info { ...@@ -47,6 +47,8 @@ struct lazy_pages_info {
struct list_head pages; struct list_head pages;
struct page_read pr;
unsigned long total_pages; unsigned long total_pages;
unsigned long copied_pages; unsigned long copied_pages;
...@@ -75,6 +77,8 @@ static void lpi_fini(struct lazy_pages_info *lpi) ...@@ -75,6 +77,8 @@ static void lpi_fini(struct lazy_pages_info *lpi)
{ {
if (lpi->uffd > 0) if (lpi->uffd > 0)
close(lpi->uffd); close(lpi->uffd);
if (lpi->pr.close)
lpi->pr.close(&lpi->pr);
free(lpi); free(lpi);
} }
...@@ -325,37 +329,26 @@ out: ...@@ -325,37 +329,26 @@ out:
static int get_page(struct lazy_pages_info *lpi, unsigned long addr, void *dest) static int get_page(struct lazy_pages_info *lpi, unsigned long addr, void *dest)
{ {
struct iovec iov;
int ret; int ret;
unsigned char buf[PAGE_SIZE]; unsigned char buf[PAGE_SIZE];
struct page_read pr;
ret = open_page_read(lpi->pid, &pr, PR_TASK | PR_MOD);
pr_debug("get_page ret %d\n", ret);
ret = pr.get_pagemap(&pr, &iov); lpi->pr.reset(&lpi->pr);
pr_debug("get_pagemap ret %d\n", ret);
if (ret <= 0)
return ret;
ret = pr.seek_page(&pr, addr); ret = lpi->pr.seek_page(&lpi->pr, addr);
pr_debug("seek_pagemap_page ret 0x%x\n", ret); pr_debug("seek_pagemap_page ret 0x%x\n", ret);
if (ret <= 0) if (ret <= 0)
return ret; return ret;
if (pr.pe->zero) if (lpi->pr.pe->zero)
return 0; return 0;
ret = pr.read_pages(&pr, addr, 1, buf, 0); ret = lpi->pr.read_pages(&lpi->pr, addr, 1, buf, 0);
pr_debug("read_pages ret %d\n", ret); pr_debug("read_pages ret %d\n", ret);
if (ret <= 0) if (ret <= 0)
return ret; return ret;
memcpy(dest, buf, PAGE_SIZE); memcpy(dest, buf, PAGE_SIZE);
if (pr.close)
pr.close(&pr);
return 1; return 1;
} }
...@@ -559,7 +552,6 @@ static int find_vmas(struct lazy_pages_info *lpi) ...@@ -559,7 +552,6 @@ static int find_vmas(struct lazy_pages_info *lpi)
struct vm_area_list vmas; struct vm_area_list vmas;
int vn = 0; int vn = 0;
struct rst_info *ri; struct rst_info *ri;
struct page_read pr;
struct uffd_pages_struct *uffd_pages; struct uffd_pages_struct *uffd_pages;
struct pstree_item *item = pstree_item_by_virt(lpi->pid); struct pstree_item *item = pstree_item_by_virt(lpi->pid);
...@@ -605,7 +597,7 @@ static int find_vmas(struct lazy_pages_info *lpi) ...@@ -605,7 +597,7 @@ static int find_vmas(struct lazy_pages_info *lpi)
pr_info("vma 0x%"PRIx64" 0x%"PRIx64"\n", vma->e->start, vma->e->end); pr_info("vma 0x%"PRIx64" 0x%"PRIx64"\n", vma->e->start, vma->e->end);
} }
ret = open_page_read(lpi->pid, &pr, PR_TASK); ret = open_page_read(lpi->pid, &lpi->pr, PR_TASK);
if (ret <= 0) { if (ret <= 0) {
ret = -1; ret = -1;
goto out; goto out;
...@@ -617,15 +609,12 @@ static int find_vmas(struct lazy_pages_info *lpi) ...@@ -617,15 +609,12 @@ static int find_vmas(struct lazy_pages_info *lpi)
* pushed into the process using userfaultfd. * pushed into the process using userfaultfd.
*/ */
do { do {
ret = collect_uffd_pages(&pr, lpi); ret = collect_uffd_pages(&lpi->pr, lpi);
if (ret == -1) { if (ret == -1) {
goto out; goto out;
} }
} while (ret); } while (ret);
if (pr.close)
pr.close(&pr);
/* Count detected pages */ /* Count detected pages */
list_for_each_entry(uffd_pages, &lpi->pages, list) list_for_each_entry(uffd_pages, &lpi->pages, list)
ret++; ret++;
......
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