From: John Stultz <jstultz@google.com>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Pavankumar Kondeti <pkondeti@codeaurora.org>,
John Dias <joaodias@google.com>,
"Connor O'Brien" <connoro@google.com>,
Rick Yiu <rickyiu@google.com>, John Kacur <jkacur@redhat.com>,
Qais Yousef <qais.yousef@arm.com>,
Chris Redpath <chris.redpath@arm.com>,
Abhijeet Dharmapurikar <adharmap@quicinc.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Juri Lelli <juri.lelli@redhat.com>,
Vincent Guittot <vincent.guittot@linaro.org>,
Dietmar Eggemann <dietmar.eggemann@arm.com>,
Steven Rostedt <rostedt@goodmis.org>,
Thomas Gleixner <tglx@linutronix.de>,
kernel-team@android.com,
Satya Durga Srinivasu Prabhala <satyap@codeaurora.org>,
"J . Avila" <elavila@google.com>,
John Stultz <jstultz@google.com>
Subject: [RFC PATCH v4 3/3] softirq: defer softirq processing to ksoftirqd if CPU is busy with RT
Date: Mon, 3 Oct 2022 23:20:33 +0000 [thread overview]
Message-ID: <20221003232033.3404802-4-jstultz@google.com> (raw)
In-Reply-To: <20221003232033.3404802-1-jstultz@google.com>
From: Pavankumar Kondeti <pkondeti@codeaurora.org>
Defer the softirq processing to ksoftirqd if a RT task is
running or queued on the current CPU. This complements the RT
task placement algorithm which tries to find a CPU that is not
currently busy with softirqs.
Currently NET_TX, NET_RX, BLOCK and IRQ_POLL softirqs are only
deferred as they can potentially run for long time.
Additionally, this patch stubs out ksoftirqd_running() logic,
in the CONFIG_RT_SOFTIRQ_OPTIMIZATION case, as deferring
potentially long-running softirqs will cause the logic to not
process shorter-running softirqs immediately. By stubbing it out
the potentially long running softirqs are deferred, but the
shorter running ones can still run immediately.
This patch includes folded-in fixes by:
Lingutla Chandrasekhar <clingutla@codeaurora.org>
Satya Durga Srinivasu Prabhala <satyap@codeaurora.org>
J. Avila <elavila@google.com>
Cc: John Dias <joaodias@google.com>
Cc: Connor O'Brien <connoro@google.com>
Cc: Rick Yiu <rickyiu@google.com>
Cc: John Kacur <jkacur@redhat.com>
Cc: Qais Yousef <qais.yousef@arm.com>
Cc: Chris Redpath <chris.redpath@arm.com>
Cc: Abhijeet Dharmapurikar <adharmap@quicinc.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: kernel-team@android.com
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
[satyap@codeaurora.org: trivial merge conflict resolution.]
Signed-off-by: Satya Durga Srinivasu Prabhala <satyap@codeaurora.org>
[elavila: Port to mainline, squash with bugfix]
Signed-off-by: J. Avila <elavila@google.com>
[jstultz: Rebase to linus/HEAD, minor rearranging of code,
included bug fix Reported-by: Qais Yousef <qais.yousef@arm.com> ]
Signed-off-by: John Stultz <jstultz@google.com>
---
v4:
* Fix commit message to accurately note long-running softirqs
(suggested by Qais)
* Switch to using rt_task(current) (suggested by Qais)
---
kernel/softirq.c | 29 +++++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/kernel/softirq.c b/kernel/softirq.c
index 35ee79dd8786..c8ce12bbab04 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -87,6 +87,7 @@ static void wakeup_softirqd(void)
wake_up_process(tsk);
}
+#ifndef CONFIG_RT_SOFTIRQ_OPTIMIZATION
/*
* 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,
@@ -101,6 +102,9 @@ static bool ksoftirqd_running(unsigned long pending)
return false;
return tsk && task_is_running(tsk) && !__kthread_should_park(tsk);
}
+#else
+#define ksoftirqd_running(pending) (false)
+#endif /* CONFIG_RT_SOFTIRQ_OPTIMIZATION */
#ifdef CONFIG_TRACE_IRQFLAGS
DEFINE_PER_CPU(int, hardirqs_enabled);
@@ -532,6 +536,21 @@ static inline bool lockdep_softirq_start(void) { return false; }
static inline void lockdep_softirq_end(bool in_hardirq) { }
#endif
+#ifdef CONFIG_RT_SOFTIRQ_OPTIMIZATION
+static __u32 softirq_deferred_for_rt(__u32 *pending)
+{
+ __u32 deferred = 0;
+
+ if (rt_task(current)) {
+ deferred = *pending & LONG_SOFTIRQ_MASK;
+ *pending &= ~LONG_SOFTIRQ_MASK;
+ }
+ return deferred;
+}
+#else
+#define softirq_deferred_for_rt(x) (0)
+#endif
+
asmlinkage __visible void __softirq_entry __do_softirq(void)
{
unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
@@ -539,6 +558,7 @@ asmlinkage __visible void __softirq_entry __do_softirq(void)
int max_restart = MAX_SOFTIRQ_RESTART;
struct softirq_action *h;
bool in_hardirq;
+ __u32 deferred;
__u32 pending;
int softirq_bit;
@@ -550,14 +570,16 @@ asmlinkage __visible void __softirq_entry __do_softirq(void)
current->flags &= ~PF_MEMALLOC;
pending = local_softirq_pending();
+ deferred = softirq_deferred_for_rt(&pending);
softirq_handle_begin();
+
in_hardirq = lockdep_softirq_start();
account_softirq_enter(current);
restart:
/* Reset the pending bitmask before enabling irqs */
- set_softirq_pending(0);
+ set_softirq_pending(deferred);
__this_cpu_write(active_softirqs, pending);
local_irq_enable();
@@ -596,13 +618,16 @@ asmlinkage __visible void __softirq_entry __do_softirq(void)
local_irq_disable();
pending = local_softirq_pending();
+ deferred = softirq_deferred_for_rt(&pending);
+
if (pending) {
if (time_before(jiffies, end) && !need_resched() &&
--max_restart)
goto restart;
+ }
+ if (pending | deferred)
wakeup_softirqd();
- }
account_softirq_exit(current);
lockdep_softirq_end(in_hardirq);
--
2.38.0.rc1.362.ged0d419d3c-goog
next prev parent reply other threads:[~2022-10-03 23:21 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-03 23:20 [RFC PATCH v4 0/3] Softirq -rt Optimizations John Stultz
2022-10-03 23:20 ` [RFC PATCH v4 1/3] softirq: Add generic accessor to percpu softirq_pending data John Stultz
2022-10-03 23:20 ` [RFC PATCH v4 2/3] sched: Avoid placing RT threads on cores handling long softirqs John Stultz
[not found] ` <20221004013611.1822-1-hdanton@sina.com>
2022-10-04 2:29 ` John Stultz
[not found] ` <20221005002149.1876-1-hdanton@sina.com>
2022-10-05 1:13 ` John Stultz
[not found] ` <20221005060155.1571-1-hdanton@sina.com>
2022-10-10 15:42 ` Qais Yousef
[not found] ` <20221011111846.284-1-hdanton@sina.com>
2022-10-12 14:10 ` Qais Yousef
2022-10-17 12:40 ` [PATCH RFC " Alexander Gordeev
2022-10-18 3:42 ` John Stultz
2022-10-18 3:59 ` John Stultz
2022-10-18 5:32 ` John Stultz
2022-10-19 9:11 ` Alexander Gordeev
2022-10-19 22:09 ` John Stultz
2022-10-20 0:15 ` Qais Yousef
2022-10-20 12:47 ` Alexander Gordeev
2022-10-22 18:34 ` Joel Fernandes
2022-10-23 7:45 ` Alexander Gordeev
2022-11-15 7:08 ` John Stultz
2022-11-15 12:55 ` Alexander Gordeev
2022-10-19 11:23 ` Qais Yousef
2022-10-22 18:28 ` [RFC PATCH " Joel Fernandes
2022-11-15 21:36 ` John Stultz
2022-10-03 23:20 ` John Stultz [this message]
2022-10-04 10:45 ` [RFC PATCH v4 3/3] softirq: defer softirq processing to ksoftirqd if CPU is busy with RT David Laight
2022-10-04 19:19 ` John Stultz
2022-10-10 16:09 ` Qais Yousef
2022-10-17 14:44 ` Qais Yousef
2022-10-18 0:04 ` John Stultz
2022-10-19 11:01 ` Qais Yousef
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221003232033.3404802-4-jstultz@google.com \
--to=jstultz@google.com \
--cc=adharmap@quicinc.com \
--cc=chris.redpath@arm.com \
--cc=connoro@google.com \
--cc=dietmar.eggemann@arm.com \
--cc=elavila@google.com \
--cc=jkacur@redhat.com \
--cc=joaodias@google.com \
--cc=juri.lelli@redhat.com \
--cc=kernel-team@android.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=pkondeti@codeaurora.org \
--cc=qais.yousef@arm.com \
--cc=rickyiu@google.com \
--cc=rostedt@goodmis.org \
--cc=satyap@codeaurora.org \
--cc=tglx@linutronix.de \
--cc=vincent.guittot@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox