Commit cb85a6ed67e979c59a29b7b4e8217e755b951cf4
Committed by
Thomas Gleixner
1 parent
aa2bf9bc64
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
proc: stats: Use arch_idle_time for idle and iowait times if available
Git commit a25cac5198d4ff28 "proc: Consider NO_HZ when printing idle and iowait times" changes the code for /proc/stat to use get_cpu_idle_time_us and get_cpu_iowait_time_us if the system is running with nohz enabled. For architectures which define arch_idle_time (currently s390 only) this is a change for the worse. The result of arch_idle_time is supposed to be the exact sleep time of the target cpu and should be used instead of the value kept by the scheduler. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Reviewed-by: Michal Hocko <mhocko@suse.cz> Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/20120330122308.18720283@de.ibm.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Showing 1 changed file with 28 additions and 6 deletions Side-by-side Diff
fs/proc/stat.c
... | ... | @@ -18,19 +18,39 @@ |
18 | 18 | #ifndef arch_irq_stat |
19 | 19 | #define arch_irq_stat() 0 |
20 | 20 | #endif |
21 | -#ifndef arch_idle_time | |
22 | -#define arch_idle_time(cpu) 0 | |
23 | -#endif | |
24 | 21 | |
22 | +#ifdef arch_idle_time | |
23 | + | |
24 | +static cputime64_t get_idle_time(int cpu) | |
25 | +{ | |
26 | + cputime64_t idle; | |
27 | + | |
28 | + idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; | |
29 | + if (cpu_online(cpu) && !nr_iowait_cpu(cpu)) | |
30 | + idle += arch_idle_time(cpu); | |
31 | + return idle; | |
32 | +} | |
33 | + | |
34 | +static cputime64_t get_iowait_time(int cpu) | |
35 | +{ | |
36 | + cputime64_t iowait; | |
37 | + | |
38 | + iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT]; | |
39 | + if (cpu_online(cpu) && nr_iowait_cpu(cpu)) | |
40 | + iowait += arch_idle_time(cpu); | |
41 | + return iowait; | |
42 | +} | |
43 | + | |
44 | +#else | |
45 | + | |
25 | 46 | static u64 get_idle_time(int cpu) |
26 | 47 | { |
27 | 48 | u64 idle, idle_time = get_cpu_idle_time_us(cpu, NULL); |
28 | 49 | |
29 | - if (idle_time == -1ULL) { | |
50 | + if (idle_time == -1ULL) | |
30 | 51 | /* !NO_HZ so we can rely on cpustat.idle */ |
31 | 52 | idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; |
32 | - idle += arch_idle_time(cpu); | |
33 | - } else | |
53 | + else | |
34 | 54 | idle = usecs_to_cputime64(idle_time); |
35 | 55 | |
36 | 56 | return idle; |
... | ... | @@ -48,6 +68,8 @@ |
48 | 68 | |
49 | 69 | return iowait; |
50 | 70 | } |
71 | + | |
72 | +#endif | |
51 | 73 | |
52 | 74 | static int show_stat(struct seq_file *p, void *v) |
53 | 75 | { |