aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorPaul E. McKenney <paul.mckenney@linaro.org>2011-11-02 10:38:25 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2011-12-11 13:31:44 -0500
commit11dbaa8cb79a6e4a234a134898436f717a663f01 (patch)
tree79d18cd1af72016fcc54768388e46253208abe2e /kernel
parentaea1b35e29e658d42d7ba2237f3aa7f93e18509d (diff)
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 commit 908a3283 (Fix idle_cpu()) has invalidated this approach. After commit 908a3283, idle_cpu() will return true if the current CPU is currently running the idle task, and will be doing so for the foreseeable future. RCU instead needs to know whether or not the current CPU is currently running the idle task, regardless of what the near future might bring. This commit therefore switches from idle_cpu() to "current->pid != 0". Reported-by: Wu Fengguang <fengguang.wu@intel.com> Suggested-by: Carsten Emde <C.Emde@osadl.org> Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org> Acked-by: Steven Rostedt <rostedt@goodmis.org> Tested-by: Wu Fengguang <fengguang.wu@intel.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/rcutiny.c4
-rw-r--r--kernel/rcutree.c4
2 files changed, 4 insertions, 4 deletions
diff --git a/kernel/rcutiny.c b/kernel/rcutiny.c
index 6d70ff71a875..4e16ce36fa03 100644
--- a/kernel/rcutiny.c
+++ b/kernel/rcutiny.c
@@ -64,7 +64,7 @@ static void rcu_idle_enter_common(long long oldval)
64 return; 64 return;
65 } 65 }
66 RCU_TRACE(trace_rcu_dyntick("Start", oldval, rcu_dynticks_nesting)); 66 RCU_TRACE(trace_rcu_dyntick("Start", oldval, rcu_dynticks_nesting));
67 if (!idle_cpu(smp_processor_id())) { 67 if (current->pid != 0) {
68 struct task_struct *idle = idle_task(smp_processor_id()); 68 struct task_struct *idle = idle_task(smp_processor_id());
69 69
70 RCU_TRACE(trace_rcu_dyntick("Error on entry: not idle task", 70 RCU_TRACE(trace_rcu_dyntick("Error on entry: not idle task",
@@ -118,7 +118,7 @@ static void rcu_idle_exit_common(long long oldval)
118 return; 118 return;
119 } 119 }
120 RCU_TRACE(trace_rcu_dyntick("End", oldval, rcu_dynticks_nesting)); 120 RCU_TRACE(trace_rcu_dyntick("End", oldval, rcu_dynticks_nesting));
121 if (!idle_cpu(smp_processor_id())) { 121 if (current->pid != 0) {
122 struct task_struct *idle = idle_task(smp_processor_id()); 122 struct task_struct *idle = idle_task(smp_processor_id());
123 123
124 RCU_TRACE(trace_rcu_dyntick("Error on exit: not idle task", 124 RCU_TRACE(trace_rcu_dyntick("Error on exit: not idle task",
diff --git a/kernel/rcutree.c b/kernel/rcutree.c
index b1711c48a7ec..49e0783fb200 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)
355 return; 355 return;
356 } 356 }
357 trace_rcu_dyntick("Start", oldval, rdtp->dynticks_nesting); 357 trace_rcu_dyntick("Start", oldval, rdtp->dynticks_nesting);
358 if (!idle_cpu(smp_processor_id())) { 358 if (current->pid != 0) {
359 struct task_struct *idle = idle_task(smp_processor_id()); 359 struct task_struct *idle = idle_task(smp_processor_id());
360 360
361 trace_rcu_dyntick("Error on entry: not idle task", 361 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)
449 smp_mb__after_atomic_inc(); /* See above. */ 449 smp_mb__after_atomic_inc(); /* See above. */
450 WARN_ON_ONCE(!(atomic_read(&rdtp->dynticks) & 0x1)); 450 WARN_ON_ONCE(!(atomic_read(&rdtp->dynticks) & 0x1));
451 trace_rcu_dyntick("End", oldval, rdtp->dynticks_nesting); 451 trace_rcu_dyntick("End", oldval, rdtp->dynticks_nesting);
452 if (!idle_cpu(smp_processor_id())) { 452 if (current->pid != 0) {
453 struct task_struct *idle = idle_task(smp_processor_id()); 453 struct task_struct *idle = idle_task(smp_processor_id());
454 454
455 trace_rcu_dyntick("Error on exit: not idle task", 455 trace_rcu_dyntick("Error on exit: not idle task",