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 {
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);
struct page_pipe;
int page_xfer_dump_pages(struct page_xfer *, struct page_pipe *,
unsigned long off);
int connect_to_page_server(void);
#endif
......@@ -5,6 +5,7 @@
#include "crtools.h"
#include "page-xfer.h"
#include "page-pipe.h"
#include "protobuf.h"
#include "protobuf/pagemap.pb-c.h"
......@@ -278,6 +279,32 @@ static void close_page_xfer(struct page_xfer *xfer)
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)
{
if (opts.use_page_server)
......
......@@ -610,25 +610,8 @@ int parasite_dump_pages_seized(struct parasite_ctl *ctl, int vpid,
if (ret < 0)
goto out_pp;
ret = -1;
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));
ret = page_xfer_dump_pages(&xfer, pp, 0);
if (xfer.write_pagemap(&xfer, iov, ppb->p[0]))
goto out_xfer;
}
}
ret = 0;
out_xfer:
xfer.close(&xfer);
out_pp:
destroy_page_pipe(pp);
......
......@@ -362,27 +362,8 @@ static int dump_one_shmem(struct shmem_info_dump *si)
if (err)
goto err_pp;
list_for_each_entry(ppb, &pp->bufs, l) {
int i;
ret = page_xfer_dump_pages(&xfer, pp, (unsigned long)addr);
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);
err_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