[CRIU] [PATCH 2/5] page-server: Unify async/sync calls

Pavel Emelyanov xemul at virtuozzo.com
Wed Jun 14 13:14:46 MSK 2017


The newly introduced sync-read call may look exactly
the same as its async pair by using the respective
complete callback.

Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
 criu/include/page-xfer.h | 3 ++-
 criu/page-xfer.c         | 9 +++++++--
 criu/pagemap.c           | 8 ++------
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/criu/include/page-xfer.h b/criu/include/page-xfer.h
index 5d8dc81..4ccefee 100644
--- a/criu/include/page-xfer.h
+++ b/criu/include/page-xfer.h
@@ -64,6 +64,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 *);
 extern int page_server_start_async_read(void *buf, int nr_pages,
 		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__ */
diff --git a/criu/page-xfer.c b/criu/page-xfer.c
index 761985a..067b7d3 100644
--- a/criu/page-xfer.c
+++ b/criu/page-xfer.c
@@ -1204,20 +1204,25 @@ static int receive_remote_pages(int len, void *buf)
 	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;
+	unsigned long vaddr;
 
 	/*
 	 * Note, that for async remote page_read, the actual
 	 * 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 (new_nr < 0 || new_nr > nr)
 			return -1;
 		ret = receive_remote_pages(nr * PAGE_SIZE, buf);
 	}
 
+	if (ret == 0)
+		ret = complete(pid, vaddr, nr, priv);
+
 	return ret;
 }
diff --git a/criu/pagemap.c b/criu/pagemap.c
index 06264a1..8a2cce9 100644
--- a/criu/pagemap.c
+++ b/criu/pagemap.c
@@ -474,12 +474,8 @@ static int maybe_read_page_remote(struct page_read *pr, unsigned long vaddr,
 		return ret;
 	if (flags & PR_ASYNC)
 		return page_server_start_async_read(buf, nr, read_page_complete, pr);
-
-	ret = page_server_start_sync_read(buf, nr, &vaddr);
-	if (ret == 0 && pr->io_complete)
-		ret = pr->io_complete(pr, vaddr, nr);
-
-	return ret;
+	else
+		return page_server_start_sync_read(buf, nr, read_page_complete, pr);
 }
 
 static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, int nr,
-- 
2.1.4



More information about the CRIU mailing list