Re: [PATCH v5 tip/core/rcu 15/16] rcu: Make RCU-tasks wait for idle tasks

From: Paul E. McKenney
Date: Wed Aug 13 2014 - 10:43:42 EST


On Wed, Aug 13, 2014 at 10:13:01AM -0400, Steven Rostedt wrote:
> On Wed, 13 Aug 2014 16:07:05 +0200
> Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote:
>
> > On Wed, Aug 13, 2014 at 09:51:32AM -0400, Steven Rostedt wrote:
> >
> > > I still need to look at the patches, but if this is just for the idle
> > > case, then we don't need it. The idle case can be solved with a simple
> > > sched_on_each_cpu(). I need a way to solve waiting for processes to
> > > finish from a preemption point.
> > >
> > > That's all I want, and if we can remove the "idle" case and document it
> > > well that it's not covered and a sched_on_each_cpu() may be needed,
> > > then I'm fine with that.
> > >
> > > sched_on_each_cpu(dummy_op);
> > > call_rcu_tasks(free_tramp);
> >
> > Sure, but why not dtrt and push rcu_idle hooks all the way down into the
> > idle drivers if and where appropriate?
> >
> > There isn't _that_ much idle driver code. Also, some stuff should be
> > cleaned up; we're already calling stop_critical_timings() in the generic
> > idle code, and then calling it again in the cpuidle drivers.
>
> True, perhaps the rcu code should hook into the stop_critical_timings
> code?

Is that safe given that stop_critical_timings() is invoked around other things?
Let's see...

o drivers/acpi/acpi_pad.c, power_saving_thread().

Looks like a kthread that does idle injection. Currently, RCU
sees it as not a quiescent state. Would it kill these guys to
put in a comment or two about what this is for???

So adding rcu_idle_enter() and rcu_idle_exit() here might
actually fix a bug, though it is not clear how long this thing
actually runs. If only for a few milliseconds, no harm done.

o drivers/acpi/processor_idle.c, acpi_idle_do_entry().

Hmmm... Is the idle loop really simpler these days? Or is the
complexity just better hidden? :-/

So acpi_idle_do_entry() is called from several places, will chase
them down later. Does stop_critical_timings() nest?

o drivers/thermal/intel_powerclamp.c, clamp_thread().

Looks similar to power_saving_thread(), but for thermal control.
Probably short term, shouldn't be a problem either way.

o kernel/printk/printk.c, console_cont_flush().

call_console_drivers() certainly isn't idle. Might not use
RCU read sides, but...

o kernel/printk/printk.c, console_unlock()

Same as console_cont_flush().

So the first three look OK to hook rcu_idle_enter() and rcu_idle_exit()
into, but the last two don't look so good.

That said, if you are OK not tracing the stuff under stop_critical_timings(),
then I can use the RCU dyntick-idle state and not wake anything up.

Thanx, Paul

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/