Re: [PATCH, RFC] v4 scalable classic RCU implementation

From: Manfred Spraul
Date: Sat Sep 06 2008 - 12:37:57 EST


Hi Paul,

Paul E. McKenney wrote:
o The rcu_pending() and rcu_needs_cpu() primitives are now
much more aggressive about permitting CPUs to enter dynticks
idle mode. Only CPUs that have RCU callbacks are kept out
of dynticks idle mode.

I've noticed that right now rcu_enter_nohz() can be nested within rcu_irq_enter():
irq_exit() first calls tick_nohz_stop_sched_tick(), then rcu_irq_exit().
And tick_nohz_stop_sched_tick() can switch into nohz mode.

Is that intentional? Does rcupreempt support that? It broke my rcustate code on x86-64.

I would prefer if something like the attached patch is applied. What do you think?
Do you need the patch as well?

--
Manfred
diff --git a/kernel/softirq.c b/kernel/softirq.c
index ba20a90..cca5a83 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -284,10 +284,10 @@ void irq_exit(void)
invoke_softirq();

#ifdef CONFIG_NO_HZ
+ rcu_irq_exit(0);
/* Make sure that timer wheel updates are propagated */
if (!in_interrupt() && idle_cpu(smp_processor_id()) && !need_resched())
tick_nohz_stop_sched_tick(0);
- rcu_irq_exit(0);
#endif
preempt_enable_no_resched();
}