diff options
Diffstat (limited to 'fs/proc/stat.c')
| -rw-r--r-- | fs/proc/stat.c | 41 | 
1 files changed, 34 insertions, 7 deletions
| diff --git a/fs/proc/stat.c b/fs/proc/stat.c index 9758b654a1bc..42b274da92c3 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c @@ -10,6 +10,7 @@  #include <linux/time.h>  #include <linux/irqnr.h>  #include <asm/cputime.h> +#include <linux/tick.h>  #ifndef arch_irq_stat_cpu  #define arch_irq_stat_cpu(cpu) 0 @@ -21,6 +22,35 @@  #define arch_idle_time(cpu) 0  #endif +static cputime64_t get_idle_time(int cpu) +{ +	u64 idle_time = get_cpu_idle_time_us(cpu, NULL); +	cputime64_t idle; + +	if (idle_time == -1ULL) { +		/* !NO_HZ so we can rely on cpustat.idle */ +		idle = kstat_cpu(cpu).cpustat.idle; +		idle = cputime64_add(idle, arch_idle_time(cpu)); +	} else +		idle = usecs_to_cputime(idle_time); + +	return idle; +} + +static cputime64_t get_iowait_time(int cpu) +{ +	u64 iowait_time = get_cpu_iowait_time_us(cpu, NULL); +	cputime64_t iowait; + +	if (iowait_time == -1ULL) +		/* !NO_HZ so we can rely on cpustat.iowait */ +		iowait = kstat_cpu(cpu).cpustat.iowait; +	else +		iowait = usecs_to_cputime(iowait_time); + +	return iowait; +} +  static int show_stat(struct seq_file *p, void *v)  {  	int i, j; @@ -42,9 +72,8 @@ static int show_stat(struct seq_file *p, void *v)  		user = cputime64_add(user, kstat_cpu(i).cpustat.user);  		nice = cputime64_add(nice, kstat_cpu(i).cpustat.nice);  		system = cputime64_add(system, kstat_cpu(i).cpustat.system); -		idle = cputime64_add(idle, kstat_cpu(i).cpustat.idle); -		idle = cputime64_add(idle, arch_idle_time(i)); -		iowait = cputime64_add(iowait, kstat_cpu(i).cpustat.iowait); +		idle = cputime64_add(idle, get_idle_time(i)); +		iowait = cputime64_add(iowait, get_iowait_time(i));  		irq = cputime64_add(irq, kstat_cpu(i).cpustat.irq);  		softirq = cputime64_add(softirq, kstat_cpu(i).cpustat.softirq);  		steal = cputime64_add(steal, kstat_cpu(i).cpustat.steal); @@ -76,14 +105,12 @@ static int show_stat(struct seq_file *p, void *v)  		(unsigned long long)cputime64_to_clock_t(guest),  		(unsigned long long)cputime64_to_clock_t(guest_nice));  	for_each_online_cpu(i) { -  		/* Copy values here to work around gcc-2.95.3, gcc-2.96 */  		user = kstat_cpu(i).cpustat.user;  		nice = kstat_cpu(i).cpustat.nice;  		system = kstat_cpu(i).cpustat.system; -		idle = kstat_cpu(i).cpustat.idle; -		idle = cputime64_add(idle, arch_idle_time(i)); -		iowait = kstat_cpu(i).cpustat.iowait; +		idle = get_idle_time(i); +		iowait = get_iowait_time(i);  		irq = kstat_cpu(i).cpustat.irq;  		softirq = kstat_cpu(i).cpustat.softirq;  		steal = kstat_cpu(i).cpustat.steal; |