Commit f514b606 authored by Pavel Emelyanov's avatar Pavel Emelyanov

page-read: Add async arg to ->read_pages callback

Flag PR_ASYNC means, that the caller is OK if the routine
returns w/o data read into the buffer provided.

https://travis-ci.org/criupatchwork/criu/builds/175451746Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent b47d9a28
...@@ -47,7 +47,8 @@ struct page_read { ...@@ -47,7 +47,8 @@ struct page_read {
*/ */
int (*get_pagemap)(struct page_read *, struct iovec *iov); int (*get_pagemap)(struct page_read *, struct iovec *iov);
/* reads page from current pagemap */ /* reads page from current pagemap */
int (*read_pages)(struct page_read *, unsigned long vaddr, int nr, void *); int (*read_pages)(struct page_read *, unsigned long vaddr, int nr,
void *, unsigned flags);
void (*close)(struct page_read *); void (*close)(struct page_read *);
int (*seek_page)(struct page_read *pr, unsigned long vaddr, bool warn); int (*seek_page)(struct page_read *pr, unsigned long vaddr, bool warn);
...@@ -72,6 +73,10 @@ struct page_read { ...@@ -72,6 +73,10 @@ struct page_read {
int curr_pme; int curr_pme;
}; };
/* flags for ->read_pages */
#define PR_ASYNC 0x1 /* may exit w/o data in the buffer */
/* flags for open_page_read */
#define PR_SHMEM 0x1 #define PR_SHMEM 0x1
#define PR_TASK 0x2 #define PR_TASK 0x2
......
...@@ -748,7 +748,7 @@ static int restore_priv_vma_content(struct pstree_item *t) ...@@ -748,7 +748,7 @@ static int restore_priv_vma_content(struct pstree_item *t)
if (vma->ppage_bitmap) { /* inherited vma */ if (vma->ppage_bitmap) { /* inherited vma */
clear_bit(off, vma->ppage_bitmap); clear_bit(off, vma->ppage_bitmap);
ret = pr.read_pages(&pr, va, 1, buf); ret = pr.read_pages(&pr, va, 1, buf, 0);
if (ret < 0) if (ret < 0)
goto err_read; goto err_read;
...@@ -776,7 +776,7 @@ static int restore_priv_vma_content(struct pstree_item *t) ...@@ -776,7 +776,7 @@ static int restore_priv_vma_content(struct pstree_item *t)
nr = min_t(int, nr_pages - i, (vma->e->end - va) / PAGE_SIZE); nr = min_t(int, nr_pages - i, (vma->e->end - va) / PAGE_SIZE);
ret = pr.read_pages(&pr, va, nr, p); ret = pr.read_pages(&pr, va, nr, p, PR_ASYNC);
if (ret < 0) if (ret < 0)
goto err_read; goto err_read;
......
...@@ -204,7 +204,7 @@ static inline void pagemap_bound_check(PagemapEntry *pe, unsigned long vaddr, in ...@@ -204,7 +204,7 @@ static inline void pagemap_bound_check(PagemapEntry *pe, unsigned long vaddr, in
} }
static int read_parent_page(struct page_read *pr, unsigned long vaddr, static int read_parent_page(struct page_read *pr, unsigned long vaddr,
int nr, void *buf) int nr, void *buf, unsigned flags)
{ {
struct page_read *ppr = pr->parent; struct page_read *ppr = pr->parent;
int ret; int ret;
...@@ -235,7 +235,7 @@ static int read_parent_page(struct page_read *pr, unsigned long vaddr, ...@@ -235,7 +235,7 @@ static int read_parent_page(struct page_read *pr, unsigned long vaddr,
if (p_nr > nr) if (p_nr > nr)
p_nr = nr; p_nr = nr;
ret = ppr->read_pages(ppr, vaddr, p_nr, buf); ret = ppr->read_pages(ppr, vaddr, p_nr, buf, flags);
if (ret == -1) if (ret == -1)
return ret; return ret;
...@@ -253,7 +253,7 @@ static int read_parent_page(struct page_read *pr, unsigned long vaddr, ...@@ -253,7 +253,7 @@ static int read_parent_page(struct page_read *pr, unsigned long vaddr,
} }
static int read_local_page(struct page_read *pr, unsigned long vaddr, static int read_local_page(struct page_read *pr, unsigned long vaddr,
unsigned long len, void *buf) unsigned long len, void *buf, unsigned flags)
{ {
int fd = img_raw_fd(pr->pi); int fd = img_raw_fd(pr->pi);
int ret; int ret;
...@@ -277,7 +277,8 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr, ...@@ -277,7 +277,8 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr,
return 0; return 0;
} }
static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, int nr, void *buf) static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, int nr,
void *buf, unsigned flags)
{ {
unsigned long len = nr * PAGE_SIZE; unsigned long len = nr * PAGE_SIZE;
...@@ -285,10 +286,10 @@ static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, int nr, ...@@ -285,10 +286,10 @@ static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, int nr,
pagemap_bound_check(pr->pe, vaddr, nr); pagemap_bound_check(pr->pe, vaddr, nr);
if (pr->pe->in_parent) { if (pr->pe->in_parent) {
if (read_parent_page(pr, vaddr, nr, buf) < 0) if (read_parent_page(pr, vaddr, nr, buf, flags) < 0)
return -1; return -1;
} else { } else {
if (read_local_page(pr, vaddr, len, buf) < 0) if (read_local_page(pr, vaddr, len, buf, flags) < 0)
return -1; return -1;
} }
......
...@@ -480,7 +480,7 @@ static int restore_shmem_content(void *addr, struct shmem_info *si) ...@@ -480,7 +480,7 @@ static int restore_shmem_content(void *addr, struct shmem_info *si)
if (vaddr + nr_pages * PAGE_SIZE > si->size) if (vaddr + nr_pages * PAGE_SIZE > si->size)
break; break;
pr.read_pages(&pr, vaddr, nr_pages, addr + vaddr); pr.read_pages(&pr, vaddr, nr_pages, addr + vaddr, 0);
} }
pr.close(&pr); pr.close(&pr);
......
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