Commit 6d2b35ce authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

xfer: Change ->write_hole's type to flags

The ->write_hole and ->write_pagemap now look very much
alike, so let's merge them. This is preparatory patch
that makes holy type decision based on PE_FOO flags.
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Acked-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
parent d7105cce
...@@ -16,7 +16,7 @@ struct page_xfer { ...@@ -16,7 +16,7 @@ struct page_xfer {
/* 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 */
int (*write_hole)(struct page_xfer *self, struct iovec *iov, int type); int (*write_hole)(struct page_xfer *self, struct iovec *iov, u32 flags);
void (*close)(struct page_xfer *self); void (*close)(struct page_xfer *self);
/* private data for every page-xfer engine */ /* private data for every page-xfer engine */
......
...@@ -173,10 +173,21 @@ static int write_pages_to_server(struct page_xfer *xfer, ...@@ -173,10 +173,21 @@ static int write_pages_to_server(struct page_xfer *xfer,
return 0; return 0;
} }
static int write_hole_to_server(struct page_xfer *xfer, struct iovec *iov, static int write_hole_to_server(struct page_xfer *xfer, struct iovec *iov, u32 flags)
int type)
{ {
return send_iov(xfer->sk, type, xfer->dst_id, iov); u32 cmd = 0;
BUG_ON(flags & PE_PRESENT);
if (flags & PE_PARENT)
cmd = PS_IOV_HOLE;
else if (flags & PE_LAZY)
cmd = PS_IOV_LAZY;
else if (flags & PE_ZERO)
cmd = PS_IOV_ZERO;
else
BUG();
return send_iov(xfer->sk, cmd, xfer->dst_id, iov);
} }
static void close_server_xfer(struct page_xfer *xfer) static void close_server_xfer(struct page_xfer *xfer)
...@@ -303,16 +314,18 @@ static int check_pagehole_in_parent(struct page_read *p, struct iovec *iov) ...@@ -303,16 +314,18 @@ static int check_pagehole_in_parent(struct page_read *p, struct iovec *iov)
} }
} }
static int write_hole_loc(struct page_xfer *xfer, struct iovec *iov, int type) static int write_hole_loc(struct page_xfer *xfer, struct iovec *iov, u32 flags)
{ {
PagemapEntry pe = PAGEMAP_ENTRY__INIT; PagemapEntry pe = PAGEMAP_ENTRY__INIT;
BUG_ON(flags & PE_PRESENT);
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;
switch (type) { if (flags & PE_PARENT) {
case PS_IOV_HOLE:
if (xfer->parent != NULL) { if (xfer->parent != NULL) {
int ret; int ret;
...@@ -323,16 +336,6 @@ static int write_hole_loc(struct page_xfer *xfer, struct iovec *iov, int type) ...@@ -323,16 +336,6 @@ static int write_hole_loc(struct page_xfer *xfer, struct iovec *iov, int type)
return -1; return -1;
} }
} }
pe.flags |= PE_PARENT;
break;
case PS_IOV_ZERO:
pe.flags |= PE_ZERO;
break;
case PS_IOV_LAZY:
pe.flags |= PE_LAZY;
break;
default:
return -1;
} }
if (pb_write_one(xfer->pmi, &pe, PB_PAGEMAP) < 0) if (pb_write_one(xfer->pmi, &pe, PB_PAGEMAP) < 0)
...@@ -417,27 +420,27 @@ int open_page_xfer(struct page_xfer *xfer, int fd_type, long id) ...@@ -417,27 +420,27 @@ int open_page_xfer(struct page_xfer *xfer, int fd_type, long id)
} }
static int page_xfer_dump_hole(struct page_xfer *xfer, static int page_xfer_dump_hole(struct page_xfer *xfer,
struct iovec *hole, unsigned long off, int type) struct iovec *hole, unsigned long off, u32 flags)
{ {
BUG_ON(hole->iov_base < (void *)off); BUG_ON(hole->iov_base < (void *)off);
hole->iov_base -= off; hole->iov_base -= off;
pr_debug("\th %p [%u]\n", hole->iov_base, pr_debug("\th %p [%u]\n", hole->iov_base,
(unsigned int)(hole->iov_len / PAGE_SIZE)); (unsigned int)(hole->iov_len / PAGE_SIZE));
if (xfer->write_hole(xfer, hole, type)) if (xfer->write_hole(xfer, hole, flags))
return -1; return -1;
return 0; return 0;
} }
static int get_hole_type(struct page_pipe *pp, int n) static int get_hole_flags(struct page_pipe *pp, int n)
{ {
unsigned int hole_flags = pp->hole_flags[n]; unsigned int hole_flags = pp->hole_flags[n];
if (hole_flags == PP_HOLE_PARENT) if (hole_flags == PP_HOLE_PARENT)
return PS_IOV_HOLE; return PE_PARENT;
if (hole_flags == PP_HOLE_ZERO) if (hole_flags == PP_HOLE_ZERO)
return PS_IOV_ZERO; return PE_ZERO;
else else
BUG(); BUG();
...@@ -451,12 +454,13 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp, ...@@ -451,12 +454,13 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
for (; *cur_hole < pp->free_hole ; (*cur_hole)++) { for (; *cur_hole < pp->free_hole ; (*cur_hole)++) {
struct iovec hole = pp->holes[*cur_hole]; struct iovec hole = pp->holes[*cur_hole];
int hole_type = get_hole_type(pp, *cur_hole); u32 hole_flags;
if (limit && hole.iov_base >= limit) if (limit && hole.iov_base >= limit)
break; break;
ret = page_xfer_dump_hole(xfer, &hole, off, hole_type); hole_flags = get_hole_flags(pp, *cur_hole);
ret = page_xfer_dump_hole(xfer, &hole, off, hole_flags);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -493,8 +497,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp, ...@@ -493,8 +497,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
if (ppb->flags & PPB_LAZY) { if (ppb->flags & PPB_LAZY) {
if (!dump_lazy) { if (!dump_lazy) {
if (xfer->write_hole(xfer, &iov, if (xfer->write_hole(xfer, &iov, PE_LAZY))
PS_IOV_LAZY))
return -1; return -1;
continue; continue;
} else { } else {
...@@ -712,7 +715,7 @@ static int page_server_add(int sk, struct page_server_iov *pi) ...@@ -712,7 +715,7 @@ static int page_server_add(int sk, struct page_server_iov *pi)
return 0; return 0;
} }
static int page_server_hole(int sk, struct page_server_iov *pi) static int page_server_hole(int sk, struct page_server_iov *pi, u32 flags)
{ {
struct page_xfer *lxfer = &cxfer.loc_xfer; struct page_xfer *lxfer = &cxfer.loc_xfer;
struct iovec iov; struct iovec iov;
...@@ -723,7 +726,7 @@ static int page_server_hole(int sk, struct page_server_iov *pi) ...@@ -723,7 +726,7 @@ static int page_server_hole(int sk, struct page_server_iov *pi)
return -1; return -1;
psi2iovec(pi, &iov); psi2iovec(pi, &iov);
if (lxfer->write_hole(lxfer, &iov, pi->cmd)) if (lxfer->write_hole(lxfer, &iov, flags))
return -1; return -1;
return 0; return 0;
...@@ -827,9 +830,13 @@ static int page_server_serve(int sk) ...@@ -827,9 +830,13 @@ static int page_server_serve(int sk)
ret = page_server_add(sk, &pi); ret = page_server_add(sk, &pi);
break; break;
case PS_IOV_HOLE: case PS_IOV_HOLE:
ret = page_server_hole(sk, &pi, PE_PARENT);
break;
case PS_IOV_ZERO: case PS_IOV_ZERO:
ret = page_server_hole(sk, &pi, PE_ZERO);
break;
case PS_IOV_LAZY: case PS_IOV_LAZY:
ret = page_server_hole(sk, &pi); ret = page_server_hole(sk, &pi, PE_LAZY);
break; break;
case PS_IOV_FLUSH: case PS_IOV_FLUSH:
case PS_IOV_FLUSH_N_CLOSE: case PS_IOV_FLUSH_N_CLOSE:
......
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