powerpc/irq: use seq_put_decimal_ull_width() for decimal values
authorDavid Wang <00107082@163.com>
Fri, 8 Nov 2024 16:23:27 +0000 (00:23 +0800)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 10 Nov 2024 11:33:52 +0000 (22:33 +1100)
On a system with n CPUs and m interrupts, there will be n*m decimal
values yielded via seq_printf(.."%10u "..) which is less efficient
than seq_put_decimal_ull_width(), stress reading /proc/interrupts
indicates ~30% performance improvement with this patch.

Signed-off-by: David Wang <00107082@163.com>
[mpe: Flesh out change log based on original submission]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/all/20241103080552.4787-1-00107082@163.com
Link: https://patch.msgid.link/20241108162327.9887-1-00107082@163.com
arch/powerpc/kernel/irq.c

index 2e1600a..a0e8b99 100644 (file)
@@ -89,69 +89,69 @@ int arch_show_interrupts(struct seq_file *p, int prec)
 
 #if defined(CONFIG_PPC32) && defined(CONFIG_TAU_INT)
        if (tau_initialized) {
-               seq_printf(p, "%*s: ", prec, "TAU");
+               seq_printf(p, "%*s:", prec, "TAU");
                for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", tau_interrupts(j));
+                       seq_put_decimal_ull_width(p, " ", tau_interrupts(j), 10);
                seq_puts(p, "  PowerPC             Thermal Assist (cpu temp)\n");
        }
 #endif /* CONFIG_PPC32 && CONFIG_TAU_INT */
 
-       seq_printf(p, "%*s: ", prec, "LOC");
+       seq_printf(p, "%*s:", prec, "LOC");
        for_each_online_cpu(j)
-               seq_printf(p, "%10u ", per_cpu(irq_stat, j).timer_irqs_event);
+               seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).timer_irqs_event, 10);
         seq_printf(p, "  Local timer interrupts for timer event device\n");
 
-       seq_printf(p, "%*s: ", prec, "BCT");
+       seq_printf(p, "%*s:", prec, "BCT");
        for_each_online_cpu(j)
-               seq_printf(p, "%10u ", per_cpu(irq_stat, j).broadcast_irqs_event);
+               seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).broadcast_irqs_event, 10);
        seq_printf(p, "  Broadcast timer interrupts for timer event device\n");
 
-       seq_printf(p, "%*s: ", prec, "LOC");
+       seq_printf(p, "%*s:", prec, "LOC");
        for_each_online_cpu(j)
-               seq_printf(p, "%10u ", per_cpu(irq_stat, j).timer_irqs_others);
+               seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).timer_irqs_others, 10);
         seq_printf(p, "  Local timer interrupts for others\n");
 
-       seq_printf(p, "%*s: ", prec, "SPU");
+       seq_printf(p, "%*s:", prec, "SPU");
        for_each_online_cpu(j)
-               seq_printf(p, "%10u ", per_cpu(irq_stat, j).spurious_irqs);
+               seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).spurious_irqs, 10);
        seq_printf(p, "  Spurious interrupts\n");
 
-       seq_printf(p, "%*s: ", prec, "PMI");
+       seq_printf(p, "%*s:", prec, "PMI");
        for_each_online_cpu(j)
-               seq_printf(p, "%10u ", per_cpu(irq_stat, j).pmu_irqs);
+               seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).pmu_irqs, 10);
        seq_printf(p, "  Performance monitoring interrupts\n");
 
-       seq_printf(p, "%*s: ", prec, "MCE");
+       seq_printf(p, "%*s:", prec, "MCE");
        for_each_online_cpu(j)
-               seq_printf(p, "%10u ", per_cpu(irq_stat, j).mce_exceptions);
+               seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).mce_exceptions, 10);
        seq_printf(p, "  Machine check exceptions\n");
 
 #ifdef CONFIG_PPC_BOOK3S_64
        if (cpu_has_feature(CPU_FTR_HVMODE)) {
-               seq_printf(p, "%*s: ", prec, "HMI");
+               seq_printf(p, "%*s:", prec, "HMI");
                for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", paca_ptrs[j]->hmi_irqs);
+                       seq_put_decimal_ull_width(p, " ", paca_ptrs[j]->hmi_irqs, 10);
                seq_printf(p, "  Hypervisor Maintenance Interrupts\n");
        }
 #endif
 
-       seq_printf(p, "%*s: ", prec, "NMI");
+       seq_printf(p, "%*s:", prec, "NMI");
        for_each_online_cpu(j)
-               seq_printf(p, "%10u ", per_cpu(irq_stat, j).sreset_irqs);
+               seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).sreset_irqs, 10);
        seq_printf(p, "  System Reset interrupts\n");
 
 #ifdef CONFIG_PPC_WATCHDOG
-       seq_printf(p, "%*s: ", prec, "WDG");
+       seq_printf(p, "%*s:", prec, "WDG");
        for_each_online_cpu(j)
-               seq_printf(p, "%10u ", per_cpu(irq_stat, j).soft_nmi_irqs);
+               seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).soft_nmi_irqs, 10);
        seq_printf(p, "  Watchdog soft-NMI interrupts\n");
 #endif
 
 #ifdef CONFIG_PPC_DOORBELL
        if (cpu_has_feature(CPU_FTR_DBELL)) {
-               seq_printf(p, "%*s: ", prec, "DBL");
+               seq_printf(p, "%*s:", prec, "DBL");
                for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", per_cpu(irq_stat, j).doorbell_irqs);
+                       seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).doorbell_irqs, 10);
                seq_printf(p, "  Doorbell interrupts\n");
        }
 #endif