diff options
-rw-r--r-- | drivers/block/zram/zcomp_lz4.c | 23 | ||||
-rw-r--r-- | drivers/block/zram/zcomp_lzo.c | 23 |
2 files changed, 42 insertions, 4 deletions
diff --git a/drivers/block/zram/zcomp_lz4.c b/drivers/block/zram/zcomp_lz4.c index ee44b51130a4..dd6083124276 100644 --- a/drivers/block/zram/zcomp_lz4.c +++ b/drivers/block/zram/zcomp_lz4.c | |||
@@ -10,17 +10,36 @@ | |||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/slab.h> | 11 | #include <linux/slab.h> |
12 | #include <linux/lz4.h> | 12 | #include <linux/lz4.h> |
13 | #include <linux/vmalloc.h> | ||
14 | #include <linux/mm.h> | ||
13 | 15 | ||
14 | #include "zcomp_lz4.h" | 16 | #include "zcomp_lz4.h" |
15 | 17 | ||
16 | static void *zcomp_lz4_create(void) | 18 | static void *zcomp_lz4_create(void) |
17 | { | 19 | { |
18 | return kzalloc(LZ4_MEM_COMPRESS, GFP_NOIO); | 20 | void *ret; |
21 | |||
22 | /* | ||
23 | * This function can be called in swapout/fs write path | ||
24 | * so we can't use GFP_FS|IO. And it assumes we already | ||
25 | * have at least one stream in zram initialization so we | ||
26 | * don't do best effort to allocate more stream in here. | ||
27 | * A default stream will work well without further multiple | ||
28 | * streams. That's why we use NORETRY | NOWARN. | ||
29 | */ | ||
30 | ret = kzalloc(LZ4_MEM_COMPRESS, GFP_NOIO | __GFP_NORETRY | | ||
31 | __GFP_NOWARN); | ||
32 | if (!ret) | ||
33 | ret = __vmalloc(LZ4_MEM_COMPRESS, | ||
34 | GFP_NOIO | __GFP_NORETRY | __GFP_NOWARN | | ||
35 | __GFP_ZERO | __GFP_HIGHMEM, | ||
36 | PAGE_KERNEL); | ||
37 | return ret; | ||
19 | } | 38 | } |
20 | 39 | ||
21 | static void zcomp_lz4_destroy(void *private) | 40 | static void zcomp_lz4_destroy(void *private) |
22 | { | 41 | { |
23 | kfree(private); | 42 | kvfree(private); |
24 | } | 43 | } |
25 | 44 | ||
26 | static int zcomp_lz4_compress(const unsigned char *src, unsigned char *dst, | 45 | static int zcomp_lz4_compress(const unsigned char *src, unsigned char *dst, |
diff --git a/drivers/block/zram/zcomp_lzo.c b/drivers/block/zram/zcomp_lzo.c index 683ce049e070..edc549920fa0 100644 --- a/drivers/block/zram/zcomp_lzo.c +++ b/drivers/block/zram/zcomp_lzo.c | |||
@@ -10,17 +10,36 @@ | |||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/slab.h> | 11 | #include <linux/slab.h> |
12 | #include <linux/lzo.h> | 12 | #include <linux/lzo.h> |
13 | #include <linux/vmalloc.h> | ||
14 | #include <linux/mm.h> | ||
13 | 15 | ||
14 | #include "zcomp_lzo.h" | 16 | #include "zcomp_lzo.h" |
15 | 17 | ||
16 | static void *lzo_create(void) | 18 | static void *lzo_create(void) |
17 | { | 19 | { |
18 | return kzalloc(LZO1X_MEM_COMPRESS, GFP_NOIO); | 20 | void *ret; |
21 | |||
22 | /* | ||
23 | * This function can be called in swapout/fs write path | ||
24 | * so we can't use GFP_FS|IO. And it assumes we already | ||
25 | * have at least one stream in zram initialization so we | ||
26 | * don't do best effort to allocate more stream in here. | ||
27 | * A default stream will work well without further multiple | ||
28 | * streams. That's why we use NORETRY | NOWARN. | ||
29 | */ | ||
30 | ret = kzalloc(LZO1X_MEM_COMPRESS, GFP_NOIO | __GFP_NORETRY | | ||
31 | __GFP_NOWARN); | ||
32 | if (!ret) | ||
33 | ret = __vmalloc(LZO1X_MEM_COMPRESS, | ||
34 | GFP_NOIO | __GFP_NORETRY | __GFP_NOWARN | | ||
35 | __GFP_ZERO | __GFP_HIGHMEM, | ||
36 | PAGE_KERNEL); | ||
37 | return ret; | ||
19 | } | 38 | } |
20 | 39 | ||
21 | static void lzo_destroy(void *private) | 40 | static void lzo_destroy(void *private) |
22 | { | 41 | { |
23 | kfree(private); | 42 | kvfree(private); |
24 | } | 43 | } |
25 | 44 | ||
26 | static int lzo_compress(const unsigned char *src, unsigned char *dst, | 45 | static int lzo_compress(const unsigned char *src, unsigned char *dst, |