[PATCH net v1] net: page_pool: fix use-after-free in page_pool_recycle_ring_bulk()

From: Mina Almasry

Date: Fri Sep 25 2026 - 10:43:47 EST


With CONFIG_PAGE_POOL_STATS=y, page_pool_recycle_ring_bulk() updates
the recycle stats after dropping the producer lock. If it just recycled
the last inflight netmems of a pool being destroyed, page_pool_release()
can pass its producer-lock barrier and free the pool before
recycle_stat_add() runs.

Commit fcc680a647ba7 ("page_pool: allow mixing PPs within one bulk")
moved this stat update after the unlock. Commit 271683bb2cf32
("page_pool: Fix use-after-free in page_pool_recycle_in_ring") later
added the barrier, but only fixed page_pool_recycle_in_ring(). Move
the update back under the lock.

Fixes: fcc680a647ba7 ("page_pool: allow mixing PPs within one bulk")
Link: https://lore.kernel.org/r/179028939171.2160803.706522228583664641@xxxxxxxxxx
Cc: Kaifeng Wang <kaifengw@xxxxxxxxxx>
Cc: Dong Chenchen <dongchenchen2@xxxxxxxxxx>
Assisted-by: LLM
Signed-off-by: Mina Almasry <almasrymina@xxxxxxxxxx>
---
net/core/page_pool.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/core/page_pool.c b/net/core/page_pool.c
index 08d7f35cf6089..d7c88c0b67e53 100644
--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -951,8 +951,8 @@ static void page_pool_recycle_ring_bulk(struct page_pool *pool,
}
}

- page_pool_producer_unlock(pool, in_softirq);
recycle_stat_add(pool, ring, i);
+ page_pool_producer_unlock(pool, in_softirq);

/* Hopefully all pages were returned into ptr_ring */
if (likely(i == bulk_len))

base-commit: 11536ee3d3e0b1bd35b6f3f8df55a6053eb0c71d
--
2.56.0.rc1.315.gc6ed9934b7-goog