Re: [PATCH] mm: zswap: return -ENOENT when the swap device is gone

From: Andrew Morton

Date: Sun Sep 13 2026 - 03:54:07 EST


On Sun, 13 Sep 2026 14:30:31 +0800 Baoquan He <hebaoquan@xxxxxxxxxx> wrote:

> zswap_writeback_entry() returns -EEXIST when get_swap_device() finds no
> device. -EEXIST is the shrinker's "page already in swap cache" signal,
> which makes zswap_shrinker_scan() stop shrinking entirely. A NULL
> get_swap_device() instead means the device is being swapped off, so the
> entry is simply stale.
>
> Return -ENOENT so the shrinker skips the stale entry and keeps scanning.
> Independent of xswap; affects all swap devices.
>
> ...
>
> --- a/mm/zswap.c
> +++ b/mm/zswap.c
> @@ -998,7 +998,7 @@ static int zswap_writeback_entry(struct zswap_entry *entry,
> /* try to allocate swap cache folio */

Comment was always lame ("say why, not what"). It now seems flat out wrong?

> si = get_swap_device(swpentry);
> if (!si)
> - return -EEXIST;
> + return -ENOENT;

mm-new has changed. I made this


/* try to allocate swap cache folio */
si = get_swap_device(swpentry);
if (IS_ERR_OR_NULL(si))
return -ENOENT;