From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> To: Steven Rostedt <rostedt@goodmis.org> Cc: linux-kernel@vger.kernel.org, linux-rt-users@vger.kernel.org, Carsten Emde <C.Emde@osadl.org>, Thomas Gleixner <tglx@linutronix.de>, Sebastian Andrzej Siewior <bigeasy@linutronix.de> Subject: [PATCH 07/16] softirq: Fix nohz pending issue for real Date: Wed, 13 Feb 2013 17:12:02 +0100 [thread overview] Message-ID: <1360771932-27150-8-git-send-email-bigeasy@linutronix.de> (raw) In-Reply-To: <1360771932-27150-1-git-send-email-bigeasy@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de> We really need to iterate through all softirqs to find a potentially blocked runner. T1 runs softirq X (that cleared pending bit for X) Interrupt raises softirq Y T1 gets blocked on a lock and lock owner is not runnable T1 schedules out CPU goes idle and complains about pending softirq Y. Now iterating over all softirqs lets us find the runner for X and eliminate Y from the to warn about list as well. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- kernel/softirq.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/kernel/softirq.c b/kernel/softirq.c index 385fcea..1a0145a 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -100,20 +100,15 @@ void softirq_check_pending_idle(void) { static int rate_limit; struct softirq_runner *sr = &__get_cpu_var(softirq_runners); - u32 warnpending, pending = local_softirq_pending(); + u32 warnpending = local_softirq_pending(); + int i; if (rate_limit >= 10) return; - warnpending = pending; - - while (pending) { - struct task_struct *tsk; - int i = __ffs(pending); - - pending &= ~(1 << i); + for (i = 0; i < NR_SOFTIRQS; i++) { + struct task_struct *tsk = sr->runner[i]; - tsk = sr->runner[i]; /* * The wakeup code in rtmutex.c wakes up the task * _before_ it sets pi_blocked_on to NULL under -- 1.7.10.4
WARNING: multiple messages have this Message-ID (diff)
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> To: Steven Rostedt <rostedt@goodmis.org> Cc: linux-kernel@vger.kernel.org, linux-rt-users@vger.kernel.org, Carsten Emde <C.Emde@osadl.org>, Thomas Gleixner <tglx@linutronix.de>, Sebastian Andrzej Siewior <bigeasy@linutronix.de> Subject: [PATCH 07/16] softirq: Fix nohz pending issue for real Date: Wed, 13 Feb 2013 17:12:02 +0100 [thread overview] Message-ID: <1360771932-27150-8-git-send-email-bigeasy@linutronix.de> (raw) In-Reply-To: <1360771932-27150-1-git-send-email-bigeasy@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de> We really need to iterate through all softirqs to find a potentially blocked runner. T1 runs softirq X (that cleared pending bit for X) Interrupt raises softirq Y T1 gets blocked on a lock and lock owner is not runnable T1 schedules out CPU goes idle and complains about pending softirq Y. Now iterating over all softirqs lets us find the runner for X and eliminate Y from the to warn about list as well. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- kernel/softirq.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/kernel/softirq.c b/kernel/softirq.c index 385fcea..1a0145a 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -100,20 +100,15 @@ void softirq_check_pending_idle(void) { static int rate_limit; struct softirq_runner *sr = &__get_cpu_var(softirq_runners); - u32 warnpending, pending = local_softirq_pending(); + u32 warnpending = local_softirq_pending(); + int i; if (rate_limit >= 10) return; - warnpending = pending; - - while (pending) { - struct task_struct *tsk; - int i = __ffs(pending);
next prev parent reply other threads:[~2013-02-13 16:13 UTC|newest] Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-02-13 16:11 [PREEMPT RT] SLUB and split softirq lock for v3.2-rt Sebastian Andrzej Siewior 2013-02-13 16:11 ` [PATCH 01/16] softirq: Make serving softirqs a task flag Sebastian Andrzej Siewior 2013-02-13 16:11 ` [PATCH 02/16] softirq: Split handling function Sebastian Andrzej Siewior 2013-02-13 16:11 ` [PATCH 03/16] softirq: Split softirq locks Sebastian Andrzej Siewior 2013-02-13 16:11 ` [PATCH 04/16] rcu: rcutiny: Prevent RCU stall Sebastian Andrzej Siewior 2013-02-16 20:59 ` Paul E. McKenney 2013-02-18 15:02 ` Steven Rostedt 2013-02-13 16:12 ` [PATCH 05/16] softirq: Adapt NOHZ softirq pending check to new RT scheme Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 06/16] softirq: Add more debugging Sebastian Andrzej Siewior 2013-02-13 16:12 ` Sebastian Andrzej Siewior [this message] 2013-02-13 16:12 ` [PATCH 07/16] softirq: Fix nohz pending issue for real Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 08/16] net: Use local_bh_disable in netif_rx_ni() Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 09/16] FIX [1/2] slub: Do not dereference NULL pointer in node_match Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 10/16] FIX [2/2] slub: Tid must be retrieved from the percpu area of the current processor Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 11/16] slub: Use correct cpu_slab on dead cpu Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 12/16] smp: introduce a generic on_each_cpu_mask() function Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 13/16] smp: add func to IPI cpus based on parameter func Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 14/16] slub: only IPI CPUs that have per cpu obj to flush Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 15/16] mm: Enable SLUB for RT Sebastian Andrzej Siewior 2013-02-13 16:12 ` [PATCH 16/16] slub: Enable irqs for __GFP_WAIT Sebastian Andrzej Siewior 2013-02-13 17:24 ` [PREEMPT RT] SLUB and split softirq lock for v3.2-rt Steven Rostedt 2013-02-13 17:41 ` Thomas Gleixner 2013-02-19 1:54 ` Li Zefan 2013-02-19 1:56 ` Li Zefan 2013-02-19 4:06 ` Steven Rostedt 2013-02-19 6:17 ` Mike Galbraith 2013-04-24 2:36 ` Steven Rostedt 2013-04-24 8:11 ` Sebastian Andrzej Siewior 2013-04-24 15:45 ` Steven Rostedt
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=1360771932-27150-8-git-send-email-bigeasy@linutronix.de \ --to=bigeasy@linutronix.de \ --cc=C.Emde@osadl.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-rt-users@vger.kernel.org \ --cc=rostedt@goodmis.org \ --cc=tglx@linutronix.de \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.