Commit a5fd9733a30d18d7ac23f17080e7e07bb3205b69

Authored by Thomas Gleixner
1 parent 3a5dc1fafb

tick/powerclamp: Remove tick_nohz_idle abuse

commit 4dbd27711cd9 "tick: export nohz tick idle symbols for module
use" was merged via the thermal tree without an explicit ack from the
relevant maintainers.

The exports are abused by the intel powerclamp driver which implements
a fake idle state from a sched FIFO task. This causes all kinds of
wreckage in the NOHZ core code which rightfully assumes that
tick_nohz_idle_enter/exit() are only called from the idle task itself.

Recent changes in the NOHZ core lead to a failure of the powerclamp
driver and now people try to hack completely broken and backwards
workarounds into the NOHZ core code. This is completely unacceptable
and just papers over the real problem. There are way more subtle
issues lurking around the corner.

The real solution is to fix the powerclamp driver by rewriting it with
a sane concept, but that's beyond the scope of this.

So the only solution for now is to remove the calls into the core NOHZ
code from the powerclamp trainwreck along with the exports.

Fixes: d6d71ee4a14a "PM: Introduce Intel PowerClamp Driver"
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Preeti U Murthy <preeti@linux.vnet.ibm.com>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Fengguang Wu <fengguang.wu@intel.com>
Cc: Frederic Weisbecker <frederic@kernel.org>
Cc: Pan Jacob jun <jacob.jun.pan@intel.com>
Cc: LKP <lkp@01.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Zhang Rui <rui.zhang@intel.com>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/alpine.DEB.2.11.1412181110110.17382@nanos
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

Showing 2 changed files with 0 additions and 4 deletions Side-by-side Diff

drivers/thermal/intel_powerclamp.c
... ... @@ -435,7 +435,6 @@
435 435 * allowed. thus jiffies are updated properly.
436 436 */
437 437 preempt_disable();
438   - tick_nohz_idle_enter();
439 438 /* mwait until target jiffies is reached */
440 439 while (time_before(jiffies, target_jiffies)) {
441 440 unsigned long ecx = 1;
... ... @@ -451,7 +450,6 @@
451 450 start_critical_timings();
452 451 atomic_inc(&idle_wakeup_counter);
453 452 }
454   - tick_nohz_idle_exit();
455 453 preempt_enable();
456 454 }
457 455 del_timer_sync(&wakeup_timer);
kernel/time/tick-sched.c
... ... @@ -847,7 +847,6 @@
847 847  
848 848 local_irq_enable();
849 849 }
850   -EXPORT_SYMBOL_GPL(tick_nohz_idle_enter);
851 850  
852 851 /**
853 852 * tick_nohz_irq_exit - update next tick event from interrupt exit
... ... @@ -974,7 +973,6 @@
974 973  
975 974 local_irq_enable();
976 975 }
977   -EXPORT_SYMBOL_GPL(tick_nohz_idle_exit);
978 976  
979 977 static int tick_nohz_reprogram(struct tick_sched *ts, ktime_t now)
980 978 {