[CRIU] [PATCH 5/6] Hack to handle vmsplice fail: resolve later

Abhishek Dubey dubeyabhishek777 at gmail.com
Fri Aug 16 14:13:30 MSK 2019


Hi,

I have a few observation regarding this issue:

If a ppb (page-pipe-buffer) requires corresponding pipe size < 512 pages,
it faces no issue.
But, all the test-cases which require pipe size to be 512 pages fails. In
such cases, vmsplice
while splicing from user-buffer, don't return any error, but splices few
bytes less than 512 pages.
So 512th page is incompletely spliced from user-buffer to pipe.

This hack bypasses this issue:
While expanding pipe, let it expand till 512 pages, but the stored pipe
size will be 1 less than
actual size. So, ppb->pipe_size will store 511 instead of 512. Each ppb can
point to 511 pages.

By doing so, vmsplice splices 511 pages completely, without issue for all
test cases. The 512th
page become part of next ppb.

I wrote a toy code to find the actual issue(vmsplice failing with pipe of
512 page size), but pipe was not expanding beyond 256 pages.

Have you faced this problem before?


On Fri, Aug 2, 2019 at 11:44 AM abhishek dubey <dubeyabhishek777 at gmail.com>
wrote:

>
> On 30/07/19 6:11 PM, Pavel Emelianov wrote:
> > On 7/25/19 4:14 AM, Abhishek Dubey wrote:
> >> hack to handle failing vmsplice from user-buffer to
> >> pipe: need to resolve
> > Please, write more descriptive comment to this patch, these off-by-one-s
> > are not clear.
>
> This is temporary change. I need to debug this code and eliminate it.
>
> If this will be required in final code, I will add proper description.
>
> >
> >> Signed-off-by: Abhishek Dubey <dubeyabhishek777 at gmail.com>
> >> ---
> >>   criu/page-pipe.c | 4 ++--
> >>   1 file changed, 2 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/criu/page-pipe.c b/criu/page-pipe.c
> >> index a821696..d73f223 100644
> >> --- a/criu/page-pipe.c
> >> +++ b/criu/page-pipe.c
> >> @@ -33,7 +33,7 @@ static int __ppb_resize_pipe(struct page_pipe_buf
> *ppb, unsigned long new_size)
> >>   {
> >>      int ret;
> >>
> >> -    ret = fcntl(ppb->p[0], F_SETPIPE_SZ, new_size * PAGE_SIZE);
> >> +    ret = fcntl(ppb->p[0], F_SETPIPE_SZ, new_size * PAGE_SIZE + 1);
> >>      if (ret < 0)
> >>              return -1;
> >>
> >> @@ -41,7 +41,7 @@ static int __ppb_resize_pipe(struct page_pipe_buf
> *ppb, unsigned long new_size)
> >>      BUG_ON(ret < ppb->pipe_size);
> >>
> >>      pr_debug("Grow pipe %x -> %x\n", ppb->pipe_size, ret);
> >> -    ppb->pipe_size = ret;
> >> +    ppb->pipe_size = ret -1;
> >>
> >>      return 0;
> >>   }
> >>
> -Abhishek
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openvz.org/pipermail/criu/attachments/20190816/22105e4d/attachment.html>


More information about the CRIU mailing list