| From: Sergey Senozhatsky <senozhatsky@chromium.org> |
| Subject: zram: support compression level comp config |
| Date: Wed, 15 May 2024 16:12:49 +0900 |
| |
| Add support for compression level level=N comp configuration to |
| comp_algorithm and recomp_algorithm knobs. |
| |
| Note that zram cannot verify ranges, it's a task of corresponding backends |
| to make sure that level makes sense. |
| |
| Link: https://lkml.kernel.org/r/20240515071645.1788128-13-senozhatsky@chromium.org |
| Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org> |
| Cc: Minchan Kim <minchan@kernel.org> |
| Cc: Nick Terrell <terrelln@fb.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| drivers/block/zram/zram_drv.c | 30 ++++++++++++++++++++++++++++-- |
| 1 file changed, 28 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/block/zram/zram_drv.c~zram-support-compression-level-comp-config |
| +++ a/drivers/block/zram/zram_drv.c |
| @@ -998,6 +998,12 @@ static int __comp_algorithm_store(struct |
| return 0; |
| } |
| |
| +static int comp_config_store(struct zram *zram, u32 prio, s32 level) |
| +{ |
| + zram->configs[prio].level = level; |
| + return 0; |
| +} |
| + |
| static ssize_t comp_algorithm_show(struct device *dev, |
| struct device_attribute *attr, |
| char *buf) |
| @@ -1015,6 +1021,7 @@ static ssize_t comp_algorithm_store(stru |
| struct zram *zram = dev_to_zram(dev); |
| char *args, *param, *val; |
| char *alg = NULL; |
| + s32 level = ZCOMP_CONFIG_NO_LEVEL; |
| int ret; |
| |
| args = skip_spaces(buf); |
| @@ -1034,12 +1041,21 @@ static ssize_t comp_algorithm_store(stru |
| alg = val; |
| continue; |
| } |
| + |
| + if (!strcmp(param, "level")) { |
| + ret = kstrtoint(val, 10, &level); |
| + if (ret) |
| + return ret; |
| + continue; |
| + } |
| } |
| |
| if (!alg) |
| return -EINVAL; |
| |
| - ret = __comp_algorithm_store(zram, ZRAM_PRIMARY_COMP, alg); |
| + ret = comp_config_store(zram, ZRAM_PRIMARY_COMP, level); |
| + if (!ret) |
| + ret = __comp_algorithm_store(zram, ZRAM_PRIMARY_COMP, alg); |
| return ret ? ret : len; |
| } |
| |
| @@ -1072,6 +1088,7 @@ static ssize_t recomp_algorithm_store(st |
| int prio = ZRAM_SECONDARY_COMP; |
| char *args, *param, *val; |
| char *alg = NULL; |
| + s32 level = ZCOMP_CONFIG_NO_LEVEL; |
| int ret; |
| |
| args = skip_spaces(buf); |
| @@ -1092,6 +1109,13 @@ static ssize_t recomp_algorithm_store(st |
| return ret; |
| continue; |
| } |
| + |
| + if (!strcmp(param, "level")) { |
| + ret = kstrtoint(val, 10, &level); |
| + if (ret) |
| + return ret; |
| + continue; |
| + } |
| } |
| |
| if (!alg) |
| @@ -1100,7 +1124,9 @@ static ssize_t recomp_algorithm_store(st |
| if (prio < ZRAM_SECONDARY_COMP || prio >= ZRAM_MAX_COMPS) |
| return -EINVAL; |
| |
| - ret = __comp_algorithm_store(zram, prio, alg); |
| + ret = comp_config_store(zram, prio, level); |
| + if (!ret) |
| + ret = __comp_algorithm_store(zram, prio, alg); |
| return ret ? ret : len; |
| } |
| #endif |
| _ |