Skip to content

Commit 969d63e

Browse files
hnazakpm00
authored andcommitted
mm: zswap: fix pool refcount bug around shrink_worker()
When a zswap store fails due to the limit, it acquires a pool reference and queues the shrinker. When the shrinker runs, it drops the reference. However, there can be multiple store attempts before the shrinker wakes up and runs once. This results in reference leaks and eventual saturation warnings for the pool refcount. Fix this by dropping the reference again when the shrinker is already queued. This ensures one reference per shrinker run. Link: https://lkml.kernel.org/r/20231006160024.170748-1-hannes@cmpxchg.org Fixes: 45190f0 ("mm/zswap.c: add allocation hysteresis if pool limit is hit") Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Reported-by: Chris Mason <clm@fb.com> Acked-by: Nhat Pham <nphamcs@gmail.com> Cc: Vitaly Wool <vitaly.wool@konsulko.com> Cc: Domenico Cerasuolo <cerasuolodomenico@gmail.com> Cc: <stable@vger.kernel.org> [5.6+] Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 229e225 commit 969d63e

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

mm/zswap.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,8 +1383,8 @@ bool zswap_store(struct folio *folio)
13831383

13841384
shrink:
13851385
pool = zswap_pool_last_get();
1386-
if (pool)
1387-
queue_work(shrink_wq, &pool->shrink_work);
1386+
if (pool && !queue_work(shrink_wq, &pool->shrink_work))
1387+
zswap_pool_put(pool);
13881388
goto reject;
13891389
}
13901390

0 commit comments

Comments
 (0)