|
@@ -10,17 +10,36 @@
|
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/lz4.h>
|
|
|
+#include <linux/vmalloc.h>
|
|
|
+#include <linux/mm.h>
|
|
|
|
|
|
#include "zcomp_lz4.h"
|
|
|
|
|
|
static void *zcomp_lz4_create(void)
|
|
|
{
|
|
|
- return kzalloc(LZ4_MEM_COMPRESS, GFP_NOIO);
|
|
|
+ void *ret;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * This function can be called in swapout/fs write path
|
|
|
+ * so we can't use GFP_FS|IO. And it assumes we already
|
|
|
+ * have at least one stream in zram initialization so we
|
|
|
+ * don't do best effort to allocate more stream in here.
|
|
|
+ * A default stream will work well without further multiple
|
|
|
+ * streams. That's why we use NORETRY | NOWARN.
|
|
|
+ */
|
|
|
+ ret = kzalloc(LZ4_MEM_COMPRESS, GFP_NOIO | __GFP_NORETRY |
|
|
|
+ __GFP_NOWARN);
|
|
|
+ if (!ret)
|
|
|
+ ret = __vmalloc(LZ4_MEM_COMPRESS,
|
|
|
+ GFP_NOIO | __GFP_NORETRY | __GFP_NOWARN |
|
|
|
+ __GFP_ZERO | __GFP_HIGHMEM,
|
|
|
+ PAGE_KERNEL);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static void zcomp_lz4_destroy(void *private)
|
|
|
{
|
|
|
- kfree(private);
|
|
|
+ kvfree(private);
|
|
|
}
|
|
|
|
|
|
static int zcomp_lz4_compress(const unsigned char *src, unsigned char *dst,
|