]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
zram: filter out recomp targets based on priority
authorSergey Senozhatsky <senozhatsky@chromium.org>
Fri, 21 Feb 2025 22:25:39 +0000 (07:25 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 28 Feb 2025 01:00:23 +0000 (17:00 -0800)
Do no select for post processing slots that are already compressed with
same or higher priority compression algorithm.

This should save some memory, as previously we would still put those
entries into corresponding post-processing buckets and filter them out
later in recompress_slot().

Link: https://lkml.kernel.org/r/20250221222958.2225035-9-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
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 b32b959046af6a47f535864daec3050261bc6e65..92908495c90408166a600c50db6d623dfb852f6b 100644 (file)
@@ -1827,7 +1827,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec,
 #define RECOMPRESS_IDLE                (1 << 0)
 #define RECOMPRESS_HUGE                (1 << 1)
 
-static int scan_slots_for_recompress(struct zram *zram, u32 mode,
+static int scan_slots_for_recompress(struct zram *zram, u32 mode, u32 prio_max,
                                     struct zram_pp_ctl *ctl)
 {
        unsigned long nr_pages = zram->disksize >> PAGE_SHIFT;
@@ -1859,6 +1859,10 @@ static int scan_slots_for_recompress(struct zram *zram, u32 mode,
                    zram_test_flag(zram, index, ZRAM_INCOMPRESSIBLE))
                        goto next;
 
+               /* Already compressed with same of higher priority */
+               if (zram_get_priority(zram, index) + 1 >= prio_max)
+                       goto next;
+
                pps->index = index;
                place_pp_slot(zram, ctl, pps);
                pps = NULL;
@@ -1915,6 +1919,16 @@ static int recompress_slot(struct zram *zram, u32 index, struct page *page,
        zram_clear_flag(zram, index, ZRAM_IDLE);
 
        class_index_old = zs_lookup_class_index(zram->mem_pool, comp_len_old);
+
+       prio = max(prio, zram_get_priority(zram, index) + 1);
+       /*
+        * Recompression slots scan should not select slots that are
+        * already compressed with a higher priority algorithm, but
+        * just in case
+        */
+       if (prio >= prio_max)
+               return 0;
+
        /*
         * Iterate the secondary comp algorithms list (in order of priority)
         * and try to recompress the page.
@@ -1923,13 +1937,6 @@ static int recompress_slot(struct zram *zram, u32 index, struct page *page,
                if (!zram->comps[prio])
                        continue;
 
-               /*
-                * Skip if the object is already re-compressed with a higher
-                * priority algorithm (or same algorithm).
-                */
-               if (prio <= zram_get_priority(zram, index))
-                       continue;
-
                num_recomps++;
                zstrm = zcomp_stream_get(zram->comps[prio]);
                src = kmap_local_page(page);
@@ -2154,7 +2161,7 @@ static ssize_t recompress_store(struct device *dev,
                goto release_init_lock;
        }
 
-       scan_slots_for_recompress(zram, mode, ctl);
+       scan_slots_for_recompress(zram, mode, prio_max, ctl);
 
        ret = len;
        while ((pps = select_pp_slot(ctl))) {