<div dir="auto"><div dir="ltr">Hi,<div><br></div><div>I have a few observation regarding this issue:</div><div><br></div><div>If a ppb (page-pipe-buffer) requires corresponding pipe size < 512 pages, it faces no issue.</div><div>But, all the test-cases which require pipe size to be 512 pages fails. In such cases, vmsplice</div><div>while splicing from user-buffer, don't return any error, but splices few bytes less than 512 pages.</div><div>So 512th page is incompletely spliced from user-buffer to pipe.</div><div><br></div><div>This hack bypasses this issue: </div><div>While expanding pipe, let it expand till 512 pages, but the stored pipe size will be 1 less than</div><div>actual size. So, ppb->pipe_size will store 511 instead of 512. Each ppb can point to 511 pages.</div><div><br></div><div>By doing so, vmsplice splices 511 pages completely, without issue for all test cases. The 512th</div><div>page become part of next ppb.</div><div><br></div><div>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. </div><div dir="auto"><br></div><div dir="auto">Have you faced this problem before?</div><div dir="auto"><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Aug 2, 2019 at 11:44 AM abhishek dubey <<a href="mailto:dubeyabhishek777@gmail.com" target="_blank" rel="noreferrer">dubeyabhishek777@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
On 30/07/19 6:11 PM, Pavel Emelianov wrote:<br>
> On 7/25/19 4:14 AM, Abhishek Dubey wrote:<br>
>> hack to handle failing vmsplice from user-buffer to<br>
>> pipe: need to resolve<br>
> Please, write more descriptive comment to this patch, these off-by-one-s<br>
> are not clear.<br>
<br>
This is temporary change. I need to debug this code and eliminate it.<br>
<br>
If this will be required in final code, I will add proper description.<br>
<br>
><br>
>> Signed-off-by: Abhishek Dubey <<a href="mailto:dubeyabhishek777@gmail.com" target="_blank" rel="noreferrer">dubeyabhishek777@gmail.com</a>><br>
>> ---<br>
>> criu/page-pipe.c | 4 ++--<br>
>> 1 file changed, 2 insertions(+), 2 deletions(-)<br>
>><br>
>> diff --git a/criu/page-pipe.c b/criu/page-pipe.c<br>
>> index a821696..d73f223 100644<br>
>> --- a/criu/page-pipe.c<br>
>> +++ b/criu/page-pipe.c<br>
>> @@ -33,7 +33,7 @@ static int __ppb_resize_pipe(struct page_pipe_buf *ppb, unsigned long new_size)<br>
>> {<br>
>> int ret;<br>
>> <br>
>> - ret = fcntl(ppb->p[0], F_SETPIPE_SZ, new_size * PAGE_SIZE);<br>
>> + ret = fcntl(ppb->p[0], F_SETPIPE_SZ, new_size * PAGE_SIZE + 1);<br>
>> if (ret < 0)<br>
>> return -1;<br>
>> <br>
>> @@ -41,7 +41,7 @@ static int __ppb_resize_pipe(struct page_pipe_buf *ppb, unsigned long new_size)<br>
>> BUG_ON(ret < ppb->pipe_size);<br>
>> <br>
>> pr_debug("Grow pipe %x -> %x\n", ppb->pipe_size, ret);<br>
>> - ppb->pipe_size = ret;<br>
>> + ppb->pipe_size = ret -1;<br>
>> <br>
>> return 0;<br>
>> }<br>
>><br>
-Abhishek<br>
</blockquote></div>