[4/6] criu: page-xfer: add ability to write pagemap flags

Submitted by Mike Rapoport on Sept. 8, 2016, 7:39 a.m.

Details

Message ID 1473320352-28669-5-git-send-email-rppt@linux.vnet.ibm.com
State Rejected
Series "criu: pagemap: improve accuracy of lazy pages"
Headers show

Commit Message

Mike Rapoport Sept. 8, 2016, 7:39 a.m.
Signed-off-by: Mike Rapoport <rppt@linux.vnet.ibm.com>
---
 criu/include/page-xfer.h |  2 +-
 criu/page-xfer.c         | 40 ++++++++++++++++++++++++++++++++--------
 2 files changed, 33 insertions(+), 9 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/include/page-xfer.h b/criu/include/page-xfer.h
index 007733e..bf4900f 100644
--- a/criu/include/page-xfer.h
+++ b/criu/include/page-xfer.h
@@ -12,7 +12,7 @@  extern int cr_page_server(bool daemon_mode, int cfd);
 
 struct page_xfer {
 	/* transfers one vaddr:len entry */
-	int (*write_pagemap)(struct page_xfer *self, struct iovec *iov);
+	int (*write_pagemap)(struct page_xfer *self, struct iovec *iov, u32 flags);
 	/* transfers pages related to previous pagemap */
 	int (*write_pages)(struct page_xfer *self, int pipe, unsigned long len);
 	/* transfers one hole -- vaddr:len entry w/o pages */
diff --git a/criu/page-xfer.c b/criu/page-xfer.c
index a02ca3b..68dba86 100644
--- a/criu/page-xfer.c
+++ b/criu/page-xfer.c
@@ -46,6 +46,9 @@  static void psi2iovec(struct page_server_iov *ps, struct iovec *iov)
 #define PS_IOV_FLUSH		0x1023
 #define PS_IOV_FLUSH_N_CLOSE	0x1024
 
+#define PS_CMD_BITS	16
+#define PS_CMD_MASK	((1 << PS_CMD_BITS) - 1)
+
 #define PS_TYPE_BITS	8
 #define PS_TYPE_MASK	((1 << PS_TYPE_BITS) - 1)
 
@@ -64,6 +67,21 @@  static long decode_pm_id(u64 dst_id)
 	return (long)(dst_id >> PS_TYPE_BITS);
 }
 
+static inline u32 encode_ps_cmd(u32 cmd, u32 flags)
+{
+	return flags << PS_CMD_BITS | cmd;
+}
+
+static inline u32 decode_ps_cmd(u32 cmd)
+{
+	return cmd & PS_CMD_MASK;
+}
+
+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)
 {
 	struct page_server_iov pi = {
@@ -90,10 +108,11 @@  static inline int send_iov(int sk, u32 cmd, u64 dst_id, struct iovec *iov)
 }
 
 /* page-server xfer */
-static int write_pagemap_to_server(struct page_xfer *xfer,
-		struct iovec *iov)
+static int write_pagemap_to_server(struct page_xfer *xfer, struct iovec *iov,
+				   u32 flags)
 {
-	return send_iov(xfer->sk, PS_IOV_ADD, xfer->dst_id, iov);
+	return send_iov(xfer->sk, encode_ps_cmd(PS_IOV_ADD, flags),
+			xfer->dst_id, iov);
 }
 
 static int write_pages_to_server(struct page_xfer *xfer,
@@ -152,14 +171,15 @@  static int open_page_server_xfer(struct page_xfer *xfer, int fd_type, long id)
 }
 
 /* local xfer */
-static int write_pagemap_loc(struct page_xfer *xfer,
-		struct iovec *iov)
+static int write_pagemap_loc(struct page_xfer *xfer, struct iovec *iov,
+			     u32 flags)
 {
 	int ret;
 	PagemapEntry pe = PAGEMAP_ENTRY__INIT;
 
 	iovec2pagemap(iov, &pe);
 	pe.has_flags = true;
+	pe.flags = flags;
 	if (opts.auto_dedup && xfer->parent != NULL) {
 		ret = dedup_one_iovec(xfer->parent, iov);
 		if (ret == -1) {
@@ -436,7 +456,7 @@  int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
 				continue;
 			}
 
-			if (xfer->write_pagemap(xfer, &iov))
+			if (xfer->write_pagemap(xfer, &iov, 0))
 				return -1;
 			if (xfer->write_pages(xfer, ppb->p[0], iov.iov_len))
 				return -1;
@@ -586,6 +606,7 @@  static int page_server_add(int sk, struct page_server_iov *pi)
 	size_t len;
 	struct page_xfer *lxfer = &cxfer.loc_xfer;
 	struct iovec iov;
+	u32 flags;
 
 	pr_debug("Adding %"PRIx64"/%u\n", pi->vaddr, pi->nr_pages);
 
@@ -593,7 +614,8 @@  static int page_server_add(int sk, struct page_server_iov *pi)
 		return -1;
 
 	psi2iovec(pi, &iov);
-	if (lxfer->write_pagemap(lxfer, &iov))
+	flags = decode_ps_flags(pi->cmd);
+	if (lxfer->write_pagemap(lxfer, &iov, flags))
 		return -1;
 
 	len = iov.iov_len;
@@ -705,6 +727,7 @@  static int page_server_serve(int sk)
 
 	while (1) {
 		struct page_server_iov pi;
+		u32 cmd;
 
 		ret = recv(sk, &pi, sizeof(pi), MSG_WAITALL);
 		if (!ret)
@@ -717,8 +740,9 @@  static int page_server_serve(int sk)
 		}
 
 		flushed = false;
+		cmd = decode_ps_cmd(pi.cmd);
 
-		switch (pi.cmd) {
+		switch (cmd) {
 		case PS_IOV_OPEN:
 			ret = page_server_open(-1, &pi);
 			break;

Comments

Pavel Emelianov Sept. 13, 2016, 3:26 p.m.
Can you add some patch comment saying what the need for "flags" is?

On 09/08/2016 10:39 AM, Mike Rapoport wrote:
> Signed-off-by: Mike Rapoport <rppt@linux.vnet.ibm.com>
> ---
>  criu/include/page-xfer.h |  2 +-
>  criu/page-xfer.c         | 40 ++++++++++++++++++++++++++++++++--------
>  2 files changed, 33 insertions(+), 9 deletions(-)
> 
> diff --git a/criu/include/page-xfer.h b/criu/include/page-xfer.h
> index 007733e..bf4900f 100644
> --- a/criu/include/page-xfer.h
> +++ b/criu/include/page-xfer.h
> @@ -12,7 +12,7 @@ extern int cr_page_server(bool daemon_mode, int cfd);
>  
>  struct page_xfer {
>  	/* transfers one vaddr:len entry */
> -	int (*write_pagemap)(struct page_xfer *self, struct iovec *iov);
> +	int (*write_pagemap)(struct page_xfer *self, struct iovec *iov, u32 flags);
>  	/* transfers pages related to previous pagemap */
>  	int (*write_pages)(struct page_xfer *self, int pipe, unsigned long len);
>  	/* transfers one hole -- vaddr:len entry w/o pages */
> diff --git a/criu/page-xfer.c b/criu/page-xfer.c
> index a02ca3b..68dba86 100644
> --- a/criu/page-xfer.c
> +++ b/criu/page-xfer.c
> @@ -46,6 +46,9 @@ static void psi2iovec(struct page_server_iov *ps, struct iovec *iov)
>  #define PS_IOV_FLUSH		0x1023
>  #define PS_IOV_FLUSH_N_CLOSE	0x1024
>  
> +#define PS_CMD_BITS	16
> +#define PS_CMD_MASK	((1 << PS_CMD_BITS) - 1)
> +
>  #define PS_TYPE_BITS	8
>  #define PS_TYPE_MASK	((1 << PS_TYPE_BITS) - 1)
>  
> @@ -64,6 +67,21 @@ static long decode_pm_id(u64 dst_id)
>  	return (long)(dst_id >> PS_TYPE_BITS);
>  }
>  
> +static inline u32 encode_ps_cmd(u32 cmd, u32 flags)
> +{
> +	return flags << PS_CMD_BITS | cmd;
> +}
> +
> +static inline u32 decode_ps_cmd(u32 cmd)
> +{
> +	return cmd & PS_CMD_MASK;
> +}
> +
> +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)
>  {
>  	struct page_server_iov pi = {
> @@ -90,10 +108,11 @@ static inline int send_iov(int sk, u32 cmd, u64 dst_id, struct iovec *iov)
>  }
>  
>  /* page-server xfer */
> -static int write_pagemap_to_server(struct page_xfer *xfer,
> -		struct iovec *iov)
> +static int write_pagemap_to_server(struct page_xfer *xfer, struct iovec *iov,
> +				   u32 flags)
>  {
> -	return send_iov(xfer->sk, PS_IOV_ADD, xfer->dst_id, iov);
> +	return send_iov(xfer->sk, encode_ps_cmd(PS_IOV_ADD, flags),
> +			xfer->dst_id, iov);
>  }
>  
>  static int write_pages_to_server(struct page_xfer *xfer,
> @@ -152,14 +171,15 @@ static int open_page_server_xfer(struct page_xfer *xfer, int fd_type, long id)
>  }
>  
>  /* local xfer */
> -static int write_pagemap_loc(struct page_xfer *xfer,
> -		struct iovec *iov)
> +static int write_pagemap_loc(struct page_xfer *xfer, struct iovec *iov,
> +			     u32 flags)
>  {
>  	int ret;
>  	PagemapEntry pe = PAGEMAP_ENTRY__INIT;
>  
>  	iovec2pagemap(iov, &pe);
>  	pe.has_flags = true;
> +	pe.flags = flags;
>  	if (opts.auto_dedup && xfer->parent != NULL) {
>  		ret = dedup_one_iovec(xfer->parent, iov);
>  		if (ret == -1) {
> @@ -436,7 +456,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
>  				continue;
>  			}
>  
> -			if (xfer->write_pagemap(xfer, &iov))
> +			if (xfer->write_pagemap(xfer, &iov, 0))
>  				return -1;
>  			if (xfer->write_pages(xfer, ppb->p[0], iov.iov_len))
>  				return -1;
> @@ -586,6 +606,7 @@ static int page_server_add(int sk, struct page_server_iov *pi)
>  	size_t len;
>  	struct page_xfer *lxfer = &cxfer.loc_xfer;
>  	struct iovec iov;
> +	u32 flags;
>  
>  	pr_debug("Adding %"PRIx64"/%u\n", pi->vaddr, pi->nr_pages);
>  
> @@ -593,7 +614,8 @@ static int page_server_add(int sk, struct page_server_iov *pi)
>  		return -1;
>  
>  	psi2iovec(pi, &iov);
> -	if (lxfer->write_pagemap(lxfer, &iov))
> +	flags = decode_ps_flags(pi->cmd);
> +	if (lxfer->write_pagemap(lxfer, &iov, flags))
>  		return -1;
>  
>  	len = iov.iov_len;
> @@ -705,6 +727,7 @@ static int page_server_serve(int sk)
>  
>  	while (1) {
>  		struct page_server_iov pi;
> +		u32 cmd;
>  
>  		ret = recv(sk, &pi, sizeof(pi), MSG_WAITALL);
>  		if (!ret)
> @@ -717,8 +740,9 @@ static int page_server_serve(int sk)
>  		}
>  
>  		flushed = false;
> +		cmd = decode_ps_cmd(pi.cmd);
>  
> -		switch (pi.cmd) {
> +		switch (cmd) {
>  		case PS_IOV_OPEN:
>  			ret = page_server_open(-1, &pi);
>  			break;
>