Commit cb85a6ed67e979c59a29b7b4e8217e755b951cf4

Authored by Martin Schwidefsky
Committed by Thomas Gleixner
1 parent aa2bf9bc64

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

... ... @@ -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 {