Commit cb0a7ba3 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Andrei Vagin

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: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent a3e31595
...@@ -116,15 +116,8 @@ struct page_pipe { ...@@ -116,15 +116,8 @@ struct page_pipe {
#define PP_CHUNK_MODE 0x1 /* Restrict the maximum buffer size of pipes #define PP_CHUNK_MODE 0x1 /* Restrict the maximum buffer size of pipes
and dump memory for a few iterations */ 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 */ #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); 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 void destroy_page_pipe(struct page_pipe *p);
extern int page_pipe_add_page(struct page_pipe *p, unsigned long addr); 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, ...@@ -305,8 +305,6 @@ static int __parasite_dump_pages_seized(struct pstree_item *item,
* use, i.e. on non-lazy non-predump. * use, i.e. on non-lazy non-predump.
*/ */
cpp_flags |= PP_CHUNK_MODE; cpp_flags |= PP_CHUNK_MODE;
if (!compel_mode_native(ctl))
cpp_flags |= PP_COMPAT;
pp = create_page_pipe(vma_area_list->priv_size, pp = create_page_pipe(vma_area_list->priv_size,
pargs_iovs(args), cpp_flags); pargs_iovs(args), cpp_flags);
if (!pp) if (!pp)
......
...@@ -81,15 +81,10 @@ static int ppb_resize_pipe(struct page_pipe_buf *ppb, unsigned long new_size) ...@@ -81,15 +81,10 @@ static int ppb_resize_pipe(struct page_pipe_buf *ppb, unsigned long new_size)
return 0; 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) static int page_pipe_grow(struct page_pipe *pp)
{ {
struct page_pipe_buf *ppb; struct page_pipe_buf *ppb;
struct iovec *free_iov;
pr_debug("Will grow page pipe (iov off is %u)\n", pp->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) ...@@ -107,7 +102,8 @@ static int page_pipe_grow(struct page_pipe *pp)
return -1; return -1;
out: 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; return 0;
} }
...@@ -214,13 +210,7 @@ static inline int try_add_page_to(struct page_pipe *pp, struct page_pipe_buf *pp ...@@ -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", pr_debug("Add iov to page pipe (%u iovs, %u/%u total)\n",
ppb->nr_segs, pp->free_iov, pp->nr_iovs); ppb->nr_segs, pp->free_iov, pp->nr_iovs);
if (pp->flags & PP_COMPAT) { iov_init(&ppb->iov[ppb->nr_segs++], addr);
struct iovec_compat *iovs = (void *)ppb->iov;
iov_init_compat(&iovs[ppb->nr_segs++], addr);
} else {
iov_init(&ppb->iov[ppb->nr_segs++], addr);
}
pp->free_iov++; pp->free_iov++;
BUG_ON(pp->free_iov > pp->nr_iovs); BUG_ON(pp->free_iov > pp->nr_iovs);
out: out:
...@@ -268,13 +258,8 @@ int page_pipe_add_hole(struct page_pipe *pp, unsigned long addr) ...@@ -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)) iov_grow_page(&pp->holes[pp->free_hole - 1], addr))
goto out; goto out;
if (pp->flags & PP_COMPAT) { iov_init(&pp->holes[pp->free_hole++], addr);
struct iovec_compat *iovs = (void *)pp->holes;
iov_init_compat(&iovs[pp->free_hole++], addr);
} else {
iov_init(&pp->holes[pp->free_hole++], addr);
}
out: out:
return 0; return 0;
} }
...@@ -284,7 +269,6 @@ void debug_show_page_pipe(struct page_pipe *pp) ...@@ -284,7 +269,6 @@ void debug_show_page_pipe(struct page_pipe *pp)
struct page_pipe_buf *ppb; struct page_pipe_buf *ppb;
int i; int i;
struct iovec *iov; struct iovec *iov;
struct iovec_compat *iov_c;
if (pr_quelled(LOG_DEBUG)) if (pr_quelled(LOG_DEBUG))
return; return;
...@@ -296,28 +280,15 @@ void debug_show_page_pipe(struct page_pipe *pp) ...@@ -296,28 +280,15 @@ void debug_show_page_pipe(struct page_pipe *pp)
pr_debug("\tbuf %u pages, %u iovs:\n", pr_debug("\tbuf %u pages, %u iovs:\n",
ppb->pages_in, ppb->nr_segs); ppb->pages_in, ppb->nr_segs);
for (i = 0; i < ppb->nr_segs; i++) { for (i = 0; i < ppb->nr_segs; i++) {
if (pp->flags & PP_COMPAT) { iov = &ppb->iov[i];
iov_c = (void *)ppb->iov; pr_debug("\t\t%p %lu\n", iov->iov_base,
pr_debug("\t\t%x %lu\n", iov_c[i].iov_base, iov->iov_len / PAGE_SIZE);
(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);
}
} }
} }
pr_debug("* %u holes:\n", pp->free_hole); pr_debug("* %u holes:\n", pp->free_hole);
for (i = 0; i < pp->free_hole; i++) { for (i = 0; i < pp->free_hole; i++) {
if (pp->flags & PP_COMPAT) { iov = &pp->holes[i];
iov_c = (void *)pp->holes; pr_debug("\t%p %lu\n", iov->iov_base, iov->iov_len / PAGE_SIZE);
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);
}
} }
} }
...@@ -341,29 +341,13 @@ static int page_xfer_dump_hole(struct page_xfer *xfer, ...@@ -341,29 +341,13 @@ static int page_xfer_dump_hole(struct page_xfer *xfer,
return 0; 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, 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, unsigned long off)
{ {
int ret; int ret;
for (; *cur_hole < pp->free_hole ; (*cur_hole)++) { for (; *cur_hole < pp->free_hole ; (*cur_hole)++) {
struct iovec hole = get_iov(pp->holes, *cur_hole, struct iovec hole = pp->holes[*cur_hole];
pp->flags & PP_COMPAT);
if (limit && hole.iov_base >= limit) if (limit && hole.iov_base >= limit)
break; break;
...@@ -391,7 +375,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp, ...@@ -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); pr_debug("\tbuf %d/%d\n", ppb->pages_in, ppb->nr_segs);
for (i = 0; i < ppb->nr_segs; i++) { 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); ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base, off);
if (ret) if (ret)
......
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