diff options
| author | David S. Miller <davem@davemloft.net> | 2011-06-29 08:48:41 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-06-29 08:48:41 -0400 |
| commit | 7ab24bfdf9a9a9f87ac8e5ad9a25f80b5b947be7 (patch) | |
| tree | 897d12fb7498316d05ce2ed48722fc78b61fc4e1 | |
| parent | ed6e4ef836d425bc35e33bf20fcec95e68203afa (diff) | |
net+crypto: Use vmalloc for zlib inflate buffers.
They are 64K and result in order-4 allocations, even with SLUB.
Therefore, just like we always have for the deflate buffers, use
vmalloc.
Reported-by: Martin Jackson <mjackson220.list@gmail.com>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | crypto/deflate.c | 7 | ||||
| -rw-r--r-- | crypto/zlib.c | 7 | ||||
| -rw-r--r-- | drivers/net/bnx2x/bnx2x_main.c | 6 | ||||
| -rw-r--r-- | drivers/net/ppp_deflate.c | 5 |
4 files changed, 11 insertions, 14 deletions
diff --git a/crypto/deflate.c b/crypto/deflate.c index b5ccae29be74..b0165ecad0c5 100644 --- a/crypto/deflate.c +++ b/crypto/deflate.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | #include <linux/interrupt.h> | 32 | #include <linux/interrupt.h> |
| 33 | #include <linux/mm.h> | 33 | #include <linux/mm.h> |
| 34 | #include <linux/net.h> | 34 | #include <linux/net.h> |
| 35 | #include <linux/slab.h> | ||
| 36 | 35 | ||
| 37 | #define DEFLATE_DEF_LEVEL Z_DEFAULT_COMPRESSION | 36 | #define DEFLATE_DEF_LEVEL Z_DEFAULT_COMPRESSION |
| 38 | #define DEFLATE_DEF_WINBITS 11 | 37 | #define DEFLATE_DEF_WINBITS 11 |
| @@ -73,7 +72,7 @@ static int deflate_decomp_init(struct deflate_ctx *ctx) | |||
| 73 | int ret = 0; | 72 | int ret = 0; |
| 74 | struct z_stream_s *stream = &ctx->decomp_stream; | 73 | struct z_stream_s *stream = &ctx->decomp_stream; |
| 75 | 74 | ||
| 76 | stream->workspace = kzalloc(zlib_inflate_workspacesize(), GFP_KERNEL); | 75 | stream->workspace = vzalloc(zlib_inflate_workspacesize()); |
| 77 | if (!stream->workspace) { | 76 | if (!stream->workspace) { |
| 78 | ret = -ENOMEM; | 77 | ret = -ENOMEM; |
| 79 | goto out; | 78 | goto out; |
| @@ -86,7 +85,7 @@ static int deflate_decomp_init(struct deflate_ctx *ctx) | |||
| 86 | out: | 85 | out: |
| 87 | return ret; | 86 | return ret; |
| 88 | out_free: | 87 | out_free: |
| 89 | kfree(stream->workspace); | 88 | vfree(stream->workspace); |
| 90 | goto out; | 89 | goto out; |
| 91 | } | 90 | } |
| 92 | 91 | ||
| @@ -99,7 +98,7 @@ static void deflate_comp_exit(struct deflate_ctx *ctx) | |||
| 99 | static void deflate_decomp_exit(struct deflate_ctx *ctx) | 98 | static void deflate_decomp_exit(struct deflate_ctx *ctx) |
| 100 | { | 99 | { |
| 101 | zlib_inflateEnd(&ctx->decomp_stream); | 100 | zlib_inflateEnd(&ctx->decomp_stream); |
| 102 | kfree(ctx->decomp_stream.workspace); | 101 | vfree(ctx->decomp_stream.workspace); |
| 103 | } | 102 | } |
| 104 | 103 | ||
| 105 | static int deflate_init(struct crypto_tfm *tfm) | 104 | static int deflate_init(struct crypto_tfm *tfm) |
diff --git a/crypto/zlib.c b/crypto/zlib.c index d11d761a5e41..06b62e5cdcc7 100644 --- a/crypto/zlib.c +++ b/crypto/zlib.c | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
| 30 | #include <linux/mm.h> | 30 | #include <linux/mm.h> |
| 31 | #include <linux/net.h> | 31 | #include <linux/net.h> |
| 32 | #include <linux/slab.h> | ||
| 33 | 32 | ||
| 34 | #include <crypto/internal/compress.h> | 33 | #include <crypto/internal/compress.h> |
| 35 | 34 | ||
| @@ -60,7 +59,7 @@ static void zlib_decomp_exit(struct zlib_ctx *ctx) | |||
| 60 | 59 | ||
| 61 | if (stream->workspace) { | 60 | if (stream->workspace) { |
| 62 | zlib_inflateEnd(stream); | 61 | zlib_inflateEnd(stream); |
| 63 | kfree(stream->workspace); | 62 | vfree(stream->workspace); |
| 64 | stream->workspace = NULL; | 63 | stream->workspace = NULL; |
| 65 | } | 64 | } |
| 66 | } | 65 | } |
| @@ -228,13 +227,13 @@ static int zlib_decompress_setup(struct crypto_pcomp *tfm, void *params, | |||
| 228 | ? nla_get_u32(tb[ZLIB_DECOMP_WINDOWBITS]) | 227 | ? nla_get_u32(tb[ZLIB_DECOMP_WINDOWBITS]) |
| 229 | : DEF_WBITS; | 228 | : DEF_WBITS; |
| 230 | 229 | ||
| 231 | stream->workspace = kzalloc(zlib_inflate_workspacesize(), GFP_KERNEL); | 230 | stream->workspace = vzalloc(zlib_inflate_workspacesize()); |
| 232 | if (!stream->workspace) | 231 | if (!stream->workspace) |
| 233 | return -ENOMEM; | 232 | return -ENOMEM; |
| 234 | 233 | ||
| 235 | ret = zlib_inflateInit2(stream, ctx->decomp_windowBits); | 234 | ret = zlib_inflateInit2(stream, ctx->decomp_windowBits); |
| 236 | if (ret != Z_OK) { | 235 | if (ret != Z_OK) { |
| 237 | kfree(stream->workspace); | 236 | vfree(stream->workspace); |
| 238 | stream->workspace = NULL; | 237 | stream->workspace = NULL; |
| 239 | return -EINVAL; | 238 | return -EINVAL; |
| 240 | } | 239 | } |
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index 4b70311a11ef..74be989f51c5 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <linux/zlib.h> | 49 | #include <linux/zlib.h> |
| 50 | #include <linux/io.h> | 50 | #include <linux/io.h> |
| 51 | #include <linux/stringify.h> | 51 | #include <linux/stringify.h> |
| 52 | #include <linux/vmalloc.h> | ||
| 52 | 53 | ||
| 53 | #define BNX2X_MAIN | 54 | #define BNX2X_MAIN |
| 54 | #include "bnx2x.h" | 55 | #include "bnx2x.h" |
| @@ -4537,8 +4538,7 @@ static int bnx2x_gunzip_init(struct bnx2x *bp) | |||
| 4537 | if (bp->strm == NULL) | 4538 | if (bp->strm == NULL) |
| 4538 | goto gunzip_nomem2; | 4539 | goto gunzip_nomem2; |
| 4539 | 4540 | ||
| 4540 | bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(), | 4541 | bp->strm->workspace = vmalloc(zlib_inflate_workspacesize()); |
| 4541 | GFP_KERNEL); | ||
| 4542 | if (bp->strm->workspace == NULL) | 4542 | if (bp->strm->workspace == NULL) |
| 4543 | goto gunzip_nomem3; | 4543 | goto gunzip_nomem3; |
| 4544 | 4544 | ||
| @@ -4562,7 +4562,7 @@ gunzip_nomem1: | |||
| 4562 | static void bnx2x_gunzip_end(struct bnx2x *bp) | 4562 | static void bnx2x_gunzip_end(struct bnx2x *bp) |
| 4563 | { | 4563 | { |
| 4564 | if (bp->strm) { | 4564 | if (bp->strm) { |
| 4565 | kfree(bp->strm->workspace); | 4565 | vfree(bp->strm->workspace); |
| 4566 | kfree(bp->strm); | 4566 | kfree(bp->strm); |
| 4567 | bp->strm = NULL; | 4567 | bp->strm = NULL; |
| 4568 | } | 4568 | } |
diff --git a/drivers/net/ppp_deflate.c b/drivers/net/ppp_deflate.c index 31e9407a0739..1dbdf82a6dfd 100644 --- a/drivers/net/ppp_deflate.c +++ b/drivers/net/ppp_deflate.c | |||
| @@ -305,7 +305,7 @@ static void z_decomp_free(void *arg) | |||
| 305 | 305 | ||
| 306 | if (state) { | 306 | if (state) { |
| 307 | zlib_inflateEnd(&state->strm); | 307 | zlib_inflateEnd(&state->strm); |
| 308 | kfree(state->strm.workspace); | 308 | vfree(state->strm.workspace); |
| 309 | kfree(state); | 309 | kfree(state); |
| 310 | } | 310 | } |
| 311 | } | 311 | } |
| @@ -345,8 +345,7 @@ static void *z_decomp_alloc(unsigned char *options, int opt_len) | |||
| 345 | 345 | ||
| 346 | state->w_size = w_size; | 346 | state->w_size = w_size; |
| 347 | state->strm.next_out = NULL; | 347 | state->strm.next_out = NULL; |
| 348 | state->strm.workspace = kmalloc(zlib_inflate_workspacesize(), | 348 | state->strm.workspace = vmalloc(zlib_inflate_workspacesize()); |
| 349 | GFP_KERNEL|__GFP_REPEAT); | ||
| 350 | if (state->strm.workspace == NULL) | 349 | if (state->strm.workspace == NULL) |
| 351 | goto out_free; | 350 | goto out_free; |
| 352 | 351 | ||
