Commit d5095c00 authored by Mike Rapoport's avatar Mike Rapoport Committed by Pavel Emelyanov

criu: page-xfer: intorduce helpers for sending IOVs

Signed-off-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent afa9d8df
...@@ -32,12 +32,6 @@ static void psi2iovec(struct page_server_iov *ps, struct iovec *iov) ...@@ -32,12 +32,6 @@ static void psi2iovec(struct page_server_iov *ps, struct iovec *iov)
iov->iov_len = ps->nr_pages * PAGE_SIZE; iov->iov_len = ps->nr_pages * PAGE_SIZE;
} }
static void iovec2psi(struct iovec *iov, struct page_server_iov *ps)
{
ps->vaddr = encode_pointer(iov->iov_base);
ps->nr_pages = iov->iov_len / PAGE_SIZE;
}
#define PS_IOV_ADD 1 #define PS_IOV_ADD 1
#define PS_IOV_HOLE 2 #define PS_IOV_HOLE 2
#define PS_IOV_OPEN 3 #define PS_IOV_OPEN 3
...@@ -65,24 +59,38 @@ static long decode_pm_id(u64 dst_id) ...@@ -65,24 +59,38 @@ static long decode_pm_id(u64 dst_id)
return (long)(dst_id >> PS_TYPE_BITS); return (long)(dst_id >> PS_TYPE_BITS);
} }
/* page-server xfer */ static inline int send_psi(int sk, u32 cmd, u32 nr_pages, u64 vaddr, u64 dst_id)
static int write_pagemap_to_server(struct page_xfer *xfer,
struct iovec *iov)
{ {
struct page_server_iov pi; struct page_server_iov pi = {
.cmd = cmd,
pi.cmd = PS_IOV_ADD; .nr_pages = nr_pages,
pi.dst_id = xfer->dst_id; .vaddr = vaddr,
iovec2psi(iov, &pi); .dst_id = dst_id,
};
if (write(xfer->sk, &pi, sizeof(pi)) != sizeof(pi)) {
pr_perror("Can't write pagemap to server"); if (write(sk, &pi, sizeof(pi)) != sizeof(pi)) {
pr_perror("Can't write PSI %d to server", cmd);
return -1; return -1;
} }
return 0; return 0;
} }
static inline int send_iov(int sk, u32 cmd, u64 dst_id, struct iovec *iov)
{
u64 vaddr = encode_pointer(iov->iov_base);
u32 nr_pages = iov->iov_len / PAGE_SIZE;
return send_psi(sk, cmd, nr_pages, vaddr, dst_id);
}
/* page-server xfer */
static int write_pagemap_to_server(struct page_xfer *xfer,
struct iovec *iov)
{
return send_iov(xfer->sk, PS_IOV_ADD, xfer->dst_id, iov);
}
static int write_pages_to_server(struct page_xfer *xfer, static int write_pages_to_server(struct page_xfer *xfer,
int p, unsigned long len) int p, unsigned long len)
{ {
...@@ -98,18 +106,7 @@ static int write_pages_to_server(struct page_xfer *xfer, ...@@ -98,18 +106,7 @@ 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)
{ {
struct page_server_iov pi; return send_iov(xfer->sk, PS_IOV_HOLE, xfer->dst_id, iov);
pi.cmd = PS_IOV_HOLE;
pi.dst_id = xfer->dst_id;
iovec2psi(iov, &pi);
if (write(xfer->sk, &pi, sizeof(pi)) != sizeof(pi)) {
pr_perror("Can't write pagehole to server");
return -1;
}
return 0;
} }
static void close_server_xfer(struct page_xfer *xfer) static void close_server_xfer(struct page_xfer *xfer)
...@@ -119,7 +116,6 @@ static void close_server_xfer(struct page_xfer *xfer) ...@@ -119,7 +116,6 @@ static void close_server_xfer(struct page_xfer *xfer)
static int open_page_server_xfer(struct page_xfer *xfer, int fd_type, long id) static int open_page_server_xfer(struct page_xfer *xfer, int fd_type, long id)
{ {
struct page_server_iov pi;
char has_parent; char has_parent;
xfer->sk = page_server_sk; xfer->sk = page_server_sk;
...@@ -130,12 +126,7 @@ static int open_page_server_xfer(struct page_xfer *xfer, int fd_type, long id) ...@@ -130,12 +126,7 @@ 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->dst_id = encode_pm_id(fd_type, id);
xfer->parent = NULL; xfer->parent = NULL;
pi.cmd = PS_IOV_OPEN2; if (send_psi(xfer->sk, PS_IOV_OPEN2, 0, 0, xfer->dst_id)) {
pi.dst_id = xfer->dst_id;
pi.vaddr = 0;
pi.nr_pages = 0;
if (write(xfer->sk, &pi, sizeof(pi)) != sizeof(pi)) {
pr_perror("Can't write to page server"); pr_perror("Can't write to page server");
return -1; return -1;
} }
......
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