procfs: Use all-in-one vtime aware kcpustat accessor
Now that we can read also user and guest time safely under vtime, use the relevant accessor to fix frozen kcpustat values on nohz_full CPUs. Reported-by: Yauheni Kaliuta <yauheni.kaliuta@redhat.com> Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Wanpeng Li <wanpengli@tencent.com> Link: https://lkml.kernel.org/r/20191121024430.19938-4-frederic@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
74722bb223
commit
26dae145a7
@ -120,20 +120,23 @@ static int show_stat(struct seq_file *p, void *v)
|
||||
getboottime64(&boottime);
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
struct kernel_cpustat *kcs = &kcpustat_cpu(i);
|
||||
struct kernel_cpustat kcpustat;
|
||||
u64 *cpustat = kcpustat.cpustat;
|
||||
|
||||
user += kcs->cpustat[CPUTIME_USER];
|
||||
nice += kcs->cpustat[CPUTIME_NICE];
|
||||
system += kcpustat_field(kcs, CPUTIME_SYSTEM, i);
|
||||
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);
|
||||
kcpustat_cpu_fetch(&kcpustat, i);
|
||||
|
||||
user += cpustat[CPUTIME_USER];
|
||||
nice += cpustat[CPUTIME_NICE];
|
||||
system += cpustat[CPUTIME_SYSTEM];
|
||||
idle += get_idle_time(&kcpustat, i);
|
||||
iowait += get_iowait_time(&kcpustat, i);
|
||||
irq += cpustat[CPUTIME_IRQ];
|
||||
softirq += cpustat[CPUTIME_SOFTIRQ];
|
||||
steal += cpustat[CPUTIME_STEAL];
|
||||
guest += cpustat[CPUTIME_GUEST];
|
||||
guest_nice += cpustat[CPUTIME_USER];
|
||||
sum += kstat_cpu_irqs_sum(i);
|
||||
sum += arch_irq_stat_cpu(i);
|
||||
|
||||
for (j = 0; j < NR_SOFTIRQS; j++) {
|
||||
unsigned int softirq_stat = kstat_softirqs_cpu(j, i);
|
||||
@ -157,19 +160,22 @@ 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);
|
||||
struct kernel_cpustat kcpustat;
|
||||
u64 *cpustat = kcpustat.cpustat;
|
||||
|
||||
kcpustat_cpu_fetch(&kcpustat, i);
|
||||
|
||||
/* Copy values here to work around gcc-2.95.3, gcc-2.96 */
|
||||
user = kcs->cpustat[CPUTIME_USER];
|
||||
nice = kcs->cpustat[CPUTIME_NICE];
|
||||
system = kcpustat_field(kcs, CPUTIME_SYSTEM, i);
|
||||
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];
|
||||
user = cpustat[CPUTIME_USER];
|
||||
nice = cpustat[CPUTIME_NICE];
|
||||
system = cpustat[CPUTIME_SYSTEM];
|
||||
idle = get_idle_time(&kcpustat, i);
|
||||
iowait = get_iowait_time(&kcpustat, i);
|
||||
irq = cpustat[CPUTIME_IRQ];
|
||||
softirq = cpustat[CPUTIME_SOFTIRQ];
|
||||
steal = cpustat[CPUTIME_STEAL];
|
||||
guest = cpustat[CPUTIME_GUEST];
|
||||
guest_nice = cpustat[CPUTIME_USER];
|
||||
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));
|
||||
|
Loading…
Reference in New Issue
Block a user