Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ab24bfd authored by David S. Miller's avatar David S. Miller
Browse files

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: default avatarMartin Jackson <mjackson220.list@gmail.com>
Acked-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ed6e4ef8
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/net.h>
#include <linux/slab.h>

#define DEFLATE_DEF_LEVEL		Z_DEFAULT_COMPRESSION
#define DEFLATE_DEF_WINBITS		11
@@ -73,7 +72,7 @@ static int deflate_decomp_init(struct deflate_ctx *ctx)
	int ret = 0;
	struct z_stream_s *stream = &ctx->decomp_stream;

	stream->workspace = kzalloc(zlib_inflate_workspacesize(), GFP_KERNEL);
	stream->workspace = vzalloc(zlib_inflate_workspacesize());
	if (!stream->workspace) {
		ret = -ENOMEM;
		goto out;
@@ -86,7 +85,7 @@ static int deflate_decomp_init(struct deflate_ctx *ctx)
out:
	return ret;
out_free:
	kfree(stream->workspace);
	vfree(stream->workspace);
	goto out;
}

@@ -99,7 +98,7 @@ static void deflate_comp_exit(struct deflate_ctx *ctx)
static void deflate_decomp_exit(struct deflate_ctx *ctx)
{
	zlib_inflateEnd(&ctx->decomp_stream);
	kfree(ctx->decomp_stream.workspace);
	vfree(ctx->decomp_stream.workspace);
}

static int deflate_init(struct crypto_tfm *tfm)
+3 −4
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/net.h>
#include <linux/slab.h>

#include <crypto/internal/compress.h>

@@ -60,7 +59,7 @@ static void zlib_decomp_exit(struct zlib_ctx *ctx)

	if (stream->workspace) {
		zlib_inflateEnd(stream);
		kfree(stream->workspace);
		vfree(stream->workspace);
		stream->workspace = NULL;
	}
}
@@ -228,13 +227,13 @@ static int zlib_decompress_setup(struct crypto_pcomp *tfm, void *params,
				 ? nla_get_u32(tb[ZLIB_DECOMP_WINDOWBITS])
				 : DEF_WBITS;

	stream->workspace = kzalloc(zlib_inflate_workspacesize(), GFP_KERNEL);
	stream->workspace = vzalloc(zlib_inflate_workspacesize());
	if (!stream->workspace)
		return -ENOMEM;

	ret = zlib_inflateInit2(stream, ctx->decomp_windowBits);
	if (ret != Z_OK) {
		kfree(stream->workspace);
		vfree(stream->workspace);
		stream->workspace = NULL;
		return -EINVAL;
	}
+3 −3
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@
#include <linux/zlib.h>
#include <linux/io.h>
#include <linux/stringify.h>
#include <linux/vmalloc.h>

#define BNX2X_MAIN
#include "bnx2x.h"
@@ -4537,8 +4538,7 @@ static int bnx2x_gunzip_init(struct bnx2x *bp)
	if (bp->strm  == NULL)
		goto gunzip_nomem2;

	bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(),
				      GFP_KERNEL);
	bp->strm->workspace = vmalloc(zlib_inflate_workspacesize());
	if (bp->strm->workspace == NULL)
		goto gunzip_nomem3;

@@ -4562,7 +4562,7 @@ static int bnx2x_gunzip_init(struct bnx2x *bp)
static void bnx2x_gunzip_end(struct bnx2x *bp)
{
	if (bp->strm) {
		kfree(bp->strm->workspace);
		vfree(bp->strm->workspace);
		kfree(bp->strm);
		bp->strm = NULL;
	}
+2 −3
Original line number Diff line number Diff line
@@ -305,7 +305,7 @@ static void z_decomp_free(void *arg)

	if (state) {
		zlib_inflateEnd(&state->strm);
		kfree(state->strm.workspace);
		vfree(state->strm.workspace);
		kfree(state);
	}
}
@@ -345,8 +345,7 @@ static void *z_decomp_alloc(unsigned char *options, int opt_len)

	state->w_size         = w_size;
	state->strm.next_out  = NULL;
	state->strm.workspace = kmalloc(zlib_inflate_workspacesize(),
					GFP_KERNEL|__GFP_REPEAT);
	state->strm.workspace = vmalloc(zlib_inflate_workspacesize());
	if (state->strm.workspace == NULL)
		goto out_free;