zram: clear IDLE flag after recompression
commitf852190966upstream. 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:84b33bf788("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> Cc: <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
f8cca70b0e
commit
9a8b989d89
@@ -1600,6 +1600,13 @@ static int zram_recompress(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)
|
||||
|
||||
Reference in New Issue
Block a user