Commit 39402af7 authored by Pavel Emelyanov's avatar Pavel Emelyanov

page-xfer: Simplify one page-pipe dumping

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 4074a876
...@@ -14,5 +14,8 @@ struct page_xfer { ...@@ -14,5 +14,8 @@ struct page_xfer {
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);
int open_page_server_xfer(struct page_xfer *, int fd_type, long id); int open_page_server_xfer(struct page_xfer *, int fd_type, long id);
struct page_pipe;
int page_xfer_dump_pages(struct page_xfer *, struct page_pipe *,
unsigned long off);
int connect_to_page_server(void); int connect_to_page_server(void);
#endif #endif
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "crtools.h" #include "crtools.h"
#include "page-xfer.h" #include "page-xfer.h"
#include "page-pipe.h"
#include "protobuf.h" #include "protobuf.h"
#include "protobuf/pagemap.pb-c.h" #include "protobuf/pagemap.pb-c.h"
...@@ -278,6 +279,32 @@ static void close_page_xfer(struct page_xfer *xfer) ...@@ -278,6 +279,32 @@ static void close_page_xfer(struct page_xfer *xfer)
close(xfer->fd); close(xfer->fd);
} }
int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
unsigned long off)
{
struct page_pipe_buf *ppb;
list_for_each_entry(ppb, &pp->bufs, l) {
int i;
pr_debug("Dump shmem pages %d/%d\n", ppb->pages_in, ppb->nr_segs);
for (i = 0; i < ppb->nr_segs; i++) {
struct iovec *iov = &ppb->iov[i];
BUG_ON(iov->iov_base < (void *)off);
iov->iov_base -= off;
pr_debug("\t%p [%u]\n", iov->iov_base,
(unsigned int)(iov->iov_len / PAGE_SIZE));
if (xfer->write_pagemap(xfer, iov, ppb->p[0]))
return -1;
}
}
return 0;
}
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)
{ {
if (opts.use_page_server) if (opts.use_page_server)
......
...@@ -610,25 +610,8 @@ int parasite_dump_pages_seized(struct parasite_ctl *ctl, int vpid, ...@@ -610,25 +610,8 @@ int parasite_dump_pages_seized(struct parasite_ctl *ctl, int vpid,
if (ret < 0) if (ret < 0)
goto out_pp; goto out_pp;
ret = -1; ret = page_xfer_dump_pages(&xfer, pp, 0);
list_for_each_entry(ppb, &pp->bufs, l) {
int i;
pr_debug("Dump pages %d/%d\n", ppb->pages_in, ppb->nr_segs);
for (i = 0; i < ppb->nr_segs; i++) {
struct iovec *iov = &ppb->iov[i];
pr_debug("\t%p [%u]\n", iov->iov_base,
(unsigned int)(iov->iov_len / PAGE_SIZE));
if (xfer.write_pagemap(&xfer, iov, ppb->p[0]))
goto out_xfer;
}
}
ret = 0;
out_xfer:
xfer.close(&xfer); xfer.close(&xfer);
out_pp: out_pp:
destroy_page_pipe(pp); destroy_page_pipe(pp);
......
...@@ -362,27 +362,8 @@ static int dump_one_shmem(struct shmem_info_dump *si) ...@@ -362,27 +362,8 @@ static int dump_one_shmem(struct shmem_info_dump *si)
if (err) if (err)
goto err_pp; goto err_pp;
list_for_each_entry(ppb, &pp->bufs, l) { ret = page_xfer_dump_pages(&xfer, pp, (unsigned long)addr);
int i;
pr_debug("Dump shmem pages %d/%d\n", ppb->pages_in, ppb->nr_segs);
for (i = 0; i < ppb->nr_segs; i++) {
struct iovec *iov = &ppb->iov[i];
BUG_ON(iov->iov_base < addr);
iov->iov_base -= (unsigned long)addr;
pr_debug("\t%p [%u]\n", iov->iov_base,
(unsigned int)(iov->iov_len / PAGE_SIZE));
if (xfer.write_pagemap(&xfer, iov, ppb->p[0]))
goto out_xfer;
}
}
ret = 0;
out_xfer:
xfer.close(&xfer); xfer.close(&xfer);
err_pp: err_pp:
destroy_page_pipe(pp); destroy_page_pipe(pp);
......
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