diff options
author | Suresh Siddha <suresh.b.siddha@intel.com> | 2011-12-01 17:07:33 -0800 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2011-12-06 09:06:32 +0100 |
commit | 69e1e811dcc436a6b129dbef273ad9ec22d095ce (patch) | |
tree | f07179af4989178733727683796927948db9059a /kernel/time | |
parent | 1c792db7f7957e2e34b9a164f08200e36a25dfd0 (diff) | |
download | lwn-69e1e811dcc436a6b129dbef273ad9ec22d095ce.tar.gz lwn-69e1e811dcc436a6b129dbef273ad9ec22d095ce.zip |
sched, nohz: Track nr_busy_cpus in the sched_group_power
Introduce nr_busy_cpus in the struct sched_group_power [Not in sched_group
because sched groups are duplicated for the SD_OVERLAP scheduler domain]
and for each cpu that enters and exits idle, this parameter will
be updated in each scheduler group of the scheduler domain that this cpu
belongs to.
To avoid the frequent update of this state as the cpu enters
and exits idle, the update of the stat during idle exit is
delayed to the first timer tick that happens after the cpu becomes busy.
This is done using NOHZ_IDLE flag in the struct rq's nohz_flags.
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20111202010832.555984323@sbsiddha-desk.sc.intel.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/time')
-rw-r--r-- | kernel/time/tick-sched.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 40420644d0ba..31cc06163ed5 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -297,6 +297,15 @@ void tick_nohz_stop_sched_tick(int inidle) ts = &per_cpu(tick_cpu_sched, cpu); /* + * Update the idle state in the scheduler domain hierarchy + * when tick_nohz_stop_sched_tick() is called from the idle loop. + * State will be updated to busy during the first busy tick after + * exiting idle. + */ + if (inidle) + set_cpu_sd_state_idle(); + + /* * Call to tick_nohz_start_idle stops the last_update_time from being * updated. Thus, it must not be called in the event we are called from * irq_exit() with the prior state different than idle. |