aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/pending-4.4/061-softirq-let-ksoftirqd-do-its-job.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/pending-4.4/061-softirq-let-ksoftirqd-do-its-job.patch')
-rw-r--r--target/linux/generic/pending-4.4/061-softirq-let-ksoftirqd-do-its-job.patch83
1 files changed, 0 insertions, 83 deletions
diff --git a/target/linux/generic/pending-4.4/061-softirq-let-ksoftirqd-do-its-job.patch b/target/linux/generic/pending-4.4/061-softirq-let-ksoftirqd-do-its-job.patch
deleted file mode 100644
index a2de48093c..0000000000
--- a/target/linux/generic/pending-4.4/061-softirq-let-ksoftirqd-do-its-job.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From: Eric Dumazet <edumazet@google.com>
-Date: Wed, 31 Aug 2016 10:42:29 -0700
-Subject: [PATCH] softirq: let ksoftirqd do its job
-
-A while back, Paolo and Hannes sent an RFC patch adding threaded-able
-napi poll loop support : (https://patchwork.ozlabs.org/patch/620657/)
-
-The problem seems to be that softirqs are very aggressive and are often
-handled by the current process, even if we are under stress and that
-ksoftirqd was scheduled, so that innocent threads would have more chance
-to make progress.
-
-This patch makes sure that if ksoftirq is running, we let it
-perform the softirq work.
-
-Jonathan Corbet summarized the issue in https://lwn.net/Articles/687617/
-
-Tested:
-
- - NIC receiving traffic handled by CPU 0
- - UDP receiver running on CPU 0, using a single UDP socket.
- - Incoming flood of UDP packets targeting the UDP socket.
-
-Before the patch, the UDP receiver could almost never get cpu cycles and
-could only receive ~2,000 packets per second.
-
-After the patch, cpu cycles are split 50/50 between user application and
-ksoftirqd/0, and we can effectively read ~900,000 packets per second,
-a huge improvement in DOS situation. (Note that more packets are now
-dropped by the NIC itself, since the BH handlers get less cpu cycles to
-drain RX ring buffer)
-
-Since the load runs in well identified threads context, an admin can
-more easily tune process scheduling parameters if needed.
-
-Reported-by: Paolo Abeni <pabeni@redhat.com>
-Reported-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Cc: David Miller <davem@davemloft.net
-Cc: Jesper Dangaard Brouer <jbrouer@redhat.com>
-Cc: Peter Zijlstra <peterz@infradead.org>
-Cc: Rik van Riel <riel@redhat.com>
----
-
---- a/kernel/softirq.c
-+++ b/kernel/softirq.c
-@@ -78,6 +78,17 @@ static void wakeup_softirqd(void)
- }
-
- /*
-+ * If ksoftirqd is scheduled, we do not want to process pending softirqs
-+ * right now. Let ksoftirqd handle this at its own rate, to get fairness.
-+ */
-+static bool ksoftirqd_running(void)
-+{
-+ struct task_struct *tsk = __this_cpu_read(ksoftirqd);
-+
-+ return tsk && (tsk->state == TASK_RUNNING);
-+}
-+
-+/*
- * preempt_count and SOFTIRQ_OFFSET usage:
- * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving
- * softirq processing.
-@@ -313,7 +324,7 @@ asmlinkage __visible void do_softirq(voi
-
- pending = local_softirq_pending();
-
-- if (pending)
-+ if (pending && !ksoftirqd_running())
- do_softirq_own_stack();
-
- local_irq_restore(flags);
-@@ -340,6 +351,9 @@ void irq_enter(void)
-
- static inline void invoke_softirq(void)
- {
-+ if (ksoftirqd_running())
-+ return;
-+
- if (!force_irqthreads) {
- #ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK
- /*