Commit ea99b700 authored by Mike Rapoport's avatar Mike Rapoport Committed by Andrei Vagin

criu: page-xfer: add ability to write pagemap flags

With 'zero' and 'lazy' booleans replaced by the flags field in
PagemapEntry, it is required that page-xfer will be aware of the change.
Signed-off-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 9bc9fcb0
...@@ -12,7 +12,7 @@ extern int cr_page_server(bool daemon_mode, int cfd); ...@@ -12,7 +12,7 @@ extern int cr_page_server(bool daemon_mode, int cfd);
struct page_xfer { struct page_xfer {
/* transfers one vaddr:len entry */ /* 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 */ /* transfers pages related to previous pagemap */
int (*write_pages)(struct page_xfer *self, int pipe, unsigned long len); int (*write_pages)(struct page_xfer *self, int pipe, unsigned long len);
/* transfers one hole -- vaddr:len entry w/o pages */ /* transfers one hole -- vaddr:len entry w/o pages */
......
...@@ -47,6 +47,9 @@ static void psi2iovec(struct page_server_iov *ps, struct iovec *iov) ...@@ -47,6 +47,9 @@ static void psi2iovec(struct page_server_iov *ps, struct iovec *iov)
#define PS_IOV_FLUSH 0x1023 #define PS_IOV_FLUSH 0x1023
#define PS_IOV_FLUSH_N_CLOSE 0x1024 #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_BITS 8
#define PS_TYPE_MASK ((1 << PS_TYPE_BITS) - 1) #define PS_TYPE_MASK ((1 << PS_TYPE_BITS) - 1)
...@@ -109,6 +112,21 @@ static int decode_pm(u64 dst_id, long *id) ...@@ -109,6 +112,21 @@ static int decode_pm(u64 dst_id, long *id)
return type; return type;
} }
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) static inline int send_psi(int sk, u32 cmd, u32 nr_pages, u64 vaddr, u64 dst_id)
{ {
struct page_server_iov pi = { struct page_server_iov pi = {
...@@ -135,10 +153,11 @@ static inline int send_iov(int sk, u32 cmd, u64 dst_id, struct iovec *iov) ...@@ -135,10 +153,11 @@ static inline int send_iov(int sk, u32 cmd, u64 dst_id, struct iovec *iov)
} }
/* page-server xfer */ /* page-server xfer */
static int write_pagemap_to_server(struct page_xfer *xfer, static int write_pagemap_to_server(struct page_xfer *xfer, struct iovec *iov,
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, static int write_pages_to_server(struct page_xfer *xfer,
...@@ -197,8 +216,8 @@ static int open_page_server_xfer(struct page_xfer *xfer, int fd_type, long id) ...@@ -197,8 +216,8 @@ static int open_page_server_xfer(struct page_xfer *xfer, int fd_type, long id)
} }
/* local xfer */ /* local xfer */
static int write_pagemap_loc(struct page_xfer *xfer, static int write_pagemap_loc(struct page_xfer *xfer, struct iovec *iov,
struct iovec *iov) u32 flags)
{ {
int ret; int ret;
PagemapEntry pe = PAGEMAP_ENTRY__INIT; PagemapEntry pe = PAGEMAP_ENTRY__INIT;
...@@ -206,6 +225,7 @@ static int write_pagemap_loc(struct page_xfer *xfer, ...@@ -206,6 +225,7 @@ static int write_pagemap_loc(struct page_xfer *xfer,
pe.vaddr = encode_pointer(iov->iov_base); pe.vaddr = encode_pointer(iov->iov_base);
pe.nr_pages = iov->iov_len / PAGE_SIZE; pe.nr_pages = iov->iov_len / PAGE_SIZE;
pe.has_flags = true; pe.has_flags = true;
pe.flags = flags;
if (opts.auto_dedup && xfer->parent != NULL) { if (opts.auto_dedup && xfer->parent != NULL) {
ret = dedup_one_iovec(xfer->parent, pe.vaddr, ret = dedup_one_iovec(xfer->parent, pe.vaddr,
pagemap_len(&pe)); pagemap_len(&pe));
...@@ -476,7 +496,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp, ...@@ -476,7 +496,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
continue; continue;
} }
if (xfer->write_pagemap(xfer, &iov)) if (xfer->write_pagemap(xfer, &iov, 0))
return -1; return -1;
if (xfer->write_pages(xfer, ppb->p[0], iov.iov_len)) if (xfer->write_pages(xfer, ppb->p[0], iov.iov_len))
return -1; return -1;
...@@ -633,6 +653,7 @@ static int page_server_add(int sk, struct page_server_iov *pi) ...@@ -633,6 +653,7 @@ static int page_server_add(int sk, struct page_server_iov *pi)
size_t len; size_t len;
struct page_xfer *lxfer = &cxfer.loc_xfer; struct page_xfer *lxfer = &cxfer.loc_xfer;
struct iovec iov; struct iovec iov;
u32 flags;
pr_debug("Adding %"PRIx64"/%u\n", pi->vaddr, pi->nr_pages); pr_debug("Adding %"PRIx64"/%u\n", pi->vaddr, pi->nr_pages);
...@@ -640,7 +661,8 @@ static int page_server_add(int sk, struct page_server_iov *pi) ...@@ -640,7 +661,8 @@ static int page_server_add(int sk, struct page_server_iov *pi)
return -1; return -1;
psi2iovec(pi, &iov); psi2iovec(pi, &iov);
if (lxfer->write_pagemap(lxfer, &iov)) flags = decode_ps_flags(pi->cmd);
if (lxfer->write_pagemap(lxfer, &iov, flags))
return -1; return -1;
len = iov.iov_len; len = iov.iov_len;
...@@ -770,6 +792,7 @@ static int page_server_serve(int sk) ...@@ -770,6 +792,7 @@ static int page_server_serve(int sk)
while (1) { while (1) {
struct page_server_iov pi; struct page_server_iov pi;
u32 cmd;
ret = recv(sk, &pi, sizeof(pi), MSG_WAITALL); ret = recv(sk, &pi, sizeof(pi), MSG_WAITALL);
if (!ret) if (!ret)
...@@ -782,8 +805,9 @@ static int page_server_serve(int sk) ...@@ -782,8 +805,9 @@ static int page_server_serve(int sk)
} }
flushed = false; flushed = false;
cmd = decode_ps_cmd(pi.cmd);
switch (pi.cmd) { switch (cmd) {
case PS_IOV_OPEN: case PS_IOV_OPEN:
ret = page_server_open(-1, &pi); ret = page_server_open(-1, &pi);
break; break;
......
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