diff options
Diffstat (limited to 'fs/proc/stat.c')
| -rw-r--r-- | fs/proc/stat.c | 89 | 
1 files changed, 58 insertions, 31 deletions
diff --git a/fs/proc/stat.c b/fs/proc/stat.c index 535eda7857cf..80c305f206bb 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c @@ -23,21 +23,21 @@  #ifdef arch_idle_time -static u64 get_idle_time(int cpu) +static u64 get_idle_time(struct kernel_cpustat *kcs, int cpu)  {  	u64 idle; -	idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; +	idle = kcs->cpustat[CPUTIME_IDLE];  	if (cpu_online(cpu) && !nr_iowait_cpu(cpu))  		idle += arch_idle_time(cpu);  	return idle;  } -static u64 get_iowait_time(int cpu) +static u64 get_iowait_time(struct kernel_cpustat *kcs, int cpu)  {  	u64 iowait; -	iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT]; +	iowait = kcs->cpustat[CPUTIME_IOWAIT];  	if (cpu_online(cpu) && nr_iowait_cpu(cpu))  		iowait += arch_idle_time(cpu);  	return iowait; @@ -45,7 +45,7 @@ static u64 get_iowait_time(int cpu)  #else -static u64 get_idle_time(int cpu) +static u64 get_idle_time(struct kernel_cpustat *kcs, int cpu)  {  	u64 idle, idle_usecs = -1ULL; @@ -54,14 +54,14 @@ static u64 get_idle_time(int cpu)  	if (idle_usecs == -1ULL)  		/* !NO_HZ or cpu offline so we can rely on cpustat.idle */ -		idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; +		idle = kcs->cpustat[CPUTIME_IDLE];  	else  		idle = idle_usecs * NSEC_PER_USEC;  	return idle;  } -static u64 get_iowait_time(int cpu) +static u64 get_iowait_time(struct kernel_cpustat *kcs, int cpu)  {  	u64 iowait, iowait_usecs = -1ULL; @@ -70,7 +70,7 @@ static u64 get_iowait_time(int cpu)  	if (iowait_usecs == -1ULL)  		/* !NO_HZ or cpu offline so we can rely on cpustat.iowait */ -		iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT]; +		iowait = kcs->cpustat[CPUTIME_IOWAIT];  	else  		iowait = iowait_usecs * NSEC_PER_USEC; @@ -79,6 +79,31 @@ static u64 get_iowait_time(int cpu)  #endif +static void show_irq_gap(struct seq_file *p, unsigned int gap) +{ +	static const char zeros[] = " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + +	while (gap > 0) { +		unsigned int inc; + +		inc = min_t(unsigned int, gap, ARRAY_SIZE(zeros) / 2); +		seq_write(p, zeros, 2 * inc); +		gap -= inc; +	} +} + +static void show_all_irqs(struct seq_file *p) +{ +	unsigned int i, next = 0; + +	for_each_active_irq(i) { +		show_irq_gap(p, i - next); +		seq_put_decimal_ull(p, " ", kstat_irqs_usr(i)); +		next = i + 1; +	} +	show_irq_gap(p, nr_irqs - next); +} +  static int show_stat(struct seq_file *p, void *v)  {  	int i, j; @@ -95,16 +120,18 @@ static int show_stat(struct seq_file *p, void *v)  	getboottime64(&boottime);  	for_each_possible_cpu(i) { -		user += kcpustat_cpu(i).cpustat[CPUTIME_USER]; -		nice += kcpustat_cpu(i).cpustat[CPUTIME_NICE]; -		system += kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM]; -		idle += get_idle_time(i); -		iowait += get_iowait_time(i); -		irq += kcpustat_cpu(i).cpustat[CPUTIME_IRQ]; -		softirq += kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ]; -		steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; -		guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; -		guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; +		struct kernel_cpustat *kcs = &kcpustat_cpu(i); + +		user += kcs->cpustat[CPUTIME_USER]; +		nice += kcs->cpustat[CPUTIME_NICE]; +		system += kcs->cpustat[CPUTIME_SYSTEM]; +		idle += get_idle_time(kcs, i); +		iowait += get_iowait_time(kcs, i); +		irq += kcs->cpustat[CPUTIME_IRQ]; +		softirq += kcs->cpustat[CPUTIME_SOFTIRQ]; +		steal += kcs->cpustat[CPUTIME_STEAL]; +		guest += kcs->cpustat[CPUTIME_GUEST]; +		guest_nice += kcs->cpustat[CPUTIME_GUEST_NICE];  		sum += kstat_cpu_irqs_sum(i);  		sum += arch_irq_stat_cpu(i); @@ -130,17 +157,19 @@ static int show_stat(struct seq_file *p, void *v)  	seq_putc(p, '\n');  	for_each_online_cpu(i) { +		struct kernel_cpustat *kcs = &kcpustat_cpu(i); +  		/* Copy values here to work around gcc-2.95.3, gcc-2.96 */ -		user = kcpustat_cpu(i).cpustat[CPUTIME_USER]; -		nice = kcpustat_cpu(i).cpustat[CPUTIME_NICE]; -		system = kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM]; -		idle = get_idle_time(i); -		iowait = get_iowait_time(i); -		irq = kcpustat_cpu(i).cpustat[CPUTIME_IRQ]; -		softirq = kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ]; -		steal = kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; -		guest = kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; -		guest_nice = kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; +		user = kcs->cpustat[CPUTIME_USER]; +		nice = kcs->cpustat[CPUTIME_NICE]; +		system = kcs->cpustat[CPUTIME_SYSTEM]; +		idle = get_idle_time(kcs, i); +		iowait = get_iowait_time(kcs, i); +		irq = kcs->cpustat[CPUTIME_IRQ]; +		softirq = kcs->cpustat[CPUTIME_SOFTIRQ]; +		steal = kcs->cpustat[CPUTIME_STEAL]; +		guest = kcs->cpustat[CPUTIME_GUEST]; +		guest_nice = kcs->cpustat[CPUTIME_GUEST_NICE];  		seq_printf(p, "cpu%d", i);  		seq_put_decimal_ull(p, " ", nsec_to_clock_t(user));  		seq_put_decimal_ull(p, " ", nsec_to_clock_t(nice)); @@ -156,9 +185,7 @@ static int show_stat(struct seq_file *p, void *v)  	}  	seq_put_decimal_ull(p, "intr ", (unsigned long long)sum); -	/* sum again ? it could be updated? */ -	for_each_irq_nr(j) -		seq_put_decimal_ull(p, " ", kstat_irqs_usr(j)); +	show_all_irqs(p);  	seq_printf(p,  		"\nctxt %llu\n"  |