mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
NOHZ: update idle state also when NOHZ is inactive
Commit f2e21c9610
had unfortunate side
effects with cpufreq governors on some systems.
If the system did not switch into NOHZ mode ts->inidle is not set when
tick_nohz_stop_sched_tick() is called from the idle routine. Therefor
all subsequent calls from irq_exit() to tick_nohz_stop_sched_tick()
fail to call tick_nohz_start_idle(). This results in bogus idle
accounting information which is passed to cpufreq governors.
Set the inidle flag unconditionally of the NOHZ active state to keep
the idle time accounting correct in any case.
[ tglx: Added comment and tweaked the changelog ]
Reported-by: Steven Noonan <steven@uplinklabs.net>
Signed-off-by: Eero Nurkkala <ext-eero.nurkkala@nokia.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Cc: Greg KH <greg@kroah.com>
Cc: Steven Noonan <steven@uplinklabs.net>
Cc: stable@kernel.org
LKML-Reference: <1254907901.30157.93.camel@eenurkka-desktop>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
0eca52a927
commit
fdc6f192e7
1 changed files with 7 additions and 2 deletions
|
@ -231,6 +231,13 @@ void tick_nohz_stop_sched_tick(int inidle)
|
||||||
if (!inidle && !ts->inidle)
|
if (!inidle && !ts->inidle)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set ts->inidle unconditionally. Even if the system did not
|
||||||
|
* switch to NOHZ mode the cpu frequency governers rely on the
|
||||||
|
* update of the idle time accounting in tick_nohz_start_idle().
|
||||||
|
*/
|
||||||
|
ts->inidle = 1;
|
||||||
|
|
||||||
now = tick_nohz_start_idle(ts);
|
now = tick_nohz_start_idle(ts);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -248,8 +255,6 @@ void tick_nohz_stop_sched_tick(int inidle)
|
||||||
if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
|
if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
ts->inidle = 1;
|
|
||||||
|
|
||||||
if (need_resched())
|
if (need_resched())
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue