aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2011-11-17 12:48:14 -0500
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2011-12-11 13:31:57 -0500
commit1268fbc746ea1cd279886a740dcbad4ba5232225 (patch)
treedc0ff36b4114992a3f67479e25132f5e99f36b9e /kernel
parentb58bdccaa8d908e0f71dae396468a0d3f7bb3125 (diff)
nohz: Remove tick_nohz_idle_enter_norcu() / tick_nohz_idle_exit_norcu()
Those two APIs were provided to optimize the calls of tick_nohz_idle_enter() and rcu_idle_enter() into a single irq disabled section. This way no interrupt happening in-between would needlessly process any RCU job. Now we are talking about an optimization for which benefits have yet to be measured. Let's start simple and completely decouple idle rcu and dyntick idle logics to simplify. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Peter Zijlstra <peterz@infradead.org> Reviewed-by: Josh Triplett <josh@joshtriplett.org> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/time/tick-sched.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index c76aefe764b0..0ec8b832ab6b 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -454,21 +454,20 @@ out:
454 * When the next event is more than a tick into the future, stop the idle tick 454 * When the next event is more than a tick into the future, stop the idle tick
455 * Called when we start the idle loop. 455 * Called when we start the idle loop.
456 * 456 *
457 * If no use of RCU is made in the idle loop between 457 * The arch is responsible of calling:
458 * tick_nohz_idle_enter() and tick_nohz_idle_exit() calls, then
459 * tick_nohz_idle_enter_norcu() should be called instead and the arch
460 * doesn't need to call rcu_idle_enter() and rcu_idle_exit() explicitly.
461 *
462 * Otherwise the arch is responsible of calling:
463 * 458 *
464 * - rcu_idle_enter() after its last use of RCU before the CPU is put 459 * - rcu_idle_enter() after its last use of RCU before the CPU is put
465 * to sleep. 460 * to sleep.
466 * - rcu_idle_exit() before the first use of RCU after the CPU is woken up. 461 * - rcu_idle_exit() before the first use of RCU after the CPU is woken up.
467 */ 462 */
468void __tick_nohz_idle_enter(void) 463void tick_nohz_idle_enter(void)
469{ 464{
470 struct tick_sched *ts; 465 struct tick_sched *ts;
471 466
467 WARN_ON_ONCE(irqs_disabled());
468
469 local_irq_disable();
470
472 ts = &__get_cpu_var(tick_cpu_sched); 471 ts = &__get_cpu_var(tick_cpu_sched);
473 /* 472 /*
474 * set ts->inidle unconditionally. even if the system did not 473 * set ts->inidle unconditionally. even if the system did not
@@ -477,6 +476,8 @@ void __tick_nohz_idle_enter(void)
477 */ 476 */
478 ts->inidle = 1; 477 ts->inidle = 1;
479 tick_nohz_stop_sched_tick(ts); 478 tick_nohz_stop_sched_tick(ts);
479
480 local_irq_enable();
480} 481}
481 482
482/** 483/**