Commit 121f07a7 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

page-xfer: Move iov offset on xfer

The offset in question is used by shmem dumping code to dump
memory segments relative to shmem segment start, no to task
mapping start. The offset value is now the part of the xfer
callback and is typically 0 :) Let's keep this on xfer object
to simplify the xfer API.
Acked-by: 's avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent efbf59dd
...@@ -1491,7 +1491,7 @@ static int cr_pre_dump_finish(int ret) ...@@ -1491,7 +1491,7 @@ static int cr_pre_dump_finish(int ret)
goto err; goto err;
mem_pp = dmpi(item)->mem_pp; mem_pp = dmpi(item)->mem_pp;
ret = page_xfer_dump_pages(&xfer, mem_pp, 0, true); ret = page_xfer_dump_pages(&xfer, mem_pp, true);
xfer.close(&xfer); xfer.close(&xfer);
......
...@@ -17,6 +17,12 @@ struct page_xfer { ...@@ -17,6 +17,12 @@ struct page_xfer {
int (*write_pages)(struct page_xfer *self, int pipe, unsigned long len); int (*write_pages)(struct page_xfer *self, int pipe, unsigned long len);
void (*close)(struct page_xfer *self); void (*close)(struct page_xfer *self);
/*
* In case we need to dump pagemaps not as-is, but
* relative to some address. Used, e.g. by shmem.
*/
unsigned long offset;
/* private data for every page-xfer engine */ /* private data for every page-xfer engine */
union { union {
struct /* local */ { struct /* local */ {
...@@ -35,8 +41,7 @@ struct page_xfer { ...@@ -35,8 +41,7 @@ struct page_xfer {
extern int open_page_xfer(struct page_xfer *xfer, int fd_type, long id); extern int open_page_xfer(struct page_xfer *xfer, int fd_type, long id);
struct page_pipe; struct page_pipe;
extern int page_xfer_dump_pages(struct page_xfer *, struct page_pipe *, extern int page_xfer_dump_pages(struct page_xfer *, struct page_pipe *, bool dump_lazy);
unsigned long off, bool dump_lazy);
extern int connect_to_page_server_to_send(void); extern int connect_to_page_server_to_send(void);
extern int connect_to_page_server_to_recv(int epfd); extern int connect_to_page_server_to_recv(int epfd);
extern int disconnect_from_page_server(void); extern int disconnect_from_page_server(void);
......
...@@ -284,7 +284,7 @@ static int xfer_pages(struct page_pipe *pp, struct page_xfer *xfer, bool lazy) ...@@ -284,7 +284,7 @@ static int xfer_pages(struct page_pipe *pp, struct page_xfer *xfer, bool lazy)
* pre-dump action (see pre_dump_one_task) * pre-dump action (see pre_dump_one_task)
*/ */
timing_start(TIME_MEMWRITE); timing_start(TIME_MEMWRITE);
ret = page_xfer_dump_pages(xfer, pp, 0, !lazy); ret = page_xfer_dump_pages(xfer, pp, !lazy);
timing_stop(TIME_MEMWRITE); timing_stop(TIME_MEMWRITE);
return ret; return ret;
......
...@@ -378,6 +378,8 @@ out: ...@@ -378,6 +378,8 @@ out:
int open_page_xfer(struct page_xfer *xfer, int fd_type, long id) int open_page_xfer(struct page_xfer *xfer, int fd_type, long id)
{ {
xfer->offset = 0;
if (opts.use_page_server) if (opts.use_page_server)
return open_page_server_xfer(xfer, fd_type, id); return open_page_server_xfer(xfer, fd_type, id);
else else
...@@ -385,10 +387,10 @@ int open_page_xfer(struct page_xfer *xfer, int fd_type, long id) ...@@ -385,10 +387,10 @@ 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, u32 flags) struct iovec *hole, u32 flags)
{ {
BUG_ON(hole->iov_base < (void *)off); BUG_ON(hole->iov_base < (void *)xfer->offset);
hole->iov_base -= off; hole->iov_base -= xfer->offset;
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));
...@@ -411,7 +413,7 @@ static int get_hole_flags(struct page_pipe *pp, int n) ...@@ -411,7 +413,7 @@ static int get_hole_flags(struct page_pipe *pp, int n)
} }
static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp, static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
unsigned int *cur_hole, void *limit, unsigned long off) unsigned int *cur_hole, void *limit)
{ {
int ret; int ret;
...@@ -423,7 +425,7 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp, ...@@ -423,7 +425,7 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
break; break;
hole_flags = get_hole_flags(pp, *cur_hole); hole_flags = get_hole_flags(pp, *cur_hole);
ret = page_xfer_dump_hole(xfer, &hole, off, hole_flags); ret = page_xfer_dump_hole(xfer, &hole, hole_flags);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -432,7 +434,7 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp, ...@@ -432,7 +434,7 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
} }
int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp, int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
unsigned long off, bool dump_lazy) bool dump_lazy)
{ {
struct page_pipe_buf *ppb; struct page_pipe_buf *ppb;
unsigned int cur_hole = 0; unsigned int cur_hole = 0;
...@@ -449,12 +451,12 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp, ...@@ -449,12 +451,12 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
struct iovec iov = ppb->iov[i]; struct iovec iov = ppb->iov[i];
u32 flags = PE_PRESENT; u32 flags = PE_PRESENT;
ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base, off); ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base);
if (ret) if (ret)
return ret; return ret;
BUG_ON(iov.iov_base < (void *)off); BUG_ON(iov.iov_base < (void *)xfer->offset);
iov.iov_base -= off; iov.iov_base -= xfer->offset;
pr_debug("\tp %p [%u]\n", iov.iov_base, pr_debug("\tp %p [%u]\n", iov.iov_base,
(unsigned int)(iov.iov_len / PAGE_SIZE)); (unsigned int)(iov.iov_len / PAGE_SIZE));
...@@ -475,7 +477,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp, ...@@ -475,7 +477,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
} }
} }
return dump_holes(xfer, pp, &cur_hole, NULL, off); return dump_holes(xfer, pp, &cur_hole, NULL);
} }
/* /*
......
...@@ -628,7 +628,7 @@ int add_shmem_area(pid_t pid, VmaEntry *vma, u64 *map) ...@@ -628,7 +628,7 @@ int add_shmem_area(pid_t pid, VmaEntry *vma, u64 *map)
return 0; return 0;
} }
static int dump_pages(struct page_pipe *pp, struct page_xfer *xfer, void *addr) static int dump_pages(struct page_pipe *pp, struct page_xfer *xfer)
{ {
struct page_pipe_buf *ppb; struct page_pipe_buf *ppb;
...@@ -640,7 +640,7 @@ static int dump_pages(struct page_pipe *pp, struct page_xfer *xfer, void *addr) ...@@ -640,7 +640,7 @@ static int dump_pages(struct page_pipe *pp, struct page_xfer *xfer, void *addr)
return -1; return -1;
} }
return page_xfer_dump_pages(xfer, pp, (unsigned long)addr, true); return page_xfer_dump_pages(xfer, pp, true);
} }
static int next_data_segment(int fd, unsigned long pfn, static int next_data_segment(int fd, unsigned long pfn,
...@@ -687,6 +687,8 @@ static int do_dump_one_shmem(int fd, void *addr, struct shmem_info *si) ...@@ -687,6 +687,8 @@ static int do_dump_one_shmem(int fd, void *addr, struct shmem_info *si)
if (err) if (err)
goto err_pp; goto err_pp;
xfer.offset = (unsigned long)addr;
for (pfn = 0; pfn < nrpages; pfn++) { for (pfn = 0; pfn < nrpages; pfn++) {
unsigned int pgstate = PST_DIRTY; unsigned int pgstate = PST_DIRTY;
bool use_mc = true; bool use_mc = true;
...@@ -718,7 +720,7 @@ again: ...@@ -718,7 +720,7 @@ again:
ret = page_pipe_add_page(pp, pgaddr, 0); ret = page_pipe_add_page(pp, pgaddr, 0);
if (ret == -EAGAIN) { if (ret == -EAGAIN) {
ret = dump_pages(pp, &xfer, addr); ret = dump_pages(pp, &xfer);
if (ret) if (ret)
goto err_xfer; goto err_xfer;
page_pipe_reinit(pp); page_pipe_reinit(pp);
...@@ -727,7 +729,7 @@ again: ...@@ -727,7 +729,7 @@ again:
goto err_xfer; goto err_xfer;
} }
ret = dump_pages(pp, &xfer, addr); ret = dump_pages(pp, &xfer);
err_xfer: err_xfer:
xfer.close(&xfer); xfer.close(&xfer);
......
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