openwrt/target/linux/generic/hack-6.6/610-net-page_pool-try-to-free-deferred-skbs-while-waitin.patch
Mieczyslaw Nalewaj eff00e2fb1 generic: refresh hack patches
Refresh hack patches with make target/linux/refresh.

Fixes: 9508ca44eb57 ("kernel: backport improvement to page pool fragment handling from 6.7")
Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
(cherry picked from commit ee730a66e9c670ec2ee37ee2b207accd539e1d15)
2025-01-22 20:51:39 +01:00

44 lines
1.4 KiB
Diff

From: Felix Fietkau <nbd@nbd.name>
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 <nbd@nbd.name>
---
--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -873,12 +873,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;