[RHEL7,COMMIT] fs/pipe: Use kvmalloc for pipe buffers

Submitted by Konstantin Khorenko on Feb. 14, 2018, 10:37 a.m.

Details

Message ID 201802141037.w1EAbtNC012211@finist_ce7.work
State New
Series ": fs/pipe: Use kvmalloc for pipe buffers"
Headers show

Commit Message

Konstantin Khorenko Feb. 14, 2018, 10:37 a.m.
The commit is pushed to "branch-rh7-3.10.0-693.17.1.vz7.43.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.17.1.vz7.43.4
------>
commit effeb5d21ed02dbb6c155965cb83e8641286451b
Author: Cyrill Gorcunov <gorcunov@virtuozzo.com>
Date:   Wed Feb 14 13:37:55 2018 +0300

    fs/pipe: Use kvmalloc for pipe buffers
    
    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@virtuozzo.com>
    CC: Andrey Ryabinin <aryabinin@virtuozzo.com>
    CC: Konstantin Khorenko <khorenko@virtuozzo.com>
    CC: "Denis V. Lunev" <den@virtuozzo.com>
    Signed-off-by: Cyrill Gorcunov <gorcunov@virtuozzo.com>
---
 fs/pipe.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/fs/pipe.c b/fs/pipe.c
index 7bded9f4a0d4..cfc994adb508 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -845,7 +845,7 @@  struct pipe_inode_info *alloc_pipe_info(void)
 		if (!too_many_pipe_buffers_hard(user)) {
 			if (too_many_pipe_buffers_soft(user))
 				pipe_bufs = 1;
-			pipe->bufs = kzalloc(sizeof(struct pipe_buffer) * pipe_bufs, GFP_KERNEL);
+			pipe->bufs = kvmalloc(sizeof(struct pipe_buffer) * pipe_bufs, GFP_KERNEL | __GFP_ZERO);
 		}
 
 		if (pipe->bufs) {
@@ -877,7 +877,7 @@  void free_pipe_info(struct pipe_inode_info *pipe)
 	}
 	if (pipe->tmp_page)
 		__free_page(pipe->tmp_page);
-	kfree(pipe->bufs);
+	kvfree(pipe->bufs);
 	kfree(pipe);
 }
 
@@ -1235,7 +1235,7 @@  static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long nr_pages)
 	if (nr_pages < pipe->nrbufs)
 		return -EBUSY;
 
-	bufs = kcalloc(nr_pages, sizeof(*bufs), GFP_KERNEL | __GFP_NOWARN);
+	bufs = kvmalloc(nr_pages * sizeof(*bufs), GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO);
 	if (unlikely(!bufs))
 		return -ENOMEM;
 
@@ -1262,7 +1262,7 @@  static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long nr_pages)
 
 	account_pipe_buffers(pipe, pipe->buffers, nr_pages);
 	pipe->curbuf = 0;
-	kfree(pipe->bufs);
+	kvfree(pipe->bufs);
 	pipe->bufs = bufs;
 	pipe->buffers = nr_pages;
 	return nr_pages * PAGE_SIZE;