Signed-off-by: Alexey Dobriyan <adobriyan@xxxxxxxxx> --- fs/proc/stat.c | 136 ++++++++++++++++++++++++++++++------------------- 1 file changed, 83 insertions(+), 53 deletions(-) diff --git a/fs/proc/stat.c b/fs/proc/stat.c index 678feb7b9949..859dc49cca85 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c @@ -14,6 +14,8 @@ #include <linux/sched/cputime.h> #include <linux/tick.h> +#include "../../lib/print-integer.h" + #ifndef arch_irq_stat_cpu #define arch_irq_stat_cpu(cpu) 0 #endif @@ -104,19 +106,30 @@ static void show_all_irqs(struct seq_file *p) show_irq_gap(p, nr_irqs - next); } +enum { + USER, + NICE, + SYSTEM, + IDLE, + IOWAIT, + IRQ, + SOFTIRQ, + STEAL, + GUEST, + GUEST_NICE, + + NR_VAL +}; + static int show_stat(struct seq_file *p, void *v) { + u64 val[NR_VAL] = {}; int i, j; - u64 user, nice, system, idle, iowait, irq, softirq, steal; - u64 guest, guest_nice; u64 sum = 0; u64 sum_softirq = 0; unsigned int per_softirq_sums[NR_SOFTIRQS] = {0}; struct timespec64 boottime; - user = nice = system = idle = iowait = - irq = softirq = steal = 0; - guest = guest_nice = 0; getboottime64(&boottime); for_each_possible_cpu(i) { @@ -125,16 +138,16 @@ static int show_stat(struct seq_file *p, void *v) 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_GUEST_NICE]; + val[USER] += cpustat[CPUTIME_USER]; + val[NICE] += cpustat[CPUTIME_NICE]; + val[SYSTEM] += cpustat[CPUTIME_SYSTEM]; + val[IDLE] += get_idle_time(&kcpustat, i); + val[IOWAIT] += get_iowait_time(&kcpustat, i); + val[IRQ] += cpustat[CPUTIME_IRQ]; + val[SOFTIRQ] += cpustat[CPUTIME_SOFTIRQ]; + val[STEAL] += cpustat[CPUTIME_STEAL]; + val[GUEST] += cpustat[CPUTIME_GUEST]; + val[GUEST_NICE] += cpustat[CPUTIME_GUEST_NICE]; sum += kstat_cpu_irqs_sum(i); sum += arch_irq_stat_cpu(i); @@ -147,47 +160,55 @@ static int show_stat(struct seq_file *p, void *v) } sum += arch_irq_stat(); - seq_put_decimal_ull(p, "cpu ", nsec_to_clock_t(user)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(nice)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(system)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(idle)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(iowait)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(irq)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(softirq)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(steal)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(guest)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(guest_nice)); - seq_putc(p, '\n'); + { + char buf[4 + NR_VAL * (1 + 20) + 1]; + char *q = buf + sizeof(buf); + + *--q = '\n'; + for (i = NR_VAL - 1; i >= 0; i--) { + q = _print_integer_u64(q, nsec_to_clock_t(val[i])); + *--q = ' '; + } + q = memcpy(q - 4, "cpu ", 4); + + seq_write(p, q, buf + sizeof(buf) - q); + } for_each_online_cpu(i) { struct kernel_cpustat kcpustat; u64 *cpustat = kcpustat.cpustat; + char buf[3 + 10 + NR_VAL * (1 + 20) + 1]; + char *q = buf + sizeof(buf); kcpustat_cpu_fetch(&kcpustat, i); - /* Copy values here to work around gcc-2.95.3, gcc-2.96 */ - 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_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)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(system)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(idle)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(iowait)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(irq)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(softirq)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(steal)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(guest)); - seq_put_decimal_ull(p, " ", nsec_to_clock_t(guest_nice)); - seq_putc(p, '\n'); + *--q = '\n'; + q = _print_integer_u64(q, nsec_to_clock_t(cpustat[CPUTIME_GUEST_NICE])); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(cpustat[CPUTIME_GUEST])); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(cpustat[CPUTIME_STEAL])); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(cpustat[CPUTIME_SOFTIRQ])); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(cpustat[CPUTIME_IRQ])); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(cpustat[CPUTIME_IRQ])); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(get_iowait_time(&kcpustat, i))); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(get_idle_time(&kcpustat, i))); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(cpustat[CPUTIME_SYSTEM])); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(cpustat[CPUTIME_NICE])); + *--q = ' '; + q = _print_integer_u64(q, nsec_to_clock_t(cpustat[CPUTIME_USER])); + *--q = ' '; + q = _print_integer_u32(q, i); + q = memcpy(q - 3, "cpu", 3); + + seq_write(p, q, buf + sizeof(buf) - q); } seq_put_decimal_ull(p, "intr ", (unsigned long long)sum); @@ -205,11 +226,20 @@ static int show_stat(struct seq_file *p, void *v) nr_running(), nr_iowait()); - seq_put_decimal_ull(p, "softirq ", (unsigned long long)sum_softirq); + { + char buf[8 + 20 + (1 + 10) * NR_SOFTIRQS + 1]; + char *q = buf + sizeof(buf); - for (i = 0; i < NR_SOFTIRQS; i++) - seq_put_decimal_ull(p, " ", per_softirq_sums[i]); - seq_putc(p, '\n'); + *--q = '\n'; + for (i = NR_SOFTIRQS - 1; i >= 0; i--) { + q = _print_integer_u32(q, per_softirq_sums[i]); + *--q = ' '; + } + q = _print_integer_u64(q, sum_softirq); + q = memcpy(q - 8, "softirq ", 8); + + seq_write(p, q, buf + sizeof(buf) - q); + } return 0; } -- 2.24.1