[CRIU] [PATCH 06/13] page-xfer: Tune up send_psi to accept less args
Pavel Emelyanov
xemul at virtuozzo.com
Thu Jul 6 12:39:52 MSK 2017
The only thing it does is puts 4 values on the on-stack ps_iov,
let's avoid double stack copying and put the values on ps_iov
in callers.
Acked-by: Mike Rapoport <rppt at linux.vnet.ibm.com>
Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
criu/page-xfer.c | 45 ++++++++++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 19 deletions(-)
diff --git a/criu/page-xfer.c b/criu/page-xfer.c
index d8a7f9c..d2745e2 100644
--- a/criu/page-xfer.c
+++ b/criu/page-xfer.c
@@ -84,17 +84,10 @@ static inline u32 decode_ps_flags(u32 cmd)
return cmd >> PS_CMD_BITS;
}
-static inline int send_psi(int sk, u32 cmd, u32 nr_pages, u64 vaddr, u64 dst_id)
+static inline int send_psi(int sk, struct page_server_iov *pi)
{
- struct page_server_iov pi = {
- .cmd = cmd,
- .nr_pages = nr_pages,
- .vaddr = vaddr,
- .dst_id = dst_id,
- };
-
- if (write(sk, &pi, sizeof(pi)) != sizeof(pi)) {
- pr_perror("Can't write PSI %d to server", cmd);
+ if (write(sk, pi, sizeof(*pi)) != sizeof(*pi)) {
+ pr_perror("Can't write PSI %d to server", pi->cmd);
return -1;
}
@@ -117,9 +110,14 @@ static int write_pages_to_server(struct page_xfer *xfer,
static int write_pagemap_to_server(struct page_xfer *xfer, struct iovec *iov, u32 flags)
{
- return send_psi(xfer->sk, encode_ps_cmd(PS_IOV_ADD_F, flags),
- iov->iov_len / PAGE_SIZE, encode_pointer(iov->iov_base),
- xfer->dst_id);
+ struct page_server_iov pi = {
+ .cmd = encode_ps_cmd(PS_IOV_ADD_F, flags),
+ .nr_pages = iov->iov_len / PAGE_SIZE,
+ .vaddr = encode_pointer(iov->iov_base),
+ .dst_id = xfer->dst_id,
+ };
+
+ return send_psi(xfer->sk, &pi);
}
static void close_server_xfer(struct page_xfer *xfer)
@@ -130,6 +128,9 @@ static void close_server_xfer(struct page_xfer *xfer)
static int open_page_server_xfer(struct page_xfer *xfer, int fd_type, long id)
{
char has_parent;
+ struct page_server_iov pi = {
+ .cmd = PS_IOV_OPEN2,
+ };
xfer->sk = page_server_sk;
xfer->write_pagemap = write_pagemap_to_server;
@@ -138,7 +139,8 @@ static int open_page_server_xfer(struct page_xfer *xfer, int fd_type, long id)
xfer->dst_id = encode_pm_id(fd_type, id);
xfer->parent = NULL;
- if (send_psi(xfer->sk, PS_IOV_OPEN2, 0, 0, xfer->dst_id)) {
+ pi.dst_id = xfer->dst_id;
+ if (send_psi(xfer->sk, &pi)) {
pr_perror("Can't write to page server");
return -1;
}
@@ -665,18 +667,23 @@ static int page_server_get_pages(int sk, struct page_server_iov *pi)
if (ret)
return ret;
+ /*
+ * The pi is reused for send_psi here, so .nr_pages, .vaddr and
+ * .dst_id all remain intact.
+ */
+
if (pi->nr_pages == 0) {
/* no iovs found means we've hit a zero page */
pr_debug("no iovs found, zero pages\n");
- return send_psi(sk, encode_ps_cmd(PS_IOV_ADD_F, 0), 0, 0, 0);
+ pi->cmd = encode_ps_cmd(PS_IOV_ADD_F, 0);
+ return send_psi(sk, pi);
}
- len = pi->nr_pages * PAGE_SIZE;
-
- if (send_psi(sk, encode_ps_cmd(PS_IOV_ADD_F, PE_PRESENT),
- pi->nr_pages, pi->vaddr, pi->dst_id))
+ pi->cmd = encode_ps_cmd(PS_IOV_ADD_F, PE_PRESENT);
+ if (send_psi(sk, pi))
return -1;
+ len = pi->nr_pages * PAGE_SIZE;
ret = splice(pipe_read_dest.p[0], NULL, sk, NULL, len, SPLICE_F_MOVE);
if (ret != len)
return -1;
--
2.1.4
More information about the CRIU
mailing list