Thread (9 messages) flat view 9 messages, 4 authors, 2012-02-02
STALE5302d

[PATCH RFC idle 2/3] arm: Avoid invoking RCU when CPU is idle

From: Nicolas Pitre <hidden>
Date: 2012-02-02 17:13:00
Also in: linux-omap, linux-samsung-soc

Possibly related (same subject, not in this thread)

On Wed, 1 Feb 2012, Paul E. McKenney wrote:
On Wed, Feb 01, 2012 at 10:49:22PM -0500, Nicolas Pitre wrote:
quoted
On Wed, 1 Feb 2012, Paul E. McKenney wrote:
quoted
From: "Paul E. McKenney" <redacted>

The idle loop is a quiscent state for RCU, which means that RCU ignores
CPUs that have told RCU that they are idle via rcu_idle_enter().
There are nevertheless quite a few places where idle CPUs use RCU, most
commonly indirectly via tracing.  This patch fixes these problems for ARM.

Many of these bugs have been in the kernel for quite some time, but
Frederic's recent change now gives warnings.

This patch takes the straightforward approach of pushing the
rcu_idle_enter()/rcu_idle_exit() pair further down into the core of the
idle loop.
NAK.

1) This is going to conflict with a patch series I've pushed to RMK 
   already.  You can see its result in linux-next.

2) The purpose of (1) is to do precisely the very opposite i.e. move as 
   much common knowledge as possible up the idle call paths and leave 
   the platform specific quirks as bare as possible, if any.

So I'd much prefer if this change was constrained to be inside 
cpu_idle(), or at least in its close vicinity.
OK.  Then the tracing in the inner idle loop needs to go.  Other
restructuring might be required as well. 
Let me expand a bit more on the "if any" in my #2 above.  Most ARM 
sub-architectures don't have any special idle drivers and they simply 
rely on the default cpu_do_idle call.  What this proposed patch is doing 
is to move the rcu_idle_enter()/rcu_idle_exit() pair down into the few 
subarchs with an existing cpu-idle callback.  This means in practice 
that rcu_idle_enter()/rcu_idle_exit() wouldn't be called at all anymore 
on most ARM targets.  Is that appropriate?
The long and short of it is that you absolutely cannot use RCU between 
the time you invoke rcu_idle_enter() and the time you invoke 
rcu_idle_exit().  The ARM idle code currently does just that and 
therefore must change.

Whatever change you choose that causes the code to meet that constraint
is met is fine by me.

But that constraint absolutely must be met.
I would have to know more about what the rcu_idle_*() calls imply before 
suggesting an alternative.


Nicolas
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help