All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Wu Fengguang <fengguang.wu@intel.com>
Cc: Steven Rostedt <rostedt@goodmis.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Ingo Molnar <mingo@elte.hu>, Lai Jiangshan <laijs@cn.fujitsu.com>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Carsten Emde <cbe@osadl.org>
Subject: Re: linux-next 20111025: warnings in rcu_idle_exit_common()/rcu_idle_enter_common()
Date: Wed, 2 Nov 2011 07:44:03 -0700	[thread overview]
Message-ID: <20111102144403.GA22445@linux.vnet.ibm.com> (raw)
In-Reply-To: <20111101163212.GA19501@localhost>

On Wed, Nov 02, 2011 at 12:32:12AM +0800, Wu Fengguang wrote:
> > Hmmmm...  Please see below for a diagnostic patch that prints out who
> > the kernel believes the idle thread is.  Could you please give this
> > a go?
> 
> Sure. Here it goes :)

And here is a possible fix.  Could you please test it?

							Thanx, Paul

------------------------------------------------------------------------

rcu: Fix idle-task checks

RCU has traditionally relied on idle_cpu() to determine whether a given
CPU is running in the context of an idle task, but recent changes have
invalidated this approach.  This commit therefore switches from idle_cpu
to "current->pid != 0".

Suggested-by: Carsten Emde <C.Emde@osadl.org>
Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

diff --git a/kernel/rcutiny.c b/kernel/rcutiny.c
index f4e7bc3..35f8a07 100644
--- a/kernel/rcutiny.c
+++ b/kernel/rcutiny.c
@@ -65,7 +65,7 @@ static void rcu_idle_enter_common(long long oldval)
 		return;
 	}
 	RCU_TRACE(trace_rcu_dyntick("Start", oldval, rcu_dynticks_nesting));
-	if (!idle_cpu(smp_processor_id())) {
+	if (current->pid != 0) {
 		struct task_struct *idle = idle_task(smp_processor_id());
 
 		RCU_TRACE(trace_rcu_dyntick("Error on entry: not idle task",
@@ -119,7 +119,7 @@ static void rcu_idle_exit_common(long long oldval)
 		return;
 	}
 	RCU_TRACE(trace_rcu_dyntick("End", oldval, rcu_dynticks_nesting));
-	if (!idle_cpu(smp_processor_id())) {
+	if (!current->pid != 0) {
 		struct task_struct *idle = idle_task(smp_processor_id());
 
 		RCU_TRACE(trace_rcu_dyntick("Error on exit: not idle task",
diff --git a/kernel/rcutree.c b/kernel/rcutree.c
index 3d7b474..414af68 100644
--- a/kernel/rcutree.c
+++ b/kernel/rcutree.c
@@ -355,7 +355,7 @@ static void rcu_idle_enter_common(struct rcu_dynticks *rdtp, long long oldval)
 		return;
 	}
 	trace_rcu_dyntick("Start", oldval, rdtp->dynticks_nesting);
-	if (!idle_cpu(smp_processor_id())) {
+	if (current->pid != 0) {
 		struct task_struct *idle = idle_task(smp_processor_id());
 
 		trace_rcu_dyntick("Error on entry: not idle task",
@@ -449,7 +449,7 @@ static void rcu_idle_exit_common(struct rcu_dynticks *rdtp, long long oldval)
 	smp_mb__after_atomic_inc();  /* See above. */
 	WARN_ON_ONCE(!(atomic_read(&rdtp->dynticks) & 0x1));
 	trace_rcu_dyntick("End", oldval, rdtp->dynticks_nesting);
-	if (!idle_cpu(smp_processor_id())) {
+	if (current->pid != 0) {
 		struct task_struct *idle = idle_task(smp_processor_id());
 
 		trace_rcu_dyntick("Error on exit: not idle task",


  reply	other threads:[~2011-11-02 14:58 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-31  8:26 linux-next 20111025: warnings in rcu_idle_exit_common()/rcu_idle_enter_common() Wu Fengguang
2011-10-31  9:51 ` Paul E. McKenney
2011-10-31 10:43   ` Wu Fengguang
2011-10-31 11:41     ` Wu Fengguang
2011-10-31 12:19       ` Paul E. McKenney
2011-10-31 15:44         ` Steven Rostedt
2011-11-01  0:34           ` Paul E. McKenney
2011-11-01  7:07             ` Wu Fengguang
2011-11-01 14:36               ` Carsten Emde
2011-11-01 15:03                 ` Paul E. McKenney
2011-11-01 16:00               ` Paul E. McKenney
2011-11-01 16:32                 ` Wu Fengguang
2011-11-02 14:44                   ` Paul E. McKenney [this message]
2011-11-02 14:51                     ` Steven Rostedt
2011-11-02 15:14                       ` Paul E. McKenney
2011-11-02 15:43                         ` Steven Rostedt
2011-11-03 16:09                           ` Paul E. McKenney
2011-11-02 14:56                     ` Steven Rostedt
2011-11-02 15:01                       ` Wu Fengguang
2011-11-02 15:14                         ` Paul E. McKenney
2011-11-02 15:14                       ` Paul E. McKenney
2011-10-31 12:31       ` Wu Fengguang
     [not found]         ` <20111031123708.GA6839@localhost>
2011-10-31 22:14           ` Paul E. McKenney
2011-11-10 16:35             ` Peter Zijlstra
2011-11-10 17:20               ` Paul E. McKenney
2011-11-10 18:33                 ` Peter Zijlstra
2011-11-01 17:34 ` Frederic Weisbecker
2011-11-01 18:36   ` Paul E. McKenney

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=20111102144403.GA22445@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=cbe@osadl.org \
    --cc=fengguang.wu@intel.com \
    --cc=fweisbec@gmail.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=rostedt@goodmis.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 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.