Re: [PATCH RFC idle] Make arm, sh, and x86 stop using RCU when idle

From: Paul Mundt
Date: Wed Feb 01 2012 - 21:31:15 EST

On Wed, Feb 01, 2012 at 04:42:53PM -0800, Paul E. McKenney wrote:
> Hello!
> RCU's shiny new diagnostics (thank you, Frederic!) for using RCU when idle
> located a few problems in arm, sh, and x86. This patch series contains
> alleged fixes for these problems. And they are real problems -- if RCU
> believes that the CPU is idle, it is ignoring it. Which means that the
> idle CPU can say "rcu_read_lock()" all it like, but there will be no
> useful effect.
> I was tempted to break these up, but doing so is bad for bisectability.
Presumably the same changes will also need to be reflected in cpuidle?

If so, here's a start:

Signed-off-by: Paul Mundt <lethal@xxxxxxxxxxxx>


diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index 59f4261..97adcd4 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -18,6 +18,7 @@
#include <linux/ktime.h>
#include <linux/hrtimer.h>
#include <linux/module.h>
+#include <linux/rcupdate.h>
#include <trace/events/power.h>

#include "cpuidle.h"
@@ -89,6 +90,8 @@ int cpuidle_idle_call(void)
next_state = cpuidle_curr_governor->select(drv, dev);
if (need_resched()) {
+ rcu_idle_enter();
+ rcu_idle_exit();
return 0;

@@ -96,9 +99,11 @@ int cpuidle_idle_call(void)

trace_power_start(POWER_CSTATE, next_state, dev->cpu);
trace_cpu_idle(next_state, dev->cpu);
+ rcu_idle_enter();

entered_state = target_state->enter(dev, drv, next_state);

+ rcu_idle_exit();
trace_cpu_idle(PWR_EVENT_EXIT, dev->cpu);

@@ -173,8 +178,10 @@ static int poll_idle(struct cpuidle_device *dev,

t1 = ktime_get();
+ rcu_idle_enter();
while (!need_resched())
+ rcu_idle_exit();

t2 = ktime_get();
diff = ktime_to_us(ktime_sub(t2, t1));
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
Please read the FAQ at