Commit 1abb8782 authored by Pavel Emelyanov's avatar Pavel Emelyanov

page-server: Implement holes writing into pagemap

Just add new protocol command and call local_xfer->write_hole on
server side. Also tune the mem-snap test to test memory xfer via
page server.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent c2c8d81d
...@@ -18,6 +18,7 @@ struct page_server_iov { ...@@ -18,6 +18,7 @@ struct page_server_iov {
}; };
#define PS_IOV_ADD 1 #define PS_IOV_ADD 1
#define PS_IOV_HOLE 2
#define PS_TYPE_BITS 4 #define PS_TYPE_BITS 4
#define PS_TYPE_MASK ((1 << PS_TYPE_BITS) - 1) #define PS_TYPE_MASK ((1 << PS_TYPE_BITS) - 1)
...@@ -48,14 +49,8 @@ static struct page_xfer_job cxfer = { ...@@ -48,14 +49,8 @@ static struct page_xfer_job cxfer = {
.dst_id = ~0, .dst_id = ~0,
}; };
static int page_server_add(int sk, struct page_server_iov *pi) static int prep_loc_xfer(struct page_server_iov *pi)
{ {
size_t len;
struct page_xfer *lxfer = &cxfer.loc_xfer;
struct iovec iov;
pr_debug("Adding %"PRIx64"/%u\n", pi->vaddr, pi->nr_pages);
if (cxfer.dst_id != pi->dst_id) { if (cxfer.dst_id != pi->dst_id) {
if (cxfer.dst_id != ~0) if (cxfer.dst_id != ~0)
cxfer.loc_xfer.close(&cxfer.loc_xfer); cxfer.loc_xfer.close(&cxfer.loc_xfer);
...@@ -68,6 +63,20 @@ static int page_server_add(int sk, struct page_server_iov *pi) ...@@ -68,6 +63,20 @@ static int page_server_add(int sk, struct page_server_iov *pi)
cxfer.dst_id = pi->dst_id; cxfer.dst_id = pi->dst_id;
} }
return 0;
}
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;
pr_debug("Adding %"PRIx64"/%u\n", pi->vaddr, pi->nr_pages);
if (prep_loc_xfer(pi))
return -1;
iov.iov_base = decode_pointer(pi->vaddr); iov.iov_base = decode_pointer(pi->vaddr);
iov.iov_len = pi->nr_pages * PAGE_SIZE; iov.iov_len = pi->nr_pages * PAGE_SIZE;
...@@ -97,6 +106,25 @@ static int page_server_add(int sk, struct page_server_iov *pi) ...@@ -97,6 +106,25 @@ 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)
{
struct page_xfer *lxfer = &cxfer.loc_xfer;
struct iovec iov;
pr_debug("Adding %"PRIx64"/%u hole\n", pi->vaddr, pi->nr_pages);
if (prep_loc_xfer(pi))
return -1;
iov.iov_base = decode_pointer(pi->vaddr);
iov.iov_len = pi->nr_pages * PAGE_SIZE;
if (lxfer->write_hole(lxfer, &iov))
return -1;
return 0;
}
static int page_server_serve(int sk) static int page_server_serve(int sk)
{ {
int ret = -1; int ret = -1;
...@@ -127,6 +155,9 @@ static int page_server_serve(int sk) ...@@ -127,6 +155,9 @@ static int page_server_serve(int sk)
case PS_IOV_ADD: case PS_IOV_ADD:
ret = page_server_add(sk, &pi); ret = page_server_add(sk, &pi);
break; break;
case PS_IOV_HOLE:
ret = page_server_hole(sk, &pi);
break;
default: default:
pr_err("Unknown command %u\n", pi.cmd); pr_err("Unknown command %u\n", pi.cmd);
ret = -1; ret = -1;
...@@ -248,8 +279,19 @@ static int write_pages_to_server(struct page_xfer *xfer, ...@@ -248,8 +279,19 @@ static int write_pages_to_server(struct page_xfer *xfer,
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)
{ {
pr_err("Writing holes to server not implemented.\n"); struct page_server_iov pi;
pi.cmd = PS_IOV_HOLE;
pi.dst_id = xfer->dst_id;
pi.vaddr = encode_pointer(iov->iov_base);
pi.nr_pages = iov->iov_len / PAGE_SIZE;
if (write(xfer->fd, &pi, sizeof(pi)) != sizeof(pi)) {
pr_perror("Can't write pagehole to server\n");
return -1; return -1;
}
return 0;
} }
static void close_server_xfer(struct page_xfer *xfer) static void close_server_xfer(struct page_xfer *xfer)
......
#!/bin/bash #!/bin/bash
USEPS=0
if [ "$1" = "-s" ]; then
echo "Will test via page-server"
USEPS=1
shift
fi
NRSNAP=${1:-3} NRSNAP=${1:-3}
SPAUSE=${2:-4} SPAUSE=${2:-4}
PORT=12345
function fail { function fail {
echo "$@" echo "$@"
...@@ -40,7 +49,18 @@ for SNAP in $(seq 1 $NRSNAP); do ...@@ -40,7 +49,18 @@ for SNAP in $(seq 1 $NRSNAP); do
args="--snapshot=../$((SNAP - 1))/ -R" args="--snapshot=../$((SNAP - 1))/ -R"
fi fi
${CRTOOLS} dump -D "${IMGDIR}/$SNAP/" -o dump.log -t ${PID} -v 4 $args || fail "Fail to dump" if [ $USEPS -eq 1 ]; then
${CRTOOLS} page-server -D "${IMGDIR}/$SNAP/" -o ps.log --port ${PORT} -v 4 &
PS_PID=$!
ps_args="--page-server --address 127.0.0.1 --port=${PORT}"
else
ps_args=""
fi
${CRTOOLS} dump -D "${IMGDIR}/$SNAP/" -o dump.log -t ${PID} -v 4 $args $ps_args || fail "Fail to dump"
if [ $USEPS -eq 1 ]; then
wait $PS_PID
fi
done done
echo "Restoring" echo "Restoring"
......
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