Skip to content

Commit

Permalink
kernel: add workaround for page_pool_release warnings
Browse files Browse the repository at this point in the history
defer_list skbs held by NAPI can block releasing page pools.
Work around this by scheduling rx softirq on all CPUs while trying to release
a page pool.

Signed-off-by: Felix Fietkau <[email protected]>
(cherry picked from commit 2b70b32)
  • Loading branch information
nbd168 committed Jan 3, 2025
1 parent 9b96222 commit bbfebf8
Showing 1 changed file with 43 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
From: Felix Fietkau <[email protected]>
Date: Fri, 3 Jan 2025 19:29:00 +0100
Subject: [PATCH] net: page_pool: try to free deferred skbs while waiting for
pool release

The NAPI defer list can accumulate no longer used skbs, which can be reused
during alloc. If this happens on a CPU that otherwise does not do any
rx softirq processing, skbs can be held indefinitely, causing warnings
on releasing page pools.
Deal with this by scheduling rx softirq on all CPUs.

Patch by Lorenzo Bianconi

Signed-off-by: Felix Fietkau <[email protected]>
---

--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -862,12 +862,23 @@ static void page_pool_release_retry(stru
{
struct delayed_work *dwq = to_delayed_work(wq);
struct page_pool *pool = container_of(dwq, typeof(*pool), release_dw);
- int inflight;
+ int cpu, inflight;

inflight = page_pool_release(pool);
if (!inflight)
return;

+ /* Run NET_RX_SOFTIRQ in order to free pending skbs in softnet_data
+ * defer_list that can stay in the list until we have enough queued
+ * traffic.
+ */
+ for_each_online_cpu(cpu) {
+ struct softnet_data *sd = &per_cpu(softnet_data, cpu);
+
+ if (!cmpxchg(&sd->defer_ipi_scheduled, 0, 1))
+ smp_call_function_single_async(cpu, &sd->defer_csd);
+ }
+
/* Periodic warning */
if (time_after_eq(jiffies, pool->defer_warn)) {
int sec = (s32)((u32)jiffies - (u32)pool->defer_start) / HZ;

0 comments on commit bbfebf8

Please sign in to comment.