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

Cyrill Gorcunov gorcunov at virtuozzo.com
Tue Feb 13 11:17:38 MSK 2018


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.

 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