[CRIU] [PATCH 1/3] page-pipe: allow to handle pipes in batch mode
Pavel Emelyanov
xemul at parallels.com
Wed Jan 29 22:09:39 PST 2014
On 01/30/2014 12:12 AM, Andrew Vagin wrote:
> On Wed, Jan 29, 2014 at 05:13:23PM +0400, Pavel Emelyanov wrote:
>> On 01/27/2014 06:22 PM, Andrey Vagin wrote:
>>> The problem is that vmsplice() to a big pipe fails very often.
>>>
>>> The kernel allocates the linear chunk of memory for pipe buffer
>>> descriptos, but big allocation in kernel can fail.
>>>
>>> So we need to restrict maximal capacity of pipes. But the number of
>>> pipes is restricted too, so we need to dump memory in a batch mode.
>>
>> Batch mode means "several at once". Do you mean "... using one pipe"?
>
> I mean match mode "several at once" ;).
Then current mode is batch also -- it pulls several pages into several
pipes and dumps them all at once.
>>
>>> TODO: send all pipes to parasite in one request
>>> Signed-off-by: Andrey Vagin <avagin at openvz.org>
>>> ---
>>> include/page-pipe.h | 14 ++++++++
>>> page-pipe.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++---
>>> 2 files changed, 110 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/include/page-pipe.h b/include/page-pipe.h
>>> index 393627b..78c66b2 100644
>>> --- a/include/page-pipe.h
>>> +++ b/include/page-pipe.h
>>> @@ -78,6 +78,9 @@ struct page_pipe_buf {
>>> struct list_head l; /* links into page_pipe->bufs */
>>> };
>>>
>>> +struct page_pipe;
>>> +typedef int (page_pipe_batch_cb)(struct page_pipe *pp, void *args);
>>> +
>>> struct page_pipe {
>>> unsigned int nr_pipes; /* how many page_pipe_bufs in there */
>>> struct list_head bufs; /* list of bufs */
>>> @@ -89,6 +92,12 @@ struct page_pipe {
>>> unsigned int nr_holes; /* number of holes allocated */
>>> unsigned int free_hole; /* number of holes in use */
>>> struct iovec *holes; /* holes */
>>> +
>>> + unsigned int pipe_max_size; /* max allowable pipe capacity */
>>
>> This thing is effectively constant. Make it such, please.
>
> Ok
>
>>
>>> + int pipe_nr; /* number of avaliable pipes */
>>
>> Available where? Each page-pipe carries nr_pipes pipe bufs. What is
>> the new number about?
>
> Available for one batch
How does it differ from nr_pipes?
>>
>>> +
>>> + page_pipe_batch_cb *batch_cb; /* callback to handle batch requests */
>>> + void *batch_args; /* arguments for the callback */
>>> };
>>>
>>> extern struct page_pipe *create_page_pipe(unsigned int nr, struct iovec *);
> .
>
More information about the CRIU
mailing list