Commit dc75a0d9 authored by Sergey Senozhatsky's avatar Sergey Senozhatsky Committed by Andrew Morton
Browse files

zram: support deflate-specific params

Introduce support of algorithm specific parameters in algorithm_params
device attribute.  The expected format is algorithm.param=value.

For starters, add support for deflate.winbits parameter.

Link: https://lkml.kernel.org/r/20250514024825.1745489-3-senozhatsky@chromium.org


Signed-off-by: default avatarSergey Senozhatsky <senozhatsky@chromium.org>
Reviewed-by: default avatarMikhail Zaslonko <zaslonko@linux.ibm.com>
Cc: Minchan Kim <minchan@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent a5ade2e9
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@
#include "backend_deflate.h"

/* Use the same value as crypto API */
#define DEFLATE_DEF_WINBITS		11
#define DEFLATE_DEF_WINBITS		(-11)
#define DEFLATE_DEF_MEMLEVEL		MAX_MEM_LEVEL

struct deflate_ctx {
@@ -24,6 +24,8 @@ static int deflate_setup_params(struct zcomp_params *params)
{
	if (params->level == ZCOMP_PARAM_NOT_SET)
		params->level = Z_DEFAULT_COMPRESSION;
	if (params->deflate.winbits == ZCOMP_PARAM_NOT_SET)
		params->deflate.winbits = DEFLATE_DEF_WINBITS;

	return 0;
}
@@ -57,13 +59,13 @@ static int deflate_create(struct zcomp_params *params, struct zcomp_ctx *ctx)
		return -ENOMEM;

	ctx->context = zctx;
	sz = zlib_deflate_workspacesize(-DEFLATE_DEF_WINBITS, MAX_MEM_LEVEL);
	sz = zlib_deflate_workspacesize(params->deflate.winbits, MAX_MEM_LEVEL);
	zctx->cctx.workspace = vzalloc(sz);
	if (!zctx->cctx.workspace)
		goto error;

	ret = zlib_deflateInit2(&zctx->cctx, params->level, Z_DEFLATED,
				-DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL,
				params->deflate.winbits, DEFLATE_DEF_MEMLEVEL,
				Z_DEFAULT_STRATEGY);
	if (ret != Z_OK)
		goto error;
@@ -73,7 +75,7 @@ static int deflate_create(struct zcomp_params *params, struct zcomp_ctx *ctx)
	if (!zctx->dctx.workspace)
		goto error;

	ret = zlib_inflateInit2(&zctx->dctx, -DEFLATE_DEF_WINBITS);
	ret = zlib_inflateInit2(&zctx->dctx, params->deflate.winbits);
	if (ret != Z_OK)
		goto error;

+7 −0
Original line number Diff line number Diff line
@@ -7,6 +7,10 @@

#define ZCOMP_PARAM_NOT_SET	INT_MIN

struct deflate_params {
	s32 winbits;
};

/*
 * Immutable driver (backend) parameters. The driver may attach private
 * data to it (e.g. driver representation of the dictionary, etc.).
@@ -17,6 +21,9 @@ struct zcomp_params {
	void *dict;
	size_t dict_sz;
	s32 level;
	union {
		struct deflate_params deflate;
	};

	void *drv_data;
};
+15 −2
Original line number Diff line number Diff line
@@ -1277,12 +1277,14 @@ static void comp_params_reset(struct zram *zram, u32 prio)

	vfree(params->dict);
	params->level = ZCOMP_PARAM_NOT_SET;
	params->deflate.winbits = ZCOMP_PARAM_NOT_SET;
	params->dict_sz = 0;
	params->dict = NULL;
}

static int comp_params_store(struct zram *zram, u32 prio, s32 level,
			     const char *dict_path)
			     const char *dict_path,
			     struct deflate_params *deflate_params)
{
	ssize_t sz = 0;

@@ -1300,6 +1302,7 @@ static int comp_params_store(struct zram *zram, u32 prio, s32 level,

	zram->params[prio].dict_sz = sz;
	zram->params[prio].level = level;
	zram->params[prio].deflate.winbits = deflate_params->winbits;
	return 0;
}

@@ -1310,9 +1313,12 @@ static ssize_t algorithm_params_store(struct device *dev,
{
	s32 prio = ZRAM_PRIMARY_COMP, level = ZCOMP_PARAM_NOT_SET;
	char *args, *param, *val, *algo = NULL, *dict_path = NULL;
	struct deflate_params deflate_params;
	struct zram *zram = dev_to_zram(dev);
	int ret;

	deflate_params.winbits = ZCOMP_PARAM_NOT_SET;

	args = skip_spaces(buf);
	while (*args) {
		args = next_arg(args, &param, &val);
@@ -1343,6 +1349,13 @@ static ssize_t algorithm_params_store(struct device *dev,
			dict_path = val;
			continue;
		}

		if (!strcmp(param, "deflate.winbits")) {
			ret = kstrtoint(val, 10, &deflate_params.winbits);
			if (ret)
				return ret;
			continue;
		}
	}

	/* Lookup priority by algorithm name */
@@ -1364,7 +1377,7 @@ static ssize_t algorithm_params_store(struct device *dev,
	if (prio < ZRAM_PRIMARY_COMP || prio >= ZRAM_MAX_COMPS)
		return -EINVAL;

	ret = comp_params_store(zram, prio, level, dict_path);
	ret = comp_params_store(zram, prio, level, dict_path, &deflate_params);
	return ret ? ret : len;
}