diff options
| author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2012-03-30 12:23:08 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2012-03-30 15:43:33 +0200 | 
| commit | cb85a6ed67e979c59a29b7b4e8217e755b951cf4 (patch) | |
| tree | 512614bafe8d0038f38c30282fcf505906ff146d | |
| parent | aa2bf9bc6414b6972b9e51903c1ce7b1f057aee2 (diff) | |
| download | olio-linux-3.10-cb85a6ed67e979c59a29b7b4e8217e755b951cf4.tar.xz olio-linux-3.10-cb85a6ed67e979c59a29b7b4e8217e755b951cf4.zip  | |
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>
| -rw-r--r-- | fs/proc/stat.c | 34 | 
1 files changed, 28 insertions, 6 deletions
diff --git a/fs/proc/stat.c b/fs/proc/stat.c index 6a0c62d6e44..64c3b317236 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c @@ -18,19 +18,39 @@  #ifndef arch_irq_stat  #define arch_irq_stat() 0  #endif -#ifndef arch_idle_time -#define arch_idle_time(cpu) 0 -#endif + +#ifdef arch_idle_time + +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)  {  	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 */  		idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; -		idle += arch_idle_time(cpu); -	} else +	else  		idle = usecs_to_cputime64(idle_time);  	return idle; @@ -49,6 +69,8 @@ static u64 get_iowait_time(int cpu)  	return iowait;  } +#endif +  static int show_stat(struct seq_file *p, void *v)  {  	int i, j;  |