All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] scheduler: convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s
@ 2013-03-18 19:22 Tejun Heo
  2013-03-18 19:32 ` Steven Rostedt
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Tejun Heo @ 2013-03-18 19:22 UTC (permalink / raw)
  To: Ingo Molnar, Peter Zijlstra; +Cc: linux-kernel, Steven Rostedt

try_to_wake_up_local() should only be invoked to wake up another task
in the same runqueue and BUG_ON()s are used to enforce the rule.
Missing try_to_wake_up_local() can stall workqueue execution but such
stalls are likely to be finite either by another work item being
queued or the one blocked getting unblocked.  There's no reason to
trigger BUG while holding rq lock crashing the whole system.

Convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 kernel/sched/core.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 7f12624..a2eda4d 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1498,8 +1498,10 @@ static void try_to_wake_up_local(struct task_struct *p)
 {
 	struct rq *rq = task_rq(p);
 
-	BUG_ON(rq != this_rq());
-	BUG_ON(p == current);
+	if (WARN_ON_ONCE(rq != this_rq()) ||
+	    WARN_ON_ONCE(p == current))
+		return;
+
 	lockdep_assert_held(&rq->lock);
 
 	if (!raw_spin_trylock(&p->pi_lock)) {

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] scheduler: convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s
  2013-03-18 19:22 [PATCH] scheduler: convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s Tejun Heo
@ 2013-03-18 19:32 ` Steven Rostedt
  2013-03-19 10:14 ` Peter Zijlstra
  2013-03-21 18:14 ` [tip:sched/urgent] sched: Convert BUG_ON() s " tip-bot for Tejun Heo
  2 siblings, 0 replies; 5+ messages in thread
From: Steven Rostedt @ 2013-03-18 19:32 UTC (permalink / raw)
  To: Tejun Heo
  Cc: Ingo Molnar, Peter Zijlstra, linux-kernel, Thomas Gleixner,
	Clark Williams

On Mon, 2013-03-18 at 12:22 -0700, Tejun Heo wrote:
> try_to_wake_up_local() should only be invoked to wake up another task
> in the same runqueue and BUG_ON()s are used to enforce the rule.
> Missing try_to_wake_up_local() can stall workqueue execution but such
> stalls are likely to be finite either by another work item being
> queued or the one blocked getting unblocked.  There's no reason to
> trigger BUG while holding rq lock crashing the whole system.
> 
> Convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s.
> 
> Signed-off-by: Tejun Heo <tj@kernel.org>
> Cc: Steven Rostedt <rostedt@goodmis.org>

Acked-by: Steven Rostedt <rostedt@goodmis.org>

-- Steve

> ---
>  kernel/sched/core.c |    6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 7f12624..a2eda4d 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -1498,8 +1498,10 @@ static void try_to_wake_up_local(struct task_struct *p)
>  {
>  	struct rq *rq = task_rq(p);
>  
> -	BUG_ON(rq != this_rq());
> -	BUG_ON(p == current);
> +	if (WARN_ON_ONCE(rq != this_rq()) ||
> +	    WARN_ON_ONCE(p == current))
> +		return;
> +
>  	lockdep_assert_held(&rq->lock);
>  
>  	if (!raw_spin_trylock(&p->pi_lock)) {



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] scheduler: convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s
  2013-03-18 19:22 [PATCH] scheduler: convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s Tejun Heo
  2013-03-18 19:32 ` Steven Rostedt
@ 2013-03-19 10:14 ` Peter Zijlstra
  2013-03-19 11:29   ` Steven Rostedt
  2013-03-21 18:14 ` [tip:sched/urgent] sched: Convert BUG_ON() s " tip-bot for Tejun Heo
  2 siblings, 1 reply; 5+ messages in thread
From: Peter Zijlstra @ 2013-03-19 10:14 UTC (permalink / raw)
  To: Tejun Heo; +Cc: Ingo Molnar, linux-kernel, Steven Rostedt

On Mon, 2013-03-18 at 12:22 -0700, Tejun Heo wrote:
> try_to_wake_up_local() should only be invoked to wake up another task
> in the same runqueue and BUG_ON()s are used to enforce the rule.
> Missing try_to_wake_up_local() can stall workqueue execution but such
> stalls are likely to be finite either by another work item being
> queued or the one blocked getting unblocked.  There's no reason to
> trigger BUG while holding rq lock crashing the whole system.
> 
> Convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s.

Doesn't really matter either way, the printk()s triggered by either
will very likely kill the system anyhow ;-)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] scheduler: convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s
  2013-03-19 10:14 ` Peter Zijlstra
@ 2013-03-19 11:29   ` Steven Rostedt
  0 siblings, 0 replies; 5+ messages in thread
From: Steven Rostedt @ 2013-03-19 11:29 UTC (permalink / raw)
  To: Peter Zijlstra; +Cc: Tejun Heo, Ingo Molnar, linux-kernel

On Tue, 2013-03-19 at 11:14 +0100, Peter Zijlstra wrote:
> On Mon, 2013-03-18 at 12:22 -0700, Tejun Heo wrote:
> > try_to_wake_up_local() should only be invoked to wake up another task
> > in the same runqueue and BUG_ON()s are used to enforce the rule.
> > Missing try_to_wake_up_local() can stall workqueue execution but such
> > stalls are likely to be finite either by another work item being
> > queued or the one blocked getting unblocked.  There's no reason to
> > trigger BUG while holding rq lock crashing the whole system.
> > 
> > Convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s.
> 
> Doesn't really matter either way, the printk()s triggered by either
> will very likely kill the system anyhow ;-)

Only if something blocks on the console lock, and it tries to wake it
up. But even then, it has to be a reverse rq locking order, or wakeup on
the same rq that its running on (which is very unlikely).

I admit that it doesn't "solve" the bug. But at least there's a chance
to investigate what happened when the bug does occur. Right now we have
only one conclusion when the bug triggers, and that's a hard lockup.

-- Steve



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [tip:sched/urgent] sched: Convert BUG_ON() s in try_to_wake_up_local() to WARN_ON_ONCE()s
  2013-03-18 19:22 [PATCH] scheduler: convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s Tejun Heo
  2013-03-18 19:32 ` Steven Rostedt
  2013-03-19 10:14 ` Peter Zijlstra
@ 2013-03-21 18:14 ` tip-bot for Tejun Heo
  2 siblings, 0 replies; 5+ messages in thread
From: tip-bot for Tejun Heo @ 2013-03-21 18:14 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, rostedt, peterz, tj, tglx

Commit-ID:  383efcd00053ec40023010ce5034bd702e7ab373
Gitweb:     http://git.kernel.org/tip/383efcd00053ec40023010ce5034bd702e7ab373
Author:     Tejun Heo <tj@kernel.org>
AuthorDate: Mon, 18 Mar 2013 12:22:34 -0700
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Thu, 21 Mar 2013 11:48:20 +0100

sched: Convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s

try_to_wake_up_local() should only be invoked to wake up another
task in the same runqueue and BUG_ON()s are used to enforce the
rule. Missing try_to_wake_up_local() can stall workqueue
execution but such stalls are likely to be finite either by
another work item being queued or the one blocked getting
unblocked.  There's no reason to trigger BUG while holding rq
lock crashing the whole system.

Convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20130318192234.GD3042@htj.dyndns.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 kernel/sched/core.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index b7b03cd..306943f 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1488,8 +1488,10 @@ static void try_to_wake_up_local(struct task_struct *p)
 {
 	struct rq *rq = task_rq(p);
 
-	BUG_ON(rq != this_rq());
-	BUG_ON(p == current);
+	if (WARN_ON_ONCE(rq != this_rq()) ||
+	    WARN_ON_ONCE(p == current))
+		return;
+
 	lockdep_assert_held(&rq->lock);
 
 	if (!raw_spin_trylock(&p->pi_lock)) {

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-03-21 18:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-18 19:22 [PATCH] scheduler: convert BUG_ON()s in try_to_wake_up_local() to WARN_ON_ONCE()s Tejun Heo
2013-03-18 19:32 ` Steven Rostedt
2013-03-19 10:14 ` Peter Zijlstra
2013-03-19 11:29   ` Steven Rostedt
2013-03-21 18:14 ` [tip:sched/urgent] sched: Convert BUG_ON() s " tip-bot for Tejun Heo

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.