Commit cb85a6ed authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Thomas Gleixner

proc: stats: Use arch_idle_time for idle and iowait times if available

Git commit a25cac51 "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: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Reviewed-by: default avatarMichal Hocko <mhocko@suse.cz>
Reviewed-by: default avatarSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Link: http://lkml.kernel.org/r/20120330122308.18720283@de.ibm.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent aa2bf9bc
...@@ -18,19 +18,39 @@ ...@@ -18,19 +18,39 @@
#ifndef arch_irq_stat #ifndef arch_irq_stat
#define arch_irq_stat() 0 #define arch_irq_stat() 0
#endif #endif
#ifndef arch_idle_time
#define arch_idle_time(cpu) 0 #ifdef arch_idle_time
#endif
static cputime64_t get_idle_time(int cpu)
{
cputime64_t idle;
idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];
if (cpu_online(cpu) && !nr_iowait_cpu(cpu))
idle += arch_idle_time(cpu);
return idle;
}
static cputime64_t get_iowait_time(int cpu)
{
cputime64_t iowait;
iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT];
if (cpu_online(cpu) && nr_iowait_cpu(cpu))
iowait += arch_idle_time(cpu);
return iowait;
}
#else
static u64 get_idle_time(int cpu) static u64 get_idle_time(int cpu)
{ {
u64 idle, idle_time = get_cpu_idle_time_us(cpu, NULL); u64 idle, idle_time = get_cpu_idle_time_us(cpu, NULL);
if (idle_time == -1ULL) { if (idle_time == -1ULL)
/* !NO_HZ so we can rely on cpustat.idle */ /* !NO_HZ so we can rely on cpustat.idle */
idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];
idle += arch_idle_time(cpu); else
} else
idle = usecs_to_cputime64(idle_time); idle = usecs_to_cputime64(idle_time);
return idle; return idle;
...@@ -49,6 +69,8 @@ static u64 get_iowait_time(int cpu) ...@@ -49,6 +69,8 @@ static u64 get_iowait_time(int cpu)
return iowait; return iowait;
} }
#endif
static int show_stat(struct seq_file *p, void *v) static int show_stat(struct seq_file *p, void *v)
{ {
int i, j; int i, j;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment