-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
kernel: add workaround for page_pool_release warnings
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
Showing
1 changed file
with
43 additions
and
0 deletions.
There are no files selected for viewing
43 changes: 43 additions & 0 deletions
43
target/linux/generic/hack-6.6/610-net-page_pool-try-to-free-deferred-skbs-while-waitin.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |