mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-31 06:15:24 +00:00
page-pipe/page-xfer: remove PP_COMPAT (compatible iovs)
Parasite transfers pages in the same iovec format now: drop compatible format (yay!). travis-ci: success for Rectify 32-bit compatible C/R on x86 Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com> Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com> Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
committed by
Andrei Vagin
parent
a3e31595a4
commit
cb0a7ba3fd
@@ -116,15 +116,8 @@ struct page_pipe {
|
||||
|
||||
#define PP_CHUNK_MODE 0x1 /* Restrict the maximum buffer size of pipes
|
||||
and dump memory for a few iterations */
|
||||
#define PP_COMPAT 0x2 /* Use compatible iovs (struct compat_iovec) */
|
||||
#define PP_OWN_IOVS 0x4 /* create_page_pipe allocated IOVs memory */
|
||||
|
||||
/* XXX: move to arch-depended file, when non-x86 add support for compat mode */
|
||||
struct iovec_compat {
|
||||
u32 iov_base;
|
||||
u32 iov_len;
|
||||
};
|
||||
|
||||
struct page_pipe *create_page_pipe(unsigned int nr_segs, struct iovec *iovs, unsigned flags);
|
||||
extern void destroy_page_pipe(struct page_pipe *p);
|
||||
extern int page_pipe_add_page(struct page_pipe *p, unsigned long addr);
|
||||
|
@@ -305,8 +305,6 @@ static int __parasite_dump_pages_seized(struct pstree_item *item,
|
||||
* use, i.e. on non-lazy non-predump.
|
||||
*/
|
||||
cpp_flags |= PP_CHUNK_MODE;
|
||||
if (!compel_mode_native(ctl))
|
||||
cpp_flags |= PP_COMPAT;
|
||||
pp = create_page_pipe(vma_area_list->priv_size,
|
||||
pargs_iovs(args), cpp_flags);
|
||||
if (!pp)
|
||||
|
@@ -81,15 +81,10 @@ static int ppb_resize_pipe(struct page_pipe_buf *ppb, unsigned long new_size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void iov_init_compat(struct iovec_compat *iov, unsigned long addr)
|
||||
{
|
||||
iov->iov_base = (u32)addr;
|
||||
iov->iov_len = PAGE_SIZE;
|
||||
}
|
||||
|
||||
static int page_pipe_grow(struct page_pipe *pp)
|
||||
{
|
||||
struct page_pipe_buf *ppb;
|
||||
struct iovec *free_iov;
|
||||
|
||||
pr_debug("Will grow page pipe (iov off is %u)\n", pp->free_iov);
|
||||
|
||||
@@ -107,7 +102,8 @@ static int page_pipe_grow(struct page_pipe *pp)
|
||||
return -1;
|
||||
|
||||
out:
|
||||
ppb_init(ppb, 0, 0, &pp->iovs[pp->free_iov]);
|
||||
free_iov = &pp->iovs[pp->free_iov];
|
||||
ppb_init(ppb, 0, 0, free_iov);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -214,13 +210,7 @@ static inline int try_add_page_to(struct page_pipe *pp, struct page_pipe_buf *pp
|
||||
|
||||
pr_debug("Add iov to page pipe (%u iovs, %u/%u total)\n",
|
||||
ppb->nr_segs, pp->free_iov, pp->nr_iovs);
|
||||
if (pp->flags & PP_COMPAT) {
|
||||
struct iovec_compat *iovs = (void *)ppb->iov;
|
||||
|
||||
iov_init_compat(&iovs[ppb->nr_segs++], addr);
|
||||
} else {
|
||||
iov_init(&ppb->iov[ppb->nr_segs++], addr);
|
||||
}
|
||||
iov_init(&ppb->iov[ppb->nr_segs++], addr);
|
||||
pp->free_iov++;
|
||||
BUG_ON(pp->free_iov > pp->nr_iovs);
|
||||
out:
|
||||
@@ -268,13 +258,8 @@ int page_pipe_add_hole(struct page_pipe *pp, unsigned long addr)
|
||||
iov_grow_page(&pp->holes[pp->free_hole - 1], addr))
|
||||
goto out;
|
||||
|
||||
if (pp->flags & PP_COMPAT) {
|
||||
struct iovec_compat *iovs = (void *)pp->holes;
|
||||
iov_init(&pp->holes[pp->free_hole++], addr);
|
||||
|
||||
iov_init_compat(&iovs[pp->free_hole++], addr);
|
||||
} else {
|
||||
iov_init(&pp->holes[pp->free_hole++], addr);
|
||||
}
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
@@ -284,7 +269,6 @@ void debug_show_page_pipe(struct page_pipe *pp)
|
||||
struct page_pipe_buf *ppb;
|
||||
int i;
|
||||
struct iovec *iov;
|
||||
struct iovec_compat *iov_c;
|
||||
|
||||
if (pr_quelled(LOG_DEBUG))
|
||||
return;
|
||||
@@ -296,28 +280,15 @@ void debug_show_page_pipe(struct page_pipe *pp)
|
||||
pr_debug("\tbuf %u pages, %u iovs:\n",
|
||||
ppb->pages_in, ppb->nr_segs);
|
||||
for (i = 0; i < ppb->nr_segs; i++) {
|
||||
if (pp->flags & PP_COMPAT) {
|
||||
iov_c = (void *)ppb->iov;
|
||||
pr_debug("\t\t%x %lu\n", iov_c[i].iov_base,
|
||||
(unsigned long) iov_c[i].iov_len / PAGE_SIZE);
|
||||
} else {
|
||||
iov = &ppb->iov[i];
|
||||
pr_debug("\t\t%p %lu\n", iov->iov_base,
|
||||
(unsigned long) iov->iov_len / PAGE_SIZE);
|
||||
}
|
||||
iov = &ppb->iov[i];
|
||||
pr_debug("\t\t%p %lu\n", iov->iov_base,
|
||||
iov->iov_len / PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
pr_debug("* %u holes:\n", pp->free_hole);
|
||||
for (i = 0; i < pp->free_hole; i++) {
|
||||
if (pp->flags & PP_COMPAT) {
|
||||
iov_c = (void *)pp->holes;
|
||||
pr_debug("\t%x %lu\n", iov_c[i].iov_base,
|
||||
(unsigned long) iov_c[i].iov_len / PAGE_SIZE);
|
||||
} else {
|
||||
iov = &pp->holes[i];
|
||||
pr_debug("\t%p %lu\n", iov->iov_base,
|
||||
(unsigned long) iov->iov_len / PAGE_SIZE);
|
||||
}
|
||||
iov = &pp->holes[i];
|
||||
pr_debug("\t%p %lu\n", iov->iov_base, iov->iov_len / PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
@@ -341,29 +341,13 @@ static int page_xfer_dump_hole(struct page_xfer *xfer,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct iovec get_iov(struct iovec *iovs, unsigned int n, bool compat)
|
||||
{
|
||||
if (likely(!compat)) {
|
||||
return iovs[n];
|
||||
} else {
|
||||
struct iovec ret;
|
||||
struct iovec_compat *tmp = (struct iovec_compat*)(void *)iovs;
|
||||
|
||||
tmp += n;
|
||||
ret.iov_base = (void *)(uintptr_t)tmp->iov_base;
|
||||
ret.iov_len = tmp->iov_len;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
|
||||
unsigned int *cur_hole, void *limit, unsigned long off)
|
||||
{
|
||||
int ret;
|
||||
|
||||
for (; *cur_hole < pp->free_hole ; (*cur_hole)++) {
|
||||
struct iovec hole = get_iov(pp->holes, *cur_hole,
|
||||
pp->flags & PP_COMPAT);
|
||||
struct iovec hole = pp->holes[*cur_hole];
|
||||
|
||||
if (limit && hole.iov_base >= limit)
|
||||
break;
|
||||
@@ -391,7 +375,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp,
|
||||
pr_debug("\tbuf %d/%d\n", ppb->pages_in, ppb->nr_segs);
|
||||
|
||||
for (i = 0; i < ppb->nr_segs; i++) {
|
||||
struct iovec iov = get_iov(ppb->iov, i, pp->flags & PP_COMPAT);
|
||||
struct iovec iov = ppb->iov[i];
|
||||
|
||||
ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base, off);
|
||||
if (ret)
|
||||
|
Reference in New Issue
Block a user