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 <gorcu...@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 <ava...@virtuozzo.com>
    CC: Andrey Ryabinin <aryabi...@virtuozzo.com>
    CC: Konstantin Khorenko <khore...@virtuozzo.com>
    CC: "Denis V. Lunev" <d...@virtuozzo.com>
    Signed-off-by: Cyrill Gorcunov <gorcu...@virtuozzo.com>
---
 fs/pipe.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

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;
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to