mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 09:16:33 +00:00
zsmalloc: reset compaction source zspage pointer after putback_zspage()
The current implementation of the compaction loop fails to set the source
zspage pointer to NULL in all cases, leading to a potential issue where
__zs_compact() could use a stale zspage pointer. This pointer could even
point to a previously freed zspage, causing unexpected behavior in the
putback_zspage() and migrate_write_unlock() functions after returning from
the compaction loop.
Address the issue by ensuring that the source zspage pointer is always set
to NULL when it should be.
Link: https://lkml.kernel.org/r/20230417130850.1784777-1-senozhatsky@chromium.org
Fixes: 5a845e9f2d
("zsmalloc: rework compaction algorithm")
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Reported-by: Yu Zhao <yuzhao@google.com>
Tested-by: Yu Zhao <yuzhao@google.com>
Reviewed-by: Yosry Ahmed <yosryahmed@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
5f300fd59a
commit
f7ddb61256
@ -2239,8 +2239,8 @@ static unsigned long __zs_compact(struct zs_pool *pool,
|
||||
if (fg == ZS_INUSE_RATIO_0) {
|
||||
free_zspage(pool, class, src_zspage);
|
||||
pages_freed += class->pages_per_zspage;
|
||||
src_zspage = NULL;
|
||||
}
|
||||
src_zspage = NULL;
|
||||
|
||||
if (get_fullness_group(class, dst_zspage) == ZS_INUSE_RATIO_100
|
||||
|| spin_is_contended(&pool->lock)) {
|
||||
|
Loading…
Reference in New Issue
Block a user