[CRIU] [PATCH 3/7] page-read: Drop get_remote_pages
Pavel Emelyanov
xemul at virtuozzo.com
Wed Nov 16 01:39:08 PST 2016
We already have routines that do send-req, recv-info
and recv-page, so no need in yet another one.
Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
criu/include/page-xfer.h | 3 ---
criu/page-xfer.c | 34 ++++------------------------------
criu/pagemap.c | 21 ++++++++++++---------
3 files changed, 16 insertions(+), 42 deletions(-)
diff --git a/criu/include/page-xfer.h b/criu/include/page-xfer.h
index 7cd0055..5b7ec21 100644
--- a/criu/include/page-xfer.h
+++ b/criu/include/page-xfer.h
@@ -52,9 +52,6 @@ extern int check_parent_page_xfer(int fd_type, long id);
* - dump-side page server sends the raw page data
*/
-/* sync receive of remote pages */
-extern int get_remote_pages(int pid, unsigned long addr, int nr_pages, void *dest);
-
/* async request/receive of remote pages */
extern int request_remote_pages(int pid, unsigned long addr, int nr_pages);
extern int receive_remote_pages_info(int *nr_pages, unsigned long *addr, int *pid);
diff --git a/criu/page-xfer.c b/criu/page-xfer.c
index 7f1d0f7..2d878e2 100644
--- a/criu/page-xfer.c
+++ b/criu/page-xfer.c
@@ -887,36 +887,6 @@ out:
return ret ? : status;
}
-int get_remote_pages(int pid, unsigned long addr, int nr_pages, void *dest)
-{
- int ret;
- int len = PAGE_SIZE * nr_pages;
-
- struct page_server_iov pi;
-
- if (send_psi(page_server_sk, PS_IOV_GET, nr_pages, addr, pid))
- return -1;
-
- tcp_nodelay(page_server_sk, true);
-
- ret = recv(page_server_sk, &pi, sizeof(pi), MSG_WAITALL);
- if (ret != sizeof(pi))
- return -1;
-
- /* zero page */
- if (pi.cmd == PS_IOV_ZERO)
- return 0;
-
- if (pi.nr_pages > nr_pages)
- return -1;
-
- ret = recv(page_server_sk, dest, len, MSG_WAITALL);
- if (ret != len)
- return -1;
-
- return 1;
-}
-
int request_remote_pages(int pid, unsigned long addr, int nr_pages)
{
struct page_server_iov pi = {
@@ -945,6 +915,10 @@ int receive_remote_pages_info(int *nr_pages, unsigned long *addr, int *pid)
return -1;
}
+ if (pi.cmd == PS_IOV_ZERO)
+ pr_warn("Unexpected ZERO page received for %d.%lx\n",
+ (int)pi.dst_id, (unsigned long)pi.vaddr);
+
*nr_pages = pi.nr_pages;
*addr = pi.vaddr;
*pid = pi.dst_id;
diff --git a/criu/pagemap.c b/criu/pagemap.c
index e05a468..86791d7 100644
--- a/criu/pagemap.c
+++ b/criu/pagemap.c
@@ -397,16 +397,19 @@ static int maybe_read_page_local(struct page_read *pr, unsigned long vaddr,
static int maybe_read_page_remote(struct page_read *pr, unsigned long vaddr,
int nr, void *buf, unsigned flags)
{
- int ret;
+ int ret, pid;
- if (flags & PR_ASYNC)
- /*
- * Note, that for async remote page_read, the actual
- * transfer happens in the lazy-pages daemon
- */
- ret = request_remote_pages(pr->pid, vaddr, nr);
- else
- ret = get_remote_pages(pr->pid, vaddr, nr, buf);
+ ret = request_remote_pages(pr->pid, vaddr, nr);
+ if ((ret < 0) || (flags & PR_ASYNC))
+ return ret;
+
+ /*
+ * Note, that for async remote page_read, the actual
+ * transfer happens in the lazy-pages daemon
+ */
+ ret = receive_remote_pages_info(&nr, &vaddr, &pid);
+ if (ret == 0)
+ ret = receive_remote_pages(nr * PAGE_SIZE, buf);
return ret;
}
--
2.5.0
More information about the CRIU
mailing list