]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
zram: clear IDLE flag after recompression
authorSergey Senozhatsky <senozhatsky@chromium.org>
Mon, 28 Oct 2024 15:36:14 +0000 (00:36 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 1 Nov 2024 04:29:34 +0000 (21:29 -0700)
Patch series "zram: IDLE flag handling fixes", v2.

zram can wrongly preserve ZRAM_IDLE flag on its entries which can result
in premature post-processing (writeback and recompression) of such
entries.

This patch (of 2)

Recompression should clear ZRAM_IDLE flag on the entries it has accessed,
because otherwise some entries, specifically those for which recompression
has failed, become immediate candidate entries for another post-processing
(e.g.  writeback).

Consider the following case:
- recompression marks entries IDLE every 4 hours and attempts
  to recompress them
- some entries are incompressible, so we keep them intact and
  hence preserve IDLE flag
- writeback marks entries IDLE every 8 hours and writebacks
  IDLE entries, however we have IDLE entries left from
  recompression, so writeback prematurely writebacks those
  entries.

The bug was reported by Shin Kawamura.

Link: https://lkml.kernel.org/r/20241028153629.1479791-1-senozhatsky@chromium.org
Link: https://lkml.kernel.org/r/20241028153629.1479791-2-senozhatsky@chromium.org
Fixes: 84b33bf78889 ("zram: introduce recompress sysfs knob")
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Reported-by: Shin Kawamura <kawasin@google.com>
Acked-by: Brian Geffon <bgeffon@google.com>
Cc: Minchan Kim <minchan@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/zram_drv.c

index e6d12e81241d8449b4d939513e4ddd93bf02c335..a16dbffcdca3045118c22e16623294f9c9469413 100644 (file)
@@ -1864,6 +1864,13 @@ static int recompress_slot(struct zram *zram, u32 index, struct page *page,
        if (ret)
                return ret;
 
+       /*
+        * We touched this entry so mark it as non-IDLE. This makes sure that
+        * we don't preserve IDLE flag and don't incorrectly pick this entry
+        * for different post-processing type (e.g. writeback).
+        */
+       zram_clear_flag(zram, index, ZRAM_IDLE);
+
        class_index_old = zs_lookup_class_index(zram->mem_pool, comp_len_old);
        /*
         * Iterate the secondary comp algorithms list (in order of priority)