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 {
*/
int (*get_pagemap)(struct page_read *, struct iovec *iov);
/* 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 *);
int (*seek_page)(struct page_read *pr, unsigned long vaddr, bool warn);
......@@ -72,6 +73,10 @@ struct page_read {
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_TASK 0x2
......
......@@ -748,7 +748,7 @@ static int restore_priv_vma_content(struct pstree_item *t)
if (vma->ppage_bitmap) { /* inherited vma */
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)
goto err_read;
......@@ -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);
ret = pr.read_pages(&pr, va, nr, p);
ret = pr.read_pages(&pr, va, nr, p, PR_ASYNC);
if (ret < 0)
goto err_read;
......
......@@ -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,
int nr, void *buf)
int nr, void *buf, unsigned flags)
{
struct page_read *ppr = pr->parent;
int ret;
......@@ -235,7 +235,7 @@ static int read_parent_page(struct page_read *pr, unsigned long vaddr,
if (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)
return ret;
......@@ -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,
unsigned long len, void *buf)
unsigned long len, void *buf, unsigned flags)
{
int fd = img_raw_fd(pr->pi);
int ret;
......@@ -277,7 +277,8 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr,
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;
......@@ -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);
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;
} else {
if (read_local_page(pr, vaddr, len, buf) < 0)
if (read_local_page(pr, vaddr, len, buf, flags) < 0)
return -1;
}
......
......@@ -480,7 +480,7 @@ static int restore_shmem_content(void *addr, struct shmem_info *si)
if (vaddr + nr_pages * PAGE_SIZE > si->size)
break;
pr.read_pages(&pr, vaddr, nr_pages, addr + vaddr);
pr.read_pages(&pr, vaddr, nr_pages, addr + vaddr, 0);
}
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