Re: [PATCH v2] mm/zswap: publish the initial pool with list_add_rcu()

From: Nhat Pham

Date: Tue Sep 08 2026 - 13:35:00 EST


On Mon, Sep 7, 2026 at 6:28 PM Longlong Xia <xialonglong2025@xxxxxxx> wrote:
>
> From: Longlong Xia <xialonglong@xxxxxxxxxx>
>
> zswap_setup() publishes the pool on the zswap_pools list with a
> plain list_add(), but the list is walked by concurrent RCU readers
> holding nothing but rcu_read_lock() through zswap_total_pages(), e.g.
> /proc/meminfo and the shrinker count path.
>
> CPU 0 (writer) CPU 1 (reader)
> -------------- --------------
> zswap_pool_create():
> pool->zs_pool = zs_create_pool(); (1)
> list_add() -> __list_add():
> WRITE_ONCE(zswap_pools.next,
> &pool->list); (2) zswap_total_pages():
> pool = READ_ONCE( (a)
> zswap_pools.next);
> zs_get_total_pages( (b)
> pool->zs_pool);
>
> If (2) becomes visible to CPU 1 before (1), CPU 1 finds the pool at
> (a) but dereferences a wild pointer at (b). Publish the node with
> list_add_rcu().

Acked-by: Nhat Pham <nphamcs@xxxxxxxxx>