Commit 832f3844 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

page-server: Unify async/sync calls

The newly introduced sync-read call may look exactly
the same as its async pair by using the respective
complete callback.
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Acked-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent b801cd68
...@@ -59,6 +59,7 @@ extern int request_remote_pages(int pid, unsigned long addr, int nr_pages); ...@@ -59,6 +59,7 @@ extern int request_remote_pages(int pid, unsigned long addr, int nr_pages);
typedef int (*ps_async_read_complete)(int pid, unsigned long vaddr, int nr_pages, void *); typedef int (*ps_async_read_complete)(int pid, unsigned long vaddr, int nr_pages, void *);
extern int page_server_start_async_read(void *buf, int nr_pages, extern int page_server_start_async_read(void *buf, int nr_pages,
ps_async_read_complete complete, void *priv); ps_async_read_complete complete, void *priv);
extern int page_server_start_sync_read(void *buf, int nr_pages, unsigned long *vaddr); extern int page_server_start_sync_read(void *buf, int nr_pages,
ps_async_read_complete complete, void *priv);
#endif /* __CR_PAGE_XFER__H__ */ #endif /* __CR_PAGE_XFER__H__ */
...@@ -1201,20 +1201,25 @@ static int receive_remote_pages(int len, void *buf) ...@@ -1201,20 +1201,25 @@ static int receive_remote_pages(int len, void *buf)
return 0; return 0;
} }
int page_server_start_sync_read(void *buf, int nr, unsigned long *vaddr) int page_server_start_sync_read(void *buf, int nr,
ps_async_read_complete complete, void *priv)
{ {
int ret, pid, new_nr; int ret, pid, new_nr;
unsigned long vaddr;
/* /*
* Note, that for async remote page_read, the actual * Note, that for async remote page_read, the actual
* transfer happens in the lazy-pages daemon * transfer happens in the lazy-pages daemon
*/ */
ret = receive_remote_pages_info(&new_nr, vaddr, &pid); ret = receive_remote_pages_info(&new_nr, &vaddr, &pid);
if (ret == 0) { if (ret == 0) {
if (new_nr < 0 || new_nr > nr) if (new_nr < 0 || new_nr > nr)
return -1; return -1;
ret = receive_remote_pages(nr * PAGE_SIZE, buf); ret = receive_remote_pages(nr * PAGE_SIZE, buf);
} }
if (ret == 0)
ret = complete(pid, vaddr, nr, priv);
return ret; return ret;
} }
...@@ -442,12 +442,8 @@ static int maybe_read_page_remote(struct page_read *pr, unsigned long vaddr, ...@@ -442,12 +442,8 @@ static int maybe_read_page_remote(struct page_read *pr, unsigned long vaddr,
return ret; return ret;
if (flags & PR_ASYNC) if (flags & PR_ASYNC)
return page_server_start_async_read(buf, nr, read_page_complete, pr); return page_server_start_async_read(buf, nr, read_page_complete, pr);
else
ret = page_server_start_sync_read(buf, nr, &vaddr); return page_server_start_sync_read(buf, nr, read_page_complete, pr);
if (ret == 0 && pr->io_complete)
ret = pr->io_complete(pr, vaddr, nr);
return ret;
} }
static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, int nr, static int read_pagemap_page(struct page_read *pr, 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