[Devel] [PATCH rh7]: fs/pipe: Use kvmalloc for pipe buffers

Konstantin Khorenko khorenko at virtuozzo.com
Wed Feb 14 13:39:58 MSK 2018


On 02/13/2018 11:17 AM, Cyrill Gorcunov wrote:
> To restore big slabs of memory (more than 1G) via pipes we need
> pipes to be able to carry such sizes, for this sake Andrey propose
> to use kvmalloc calls. Looking into the code I didn't find a reason
> why we can't do so, thus here is a patch.
>
> https://jira.sw.ru/browse/PSBM-69201
>
> CC: Andrey Vagin <avagin at virtuozzo.com>
> CC: Andrey Ryabinin <aryabinin at virtuozzo.com>
> CC: Konstantin Khorenko <khorenko at virtuozzo.com>
> CC: "Denis V. Lunev" <den at virtuozzo.com>
> Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
> ---
> Note I wrapped the calls with CONFIG_VE for a while.

Note, i dropped ifdef CONFIG_VE wrappers.

>
>  fs/pipe.c |   16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
>
> Index: linux-pcs7.git/fs/pipe.c
> ===================================================================
> --- linux-pcs7.git.orig/fs/pipe.c
> +++ linux-pcs7.git/fs/pipe.c
> @@ -845,7 +845,11 @@ struct pipe_inode_info *alloc_pipe_info(
>  		if (!too_many_pipe_buffers_hard(user)) {
>  			if (too_many_pipe_buffers_soft(user))
>  				pipe_bufs = 1;
> +#ifdef CONFIG_VE
> +			pipe->bufs = kvmalloc(sizeof(struct pipe_buffer) * pipe_bufs, GFP_KERNEL | __GFP_ZERO);
> +#else
>  			pipe->bufs = kzalloc(sizeof(struct pipe_buffer) * pipe_bufs, GFP_KERNEL);
> +#endif
>  		}
>
>  		if (pipe->bufs) {
> @@ -877,7 +881,11 @@ void free_pipe_info(struct pipe_inode_in
>  	}
>  	if (pipe->tmp_page)
>  		__free_page(pipe->tmp_page);
> +#ifdef CONFIG_VE
> +	kvfree(pipe->bufs);
> +#else
>  	kfree(pipe->bufs);
> +#endif
>  	kfree(pipe);
>  }
>
> @@ -1235,7 +1243,11 @@ static long pipe_set_size(struct pipe_in
>  	if (nr_pages < pipe->nrbufs)
>  		return -EBUSY;
>
> +#ifdef CONFIG_VE
> +	bufs = kvmalloc(nr_pages * sizeof(*bufs), GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO);
> +#else
>  	bufs = kcalloc(nr_pages, sizeof(*bufs), GFP_KERNEL | __GFP_NOWARN);
> +#endif
>  	if (unlikely(!bufs))
>  		return -ENOMEM;
>
> @@ -1262,7 +1274,11 @@ static long pipe_set_size(struct pipe_in
>
>  	account_pipe_buffers(pipe, pipe->buffers, nr_pages);
>  	pipe->curbuf = 0;
> +#ifdef CONFIG_VE
> +	kvfree(pipe->bufs);
> +#else
>  	kfree(pipe->bufs);
> +#endif
>  	pipe->bufs = bufs;
>  	pipe->buffers = nr_pages;
>  	return nr_pages * PAGE_SIZE;
> .
>


More information about the Devel mailing list