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

abhishek dubey dubeyabhishek777 at gmail.com
Fri Sep 27 12:48:51 MSK 2019


This is elaborate description of the issue which is bypassed by this patch.

On 16/08/19 4:43 PM, Abhishek Dubey wrote:
> 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 <mailto: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
>     <mailto: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/20190927/6cc17d77/attachment.html>


More information about the CRIU mailing list