btrfs: switch to kvmalloc and GFP_KERNEL in lzo/zlib alloc_workspace
authorDavid Sterba <dsterba@suse.com>
Wed, 31 May 2017 15:21:15 +0000 (17:21 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2017 16:26:02 +0000 (18:26 +0200)
The compression workspace buffers are larger than a page so we use
vmalloc, unconditionally. This is not always necessary as there might be
contiguous memory available.

Let's use the kvmalloc helpers that will try kmalloc first and fallback
to vmalloc. For that they require GFP_KERNEL flags. As we now have the
alloc_workspace calls protected by memalloc_nofs in the critical
contexts, we can safely use GFP_KERNEL.

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/lzo.c
fs/btrfs/zlib.c

index 5ffee3986e1ae5dd8126c5064c2d3f404f222de5..d433e75d489a79fbe068dfcb976e320501b44ede 100644 (file)
@@ -18,7 +18,7 @@
 
 #include <linux/kernel.h>
 #include <linux/slab.h>
-#include <linux/vmalloc.h>
+#include <linux/mm.h>
 #include <linux/init.h>
 #include <linux/err.h>
 #include <linux/sched.h>
@@ -41,9 +41,9 @@ static void lzo_free_workspace(struct list_head *ws)
 {
        struct workspace *workspace = list_entry(ws, struct workspace, list);
 
-       vfree(workspace->buf);
-       vfree(workspace->cbuf);
-       vfree(workspace->mem);
+       kvfree(workspace->buf);
+       kvfree(workspace->cbuf);
+       kvfree(workspace->mem);
        kfree(workspace);
 }
 
@@ -55,9 +55,9 @@ static struct list_head *lzo_alloc_workspace(void)
        if (!workspace)
                return ERR_PTR(-ENOMEM);
 
-       workspace->mem = vmalloc(LZO1X_MEM_COMPRESS);
-       workspace->buf = vmalloc(lzo1x_worst_compress(PAGE_SIZE));
-       workspace->cbuf = vmalloc(lzo1x_worst_compress(PAGE_SIZE));
+       workspace->mem = kvmalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
+       workspace->buf = kvmalloc(lzo1x_worst_compress(PAGE_SIZE), GFP_KERNEL);
+       workspace->cbuf = kvmalloc(lzo1x_worst_compress(PAGE_SIZE), GFP_KERNEL);
        if (!workspace->mem || !workspace->buf || !workspace->cbuf)
                goto fail;
 
index c1db7572283b324626377361e10a7a87490e74f3..c248f9286366fd132735d23cdd8d2411620b5f98 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/slab.h>
 #include <linux/zlib.h>
 #include <linux/zutil.h>
-#include <linux/vmalloc.h>
+#include <linux/mm.h>
 #include <linux/init.h>
 #include <linux/err.h>
 #include <linux/sched.h>
@@ -43,7 +43,7 @@ static void zlib_free_workspace(struct list_head *ws)
 {
        struct workspace *workspace = list_entry(ws, struct workspace, list);
 
-       vfree(workspace->strm.workspace);
+       kvfree(workspace->strm.workspace);
        kfree(workspace->buf);
        kfree(workspace);
 }
@@ -59,7 +59,7 @@ static struct list_head *zlib_alloc_workspace(void)
 
        workspacesize = max(zlib_deflate_workspacesize(MAX_WBITS, MAX_MEM_LEVEL),
                        zlib_inflate_workspacesize());
-       workspace->strm.workspace = vmalloc(workspacesize);
+       workspace->strm.workspace = kvmalloc(workspacesize, GFP_KERNEL);
        workspace->buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
        if (!workspace->strm.workspace || !workspace->buf)
                goto fail;