Commit 9058baae authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

pagemap: Enqueue iovec to arbitrary list

We currently can batch pagemap entries into page-read list, but will
need to queue them into per-pstree_entry one.
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent b43f7aa6
...@@ -95,6 +95,9 @@ extern int open_page_read(int pid, struct page_read *, int pr_flags); ...@@ -95,6 +95,9 @@ extern int open_page_read(int pid, struct page_read *, int pr_flags);
extern int open_page_read_at(int dfd, int pid, struct page_read *pr, extern int open_page_read_at(int dfd, int pid, struct page_read *pr,
int pr_flags); int pr_flags);
int pagemap_enqueue_iovec(struct page_read *pr, void *buf,
unsigned long len, struct list_head *to);
extern int dedup_one_iovec(struct page_read *pr, unsigned long base, extern int dedup_one_iovec(struct page_read *pr, unsigned long base,
unsigned long len); unsigned long len);
......
...@@ -279,7 +279,8 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr, ...@@ -279,7 +279,8 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr,
return 0; return 0;
} }
static int enqueue_async_iov(struct page_read *pr, unsigned long len, void *buf) static int enqueue_async_iov(struct page_read *pr, void *buf,
unsigned long len, struct list_head *to)
{ {
struct page_read_iov *pr_iov; struct page_read_iov *pr_iov;
struct iovec *iov; struct iovec *iov;
...@@ -303,19 +304,19 @@ static int enqueue_async_iov(struct page_read *pr, unsigned long len, void *buf) ...@@ -303,19 +304,19 @@ static int enqueue_async_iov(struct page_read *pr, unsigned long len, void *buf)
pr_iov->to = iov; pr_iov->to = iov;
pr_iov->nr = 1; pr_iov->nr = 1;
list_add_tail(&pr_iov->l, &pr->async); list_add_tail(&pr_iov->l, to);
return 0; return 0;
} }
static int enqueue_async_page(struct page_read *pr, unsigned long vaddr, int pagemap_enqueue_iovec(struct page_read *pr, void *buf,
unsigned long len, void *buf) unsigned long len, struct list_head *to)
{ {
struct page_read_iov *cur_async = NULL; struct page_read_iov *cur_async = NULL;
struct iovec *iov; struct iovec *iov;
if (!list_empty(&pr->async)) if (!list_empty(to))
cur_async = list_entry(pr->async.prev, struct page_read_iov, l); cur_async = list_entry(to->prev, struct page_read_iov, l);
/* /*
* We don't have any async requests or we have new read * We don't have any async requests or we have new read
...@@ -324,7 +325,7 @@ static int enqueue_async_page(struct page_read *pr, unsigned long vaddr, ...@@ -324,7 +325,7 @@ static int enqueue_async_page(struct page_read *pr, unsigned long vaddr,
* Start the new preadv request here. * Start the new preadv request here.
*/ */
if (!cur_async || pr->pi_off != cur_async->end) if (!cur_async || pr->pi_off != cur_async->end)
return enqueue_async_iov(pr, len, buf); return enqueue_async_iov(pr, buf, len, to);
/* /*
* This read is pure continuation of the previous one. Let's * This read is pure continuation of the previous one. Let's
...@@ -339,7 +340,7 @@ static int enqueue_async_page(struct page_read *pr, unsigned long vaddr, ...@@ -339,7 +340,7 @@ static int enqueue_async_page(struct page_read *pr, unsigned long vaddr,
unsigned int n_iovs = cur_async->nr + 1; unsigned int n_iovs = cur_async->nr + 1;
if (n_iovs >= IOV_MAX) if (n_iovs >= IOV_MAX)
return enqueue_async_iov(pr, len, buf); return enqueue_async_iov(pr, buf, len, to);
iov = xrealloc(cur_async->to, n_iovs * sizeof(*iov)); iov = xrealloc(cur_async->to, n_iovs * sizeof(*iov));
if (!iov) if (!iov)
...@@ -366,7 +367,7 @@ static int maybe_read_page(struct page_read *pr, unsigned long vaddr, ...@@ -366,7 +367,7 @@ static int maybe_read_page(struct page_read *pr, unsigned long vaddr,
unsigned long len = nr * PAGE_SIZE; unsigned long len = nr * PAGE_SIZE;
if (flags & PR_ASYNC) if (flags & PR_ASYNC)
ret = enqueue_async_page(pr, vaddr, len, buf); ret = pagemap_enqueue_iovec(pr, buf, len, &pr->async);
else else
ret = read_local_page(pr, vaddr, len, buf); ret = read_local_page(pr, vaddr, len, buf);
......
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