diff options
author | Michal Hocko <mhocko@suse.cz> | 2011-08-24 03:37:48 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2011-09-08 05:10:55 -0400 |
commit | 6beea0cda8ce71c01354e688e5735c47e331e84f (patch) | |
tree | 7556787053d608134184d98413cce744d54507fc /kernel/time | |
parent | ef0e0f5ed9bde6d1e3376169785a463ad2160e6d (diff) |
nohz: Fix update_ts_time_stat idle accounting
update_ts_time_stat currently updates idle time even if we are in
iowait loop at the moment. The only real users of the idle counter
(via get_cpu_idle_time_us) are CPU governors and they expect to get
cumulative time for both idle and iowait times.
The value (idle_sleeptime) is also printed to userspace by print_cpu
but it prints both idle and iowait times so the idle part is misleading.
Let's clean this up and fix update_ts_time_stat to account both counters
properly and update consumers of idle to consider iowait time as well.
If we do this we might use get_cpu_{idle,iowait}_time_us from other
contexts as well and we will get expected values.
Signed-off-by: Michal Hocko <mhocko@suse.cz>
Cc: Dave Jones <davej@redhat.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Link: http://lkml.kernel.org/r/e9c909c221a8da402c4da07e4cd968c3218f8eb1.1314172057.git.mhocko@suse.cz
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/time')
-rw-r--r-- | kernel/time/tick-sched.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index d5097c44b407..7ab44bca6546 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -159,9 +159,10 @@ update_ts_time_stats(int cpu, struct tick_sched *ts, ktime_t now, u64 *last_upda | |||
159 | 159 | ||
160 | if (ts->idle_active) { | 160 | if (ts->idle_active) { |
161 | delta = ktime_sub(now, ts->idle_entrytime); | 161 | delta = ktime_sub(now, ts->idle_entrytime); |
162 | ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta); | ||
163 | if (nr_iowait_cpu(cpu) > 0) | 162 | if (nr_iowait_cpu(cpu) > 0) |
164 | ts->iowait_sleeptime = ktime_add(ts->iowait_sleeptime, delta); | 163 | ts->iowait_sleeptime = ktime_add(ts->iowait_sleeptime, delta); |
164 | else | ||
165 | ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta); | ||
165 | ts->idle_entrytime = now; | 166 | ts->idle_entrytime = now; |
166 | } | 167 | } |
167 | 168 | ||
@@ -200,8 +201,7 @@ static ktime_t tick_nohz_start_idle(int cpu, struct tick_sched *ts) | |||
200 | * @last_update_time: variable to store update time in | 201 | * @last_update_time: variable to store update time in |
201 | * | 202 | * |
202 | * Return the cummulative idle time (since boot) for a given | 203 | * Return the cummulative idle time (since boot) for a given |
203 | * CPU, in microseconds. The idle time returned includes | 204 | * CPU, in microseconds. |
204 | * the iowait time (unlike what "top" and co report). | ||
205 | * | 205 | * |
206 | * This time is measured via accounting rather than sampling, | 206 | * This time is measured via accounting rather than sampling, |
207 | * and is as accurate as ktime_get() is. | 207 | * and is as accurate as ktime_get() is. |
@@ -221,7 +221,7 @@ u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time) | |||
221 | } | 221 | } |
222 | EXPORT_SYMBOL_GPL(get_cpu_idle_time_us); | 222 | EXPORT_SYMBOL_GPL(get_cpu_idle_time_us); |
223 | 223 | ||
224 | /* | 224 | /** |
225 | * get_cpu_iowait_time_us - get the total iowait time of a cpu | 225 | * get_cpu_iowait_time_us - get the total iowait time of a cpu |
226 | * @cpu: CPU number to query | 226 | * @cpu: CPU number to query |
227 | * @last_update_time: variable to store update time in | 227 | * @last_update_time: variable to store update time in |