]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
zram: drop ->num_active_comps
authorSergey Senozhatsky <senozhatsky@chromium.org>
Wed, 11 Mar 2026 08:42:46 +0000 (17:42 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 5 Apr 2026 20:53:24 +0000 (13:53 -0700)
It's not entirely correct to use ->num_active_comps for max-prio limit, as
->num_active_comps just tells the number of configured algorithms, not the
max configured priority.  For instance, in the following theoretical
example:

    [lz4] [nil] [nil] [deflate]

->num_active_comps is 2, while the actual max-prio is 3.

Drop ->num_active_comps and use ZRAM_MAX_COMPS instead.

Link: https://lkml.kernel.org/r/20260311084312.1766036-4-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Suggested-by: Minchan Kim <minchan@kernel.org>
Cc: Brian Geffon <bgeffon@google.com>
Cc: gao xu <gaoxu2@honor.com>
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/zram_drv.c
drivers/block/zram/zram_drv.h

index 71c4e2d350ced1ffd56492841a8d7c90dfdeae41..74c522c14c787168dee740e96ad28c3ec74dc1ec 100644 (file)
@@ -2324,6 +2324,18 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec,
 #define RECOMPRESS_IDLE                (1 << 0)
 #define RECOMPRESS_HUGE                (1 << 1)
 
+static bool highest_priority_algorithm(struct zram *zram, u32 prio)
+{
+       u32 p;
+
+       for (p = prio + 1; p < ZRAM_MAX_COMPS; p++) {
+               if (zram->comp_algs[p])
+                       return false;
+       }
+
+       return true;
+}
+
 static int scan_slots_for_recompress(struct zram *zram, u32 mode, u32 prio_max,
                                     struct zram_pp_ctl *ctl)
 {
@@ -2471,12 +2483,11 @@ static int recompress_slot(struct zram *zram, u32 index, struct page *page,
                 * Secondary algorithms failed to re-compress the page
                 * in a way that would save memory.
                 *
-                * Mark the object incompressible if the max-priority
-                * algorithm couldn't re-compress it.
+                * Mark the object incompressible if the max-priority (the
+                * last configured one) algorithm couldn't re-compress it.
                 */
-               if (prio < zram->num_active_comps)
-                       return 0;
-               set_slot_flag(zram, index, ZRAM_INCOMPRESSIBLE);
+               if (highest_priority_algorithm(zram, prio))
+                       set_slot_flag(zram, index, ZRAM_INCOMPRESSIBLE);
                return 0;
        }
 
@@ -2608,12 +2619,6 @@ 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 out;
-       }
-
        if (prio < ZRAM_SECONDARY_COMP || prio >= ZRAM_MAX_COMPS) {
                ret = -EINVAL;
                goto out;
@@ -2826,7 +2831,6 @@ static void zram_destroy_comps(struct zram *zram)
                if (!comp)
                        continue;
                zcomp_destroy(comp);
-               zram->num_active_comps--;
        }
 
        for (prio = ZRAM_PRIMARY_COMP; prio < ZRAM_MAX_COMPS; prio++)
@@ -2891,7 +2895,6 @@ static ssize_t disksize_store(struct device *dev, struct device_attribute *attr,
                }
 
                zram->comps[prio] = comp;
-               zram->num_active_comps++;
        }
        zram->disksize = disksize;
        set_capacity_and_notify(zram->disk, zram->disksize >> SECTOR_SHIFT);
index f0de8f8218f5c3379cc907b97574d34fe86d3ba6..08d1774c15db619bc3483ad37d78fab3093b2d6c 100644 (file)
@@ -125,7 +125,6 @@ struct zram {
         */
        u64 disksize;   /* bytes */
        const char *comp_algs[ZRAM_MAX_COMPS];
-       s8 num_active_comps;
        /*
         * zram is claimed so open request will be failed
         */