History

rcu: Don't check irq nesting from rcu idle entry/exit

Because tasks do not nest, rcu_idle_enter() and rcu_idle_exit() do not need to check for nesting. This commit therefore moves nesting checks from rcu_idle_enter_common() to rcu_irq_exit() and from rcu_idle_exit_common() to rcu_irq_enter().

Frederic Weisbecker committed 14 years ago

Commit b6fc6021 parent 7cb92491 file · +8 −10Browse files

Unified · Split

kernel/rcutree.c+8−10
@@ -350,10 +350,6 @@ static int rcu_implicit_offline_qs(struct rcu_data *rdp) · 349 unmodified lines
350350 */
351351 static void rcu_idle_enter_common(struct rcu_dynticks *rdtp, long long oldval)
352352 {
353− if (rdtp->dynticks_nesting) {
354− trace_rcu_dyntick("--=", oldval, rdtp->dynticks_nesting);
355− return;
356− }
357353 trace_rcu_dyntick("Start", oldval, rdtp->dynticks_nesting);
358354 if (!is_idle_task(current)) {
359355 struct task_struct *idle = idle_task(smp_processor_id());
@@ -426,7 +422,10 @@ void rcu_irq_exit(void) · 66 unmodified lines
426422 oldval = rdtp->dynticks_nesting;
427423 rdtp->dynticks_nesting--;
428424 WARN_ON_ONCE(rdtp->dynticks_nesting < 0);
429− rcu_idle_enter_common(rdtp, oldval);
425+ if (rdtp->dynticks_nesting)
426+ trace_rcu_dyntick("--=", oldval, rdtp->dynticks_nesting);
427+ else
428+ rcu_idle_enter_common(rdtp, oldval);
430429 local_irq_restore(flags);
431430 }
432431
@@ -439,10 +438,6 @@ void rcu_irq_exit(void) · 6 unmodified lines
439438 */
440439 static void rcu_idle_exit_common(struct rcu_dynticks *rdtp, long long oldval)
441440 {
442− if (oldval) {
443− trace_rcu_dyntick("++=", oldval, rdtp->dynticks_nesting);
444− return;
445− }
446441 smp_mb__before_atomic_inc(); /* Force ordering w/previous sojourn. */
447442 atomic_inc(&rdtp->dynticks);
448443 /* CPUs seeing atomic_inc() must see later RCU read-side crit sects */
@@ -518,7 +513,10 @@ void rcu_irq_enter(void) · 69 unmodified lines
518513 oldval = rdtp->dynticks_nesting;
519514 rdtp->dynticks_nesting++;
520515 WARN_ON_ONCE(rdtp->dynticks_nesting == 0);
521− rcu_idle_exit_common(rdtp, oldval);
516+ if (oldval)
517+ trace_rcu_dyntick("++=", oldval, rdtp->dynticks_nesting);
518+ else
519+ rcu_idle_exit_common(rdtp, oldval);
522520 local_irq_restore(flags);
523521 }
524522