zram: limit max recompress prio to num_active_comps
authorSergey Senozhatsky <senozhatsky@chromium.org>
Mon, 3 Mar 2025 02:03:17 +0000 (11:03 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Mar 2025 05:06:34 +0000 (22:06 -0700)
Use the actual number of algorithms zram was configure with instead of
theoretical limit of ZRAM_MAX_COMPS.

Also make sure that min prio is not above max prio.

Link: https://lkml.kernel.org/r/20250303022425.285971-9-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Hillf Danton <hdanton@sina.com>
Cc: Kairui Song <ryncsn@gmail.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Yosry Ahmed <yosry.ahmed@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/zram_drv.c

index fc9321af3ef45d468163539845715fc6e60b798b..776c31606eec812ed839a4057be513f79f38531b 100644 (file)
@@ -2027,16 +2027,19 @@ static ssize_t recompress_store(struct device *dev,
                                struct device_attribute *attr,
                                const char *buf, size_t len)
 {
-       u32 prio = ZRAM_SECONDARY_COMP, prio_max = ZRAM_MAX_COMPS;
        struct zram *zram = dev_to_zram(dev);
        char *args, *param, *val, *algo = NULL;
        u64 num_recomp_pages = ULLONG_MAX;
        struct zram_pp_ctl *ctl = NULL;
        struct zram_pp_slot *pps;
        u32 mode = 0, threshold = 0;
+       u32 prio, prio_max;
        struct page *page;
        ssize_t ret;
 
+       prio = ZRAM_SECONDARY_COMP;
+       prio_max = zram->num_active_comps;
+
        args = skip_spaces(buf);
        while (*args) {
                args = next_arg(args, &param, &val);
@@ -2089,7 +2092,7 @@ static ssize_t recompress_store(struct device *dev,
                        if (prio == ZRAM_PRIMARY_COMP)
                                prio = ZRAM_SECONDARY_COMP;
 
-                       prio_max = min(prio + 1, ZRAM_MAX_COMPS);
+                       prio_max = prio + 1;
                        continue;
                }
        }
@@ -2117,7 +2120,7 @@ static ssize_t recompress_store(struct device *dev,
                                continue;
 
                        if (!strcmp(zram->comp_algs[prio], algo)) {
-                               prio_max = min(prio + 1, ZRAM_MAX_COMPS);
+                               prio_max = prio + 1;
                                found = true;
                                break;
                        }
@@ -2129,6 +2132,12 @@ static ssize_t recompress_store(struct device *dev,
                }
        }
 
+       prio_max = min(prio_max, (u32)zram->num_active_comps);
+       if (prio >= prio_max) {
+               ret = -EINVAL;
+               goto release_init_lock;
+       }
+
        page = alloc_page(GFP_KERNEL);
        if (!page) {
                ret = -ENOMEM;