* [PATCH] kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width
@ 2024-11-03 8:05 ` David Wang
0 siblings, 0 replies; 8+ messages in thread
From: David Wang @ 2024-11-03 8:05 UTC (permalink / raw)
To: tglx, richard.henderson, linux, catalin.marinas, will, guoren,
chenhuacai, kernel, James.Bottomley, deller, mpe, paul.walmsley,
ysato, dalias, glaubitz, davem, andreas, mingo, bp, dave.hansen,
x86, chris, jcmvbkbc
Cc: linux-kernel, linux-alpha, linux-arm-kernel, linux-csky,
loongarch, linux-parisc, linuxppc-dev, linux-riscv, linux-sh,
sparclinux, David Wang
seq_printf is costy, when stress reading /proc/interrupts, profiling indicates
seq_printf takes about ~47% of show_interrupts samples:
show_interrupts(94.495% 5166019/5466991)
seq_printf(47.429% 2450210/5166019)
vsnprintf(89.232% 2186366/2450210)
format_decode(24.005% 524831/2186366)
number(19.488% 426084/2186366)
memcpy_orig(3.739% 81753/2186366)
...
_raw_spin_unlock_irqrestore(26.643% 1376379/5166019)
mtree_load(8.059% 416304/5166019)
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, and profiling
data shows:
show_interrupts(92.221% 3609371/3913823)
_raw_spin_unlock_irqrestore(39.123% 1412078/3609371)
mtree_load(11.942% 431036/3609371)
seq_put_decimal_ull_width(11.635% 419958/3609371)
seq_printf(9.025% 325754/3609371)
...
The improvement has pratical significance, considering many monitoring
tools would read /proc/interrupts periodically.
seq_put_decimal_ull_width(..," ", v, 10) is equivalent to
seq_printf(.., " %10llu", v), not "%10llu "; Hence there is space
adjustment along.
Signed-off-by: David Wang <00107082@163.com>
---
arch/alpha/kernel/irq.c | 8 +--
arch/arm/kernel/smp.c | 4 +-
arch/arm64/kernel/smp.c | 3 +-
arch/csky/kernel/smp.c | 4 +-
arch/loongarch/kernel/smp.c | 2 +-
arch/parisc/kernel/irq.c | 34 ++++++------
arch/powerpc/kernel/irq.c | 44 ++++++++--------
arch/riscv/kernel/smp.c | 3 +-
arch/sh/kernel/irq.c | 4 +-
arch/sparc/kernel/irq_32.c | 12 ++---
arch/sparc/kernel/irq_64.c | 4 +-
arch/x86/kernel/irq.c | 100 ++++++++++++++++++------------------
arch/xtensa/kernel/irq.c | 2 +-
arch/xtensa/kernel/smp.c | 4 +-
kernel/irq/proc.c | 6 ++-
15 files changed, 120 insertions(+), 114 deletions(-)
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c
index c67047c5d830..0dbb8d3ed647 100644
--- a/arch/alpha/kernel/irq.c
+++ b/arch/alpha/kernel/irq.c
@@ -72,14 +72,14 @@ int arch_show_interrupts(struct seq_file *p, int prec)
int j;
#ifdef CONFIG_SMP
- seq_puts(p, "IPI: ");
+ seq_puts(p, "IPI:");
for_each_online_cpu(j)
- seq_printf(p, "%10lu ", cpu_data[j].ipi_count);
+ seq_put_decimal_ull_width(p, " ", cpu_data[j].ipi_count, 10);
seq_putc(p, '\n');
#endif
- seq_puts(p, "PMI: ");
+ seq_puts(p, "PMI:");
for_each_online_cpu(j)
- seq_printf(p, "%10lu ", per_cpu(irq_pmi_count, j));
+ seq_put_decimal_ull_width(p, " ", per_cpu(irq_pmi_count, j), 10);
seq_puts(p, " Performance Monitoring\n");
seq_printf(p, "ERR: %10lu\n", irq_err_count);
return 0;
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index 3431c0553f45..1b0680477ae1 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -551,10 +551,10 @@ void show_ipi_list(struct seq_file *p, int prec)
if (!ipi_desc[i])
continue;
- seq_printf(p, "%*s%u: ", prec - 1, "IPI", i);
+ seq_printf(p, "%*s%u:", prec - 1, "IPI", i);
for_each_online_cpu(cpu)
- seq_printf(p, "%10u ", irq_desc_kstat_cpu(ipi_desc[i], cpu));
+ seq_put_decimal_ull_width(p, " ", irq_desc_kstat_cpu(ipi_desc[i], cpu), 10);
seq_printf(p, " %s\n", ipi_types[i]);
}
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 3b3f6b56e733..35734a30ed8d 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -844,7 +844,8 @@ int arch_show_interrupts(struct seq_file *p, int prec)
seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i,
prec >= 4 ? " " : "");
for_each_online_cpu(cpu)
- seq_printf(p, "%10u ", irq_desc_kstat_cpu(ipi_desc[i], cpu));
+ seq_put_decimal_ull_width(p, " ",
+ irq_desc_kstat_cpu(ipi_desc[i], cpu), 10);
seq_printf(p, " %s\n", ipi_types[i]);
}
diff --git a/arch/csky/kernel/smp.c b/arch/csky/kernel/smp.c
index 92dbbf3e0205..65f399afc3f0 100644
--- a/arch/csky/kernel/smp.c
+++ b/arch/csky/kernel/smp.c
@@ -112,8 +112,8 @@ int arch_show_interrupts(struct seq_file *p, int prec)
seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i,
prec >= 4 ? " " : "");
for_each_online_cpu(cpu)
- seq_printf(p, "%10lu ",
- per_cpu_ptr(&ipi_data, cpu)->stats[i]);
+ seq_put_decimal_ull_width(p, " ",
+ per_cpu_ptr(&ipi_data, cpu)->stats[i], 10);
seq_printf(p, " %s\n", ipi_names[i]);
}
diff --git a/arch/loongarch/kernel/smp.c b/arch/loongarch/kernel/smp.c
index 9afc2d8b3414..86664adfb3cf 100644
--- a/arch/loongarch/kernel/smp.c
+++ b/arch/loongarch/kernel/smp.c
@@ -82,7 +82,7 @@ void show_ipi_list(struct seq_file *p, int prec)
for (i = 0; i < NR_IPI; i++) {
seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i, prec >= 4 ? " " : "");
for_each_online_cpu(cpu)
- seq_printf(p, "%10u ", per_cpu(irq_stat, cpu).ipi_irqs[i]);
+ seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, cpu).ipi_irqs[i], 10);
seq_printf(p, " LoongArch %d %s\n", i + 1, ipi_types[i]);
}
}
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c
index dff66be65d29..b060d7e6da46 100644
--- a/arch/parisc/kernel/irq.c
+++ b/arch/parisc/kernel/irq.c
@@ -133,40 +133,42 @@ int arch_show_interrupts(struct seq_file *p, int prec)
int j;
#ifdef CONFIG_DEBUG_STACKOVERFLOW
- seq_printf(p, "%*s: ", prec, "STK");
+ seq_printf(p, "%*s:", prec, "STK");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->kernel_stack_usage);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->kernel_stack_usage, 10);
seq_puts(p, " Kernel stack usage\n");
# ifdef CONFIG_IRQSTACKS
- seq_printf(p, "%*s: ", prec, "IST");
+ seq_printf(p, "%*s:", prec, "IST");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_stack_usage);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_stack_usage, 10);
seq_puts(p, " Interrupt stack usage\n");
# endif
#endif
#ifdef CONFIG_SMP
if (num_online_cpus() > 1) {
- seq_printf(p, "%*s: ", prec, "RES");
+ seq_printf(p, "%*s:", prec, "RES");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_resched_count);
+ seq_put_decimal_ull_width(p, " ",
+ irq_stats(j)->irq_resched_count, 10);
seq_puts(p, " Rescheduling interrupts\n");
- seq_printf(p, "%*s: ", prec, "CAL");
+ seq_printf(p, "%*s:", prec, "CAL");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_call_count);
+ seq_put_decimal_ull_width(p, " ",
+ irq_stats(j)->irq_call_count, 10);
seq_puts(p, " Function call interrupts\n");
}
#endif
- seq_printf(p, "%*s: ", prec, "UAH");
+ seq_printf(p, "%*s:", prec, "UAH");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_unaligned_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_unaligned_count, 10);
seq_puts(p, " Unaligned access handler traps\n");
- seq_printf(p, "%*s: ", prec, "FPA");
+ seq_printf(p, "%*s:", prec, "FPA");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_fpassist_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_fpassist_count, 10);
seq_puts(p, " Floating point assist traps\n");
- seq_printf(p, "%*s: ", prec, "TLB");
+ seq_printf(p, "%*s:", prec, "TLB");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_tlb_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_tlb_count, 10);
seq_puts(p, " TLB shootdowns\n");
return 0;
}
@@ -195,10 +197,10 @@ int show_interrupts(struct seq_file *p, void *v)
action = desc->action;
if (!action)
goto skip;
- seq_printf(p, "%3d: ", i);
+ seq_printf(p, "%3d:", i);
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_desc_kstat_cpu(desc, j));
+ seq_put_decimal_ull_width(p, " ", irq_desc_kstat_cpu(desc, j), 10);
seq_printf(p, " %14s", irq_desc_get_chip(desc)->name);
#ifndef PARISC_IRQ_CR16_COUNTS
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 2e1600a8bbbb..a0e8b998c9b5 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -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
diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c
index c180a647a30e..f1e9c3db094c 100644
--- a/arch/riscv/kernel/smp.c
+++ b/arch/riscv/kernel/smp.c
@@ -226,7 +226,8 @@ void show_ipi_stats(struct seq_file *p, int prec)
seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i,
prec >= 4 ? " " : "");
for_each_online_cpu(cpu)
- seq_printf(p, "%10u ", irq_desc_kstat_cpu(ipi_desc[i], cpu));
+ seq_put_decimal_ull_width(p, " ",
+ irq_desc_kstat_cpu(ipi_desc[i], cpu), 10);
seq_printf(p, " %s\n", ipi_names[i]);
}
}
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c
index 4e6835de54cf..9022d8af9d68 100644
--- a/arch/sh/kernel/irq.c
+++ b/arch/sh/kernel/irq.c
@@ -43,9 +43,9 @@ int arch_show_interrupts(struct seq_file *p, int prec)
{
int j;
- 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.__nmi_count, j));
+ seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat.__nmi_count, j), 10);
seq_printf(p, " Non-maskable interrupts\n");
seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read(&irq_err_count));
diff --git a/arch/sparc/kernel/irq_32.c b/arch/sparc/kernel/irq_32.c
index 8605dd710f3c..5210991429d5 100644
--- a/arch/sparc/kernel/irq_32.c
+++ b/arch/sparc/kernel/irq_32.c
@@ -199,18 +199,18 @@ int arch_show_interrupts(struct seq_file *p, int prec)
int j;
#ifdef CONFIG_SMP
- seq_printf(p, "RES: ");
+ seq_printf(p, "RES:");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", cpu_data(j).irq_resched_count);
+ seq_put_decimal_ull_width(p, " ", cpu_data(j).irq_resched_count, 10);
seq_printf(p, " IPI rescheduling interrupts\n");
- seq_printf(p, "CAL: ");
+ seq_printf(p, "CAL:");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", cpu_data(j).irq_call_count);
+ seq_put_decimal_ull_width(p, " ", cpu_data(j).irq_call_count, 10);
seq_printf(p, " IPI function call interrupts\n");
#endif
- seq_printf(p, "NMI: ");
+ seq_printf(p, "NMI:");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", cpu_data(j).counter);
+ seq_put_decimal_ull_width(p, " ", cpu_data(j).counter, 10);
seq_printf(p, " Non-maskable interrupts\n");
return 0;
}
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c
index 01ee800efde3..9ab6e79b617b 100644
--- a/arch/sparc/kernel/irq_64.c
+++ b/arch/sparc/kernel/irq_64.c
@@ -304,9 +304,9 @@ int arch_show_interrupts(struct seq_file *p, int prec)
{
int j;
- seq_printf(p, "NMI: ");
+ seq_printf(p, "NMI:");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", cpu_data(j).__nmi_count);
+ seq_put_decimal_ull_width(p, " ", cpu_data(j).__nmi_count, 10);
seq_printf(p, " Non-maskable interrupts\n");
return 0;
}
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 385e3a5fc304..66cc8f001bd0 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -62,103 +62,103 @@ int arch_show_interrupts(struct seq_file *p, int prec)
{
int j;
- seq_printf(p, "%*s: ", prec, "NMI");
+ seq_printf(p, "%*s:", prec, "NMI");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->__nmi_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->__nmi_count, 10);
seq_puts(p, " Non-maskable interrupts\n");
#ifdef CONFIG_X86_LOCAL_APIC
- seq_printf(p, "%*s: ", prec, "LOC");
+ seq_printf(p, "%*s:", prec, "LOC");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->apic_timer_irqs);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->apic_timer_irqs, 10);
seq_puts(p, " Local timer interrupts\n");
- seq_printf(p, "%*s: ", prec, "SPU");
+ seq_printf(p, "%*s:", prec, "SPU");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_spurious_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_spurious_count, 10);
seq_puts(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 ", irq_stats(j)->apic_perf_irqs);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->apic_perf_irqs, 10);
seq_puts(p, " Performance monitoring interrupts\n");
- seq_printf(p, "%*s: ", prec, "IWI");
+ seq_printf(p, "%*s:", prec, "IWI");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->apic_irq_work_irqs);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->apic_irq_work_irqs, 10);
seq_puts(p, " IRQ work interrupts\n");
- seq_printf(p, "%*s: ", prec, "RTR");
+ seq_printf(p, "%*s:", prec, "RTR");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->icr_read_retry_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->icr_read_retry_count, 10);
seq_puts(p, " APIC ICR read retries\n");
if (x86_platform_ipi_callback) {
- seq_printf(p, "%*s: ", prec, "PLT");
+ seq_printf(p, "%*s:", prec, "PLT");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->x86_platform_ipis);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->x86_platform_ipis, 10);
seq_puts(p, " Platform interrupts\n");
}
#endif
#ifdef CONFIG_SMP
- seq_printf(p, "%*s: ", prec, "RES");
+ seq_printf(p, "%*s:", prec, "RES");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_resched_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_resched_count, 10);
seq_puts(p, " Rescheduling interrupts\n");
- seq_printf(p, "%*s: ", prec, "CAL");
+ seq_printf(p, "%*s:", prec, "CAL");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_call_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_call_count, 10);
seq_puts(p, " Function call interrupts\n");
- seq_printf(p, "%*s: ", prec, "TLB");
+ seq_printf(p, "%*s:", prec, "TLB");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_tlb_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_tlb_count, 10);
seq_puts(p, " TLB shootdowns\n");
#endif
#ifdef CONFIG_X86_THERMAL_VECTOR
- seq_printf(p, "%*s: ", prec, "TRM");
+ seq_printf(p, "%*s:", prec, "TRM");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_thermal_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_thermal_count, 10);
seq_puts(p, " Thermal event interrupts\n");
#endif
#ifdef CONFIG_X86_MCE_THRESHOLD
- seq_printf(p, "%*s: ", prec, "THR");
+ seq_printf(p, "%*s:", prec, "THR");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_threshold_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_threshold_count, 10);
seq_puts(p, " Threshold APIC interrupts\n");
#endif
#ifdef CONFIG_X86_MCE_AMD
- seq_printf(p, "%*s: ", prec, "DFR");
+ seq_printf(p, "%*s:", prec, "DFR");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->irq_deferred_error_count);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_deferred_error_count, 10);
seq_puts(p, " Deferred Error APIC interrupts\n");
#endif
#ifdef CONFIG_X86_MCE
- seq_printf(p, "%*s: ", prec, "MCE");
+ seq_printf(p, "%*s:", prec, "MCE");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", per_cpu(mce_exception_count, j));
+ seq_put_decimal_ull_width(p, " ", per_cpu(mce_exception_count, j), 10);
seq_puts(p, " Machine check exceptions\n");
- seq_printf(p, "%*s: ", prec, "MCP");
+ seq_printf(p, "%*s:", prec, "MCP");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", per_cpu(mce_poll_count, j));
+ seq_put_decimal_ull_width(p, " ", per_cpu(mce_poll_count, j), 10);
seq_puts(p, " Machine check polls\n");
#endif
#ifdef CONFIG_X86_HV_CALLBACK_VECTOR
if (test_bit(HYPERVISOR_CALLBACK_VECTOR, system_vectors)) {
- seq_printf(p, "%*s: ", prec, "HYP");
+ seq_printf(p, "%*s:", prec, "HYP");
for_each_online_cpu(j)
- seq_printf(p, "%10u ",
- irq_stats(j)->irq_hv_callback_count);
+ seq_put_decimal_ull_width(p, " ",
+ irq_stats(j)->irq_hv_callback_count, 10);
seq_puts(p, " Hypervisor callback interrupts\n");
}
#endif
#if IS_ENABLED(CONFIG_HYPERV)
if (test_bit(HYPERV_REENLIGHTENMENT_VECTOR, system_vectors)) {
- seq_printf(p, "%*s: ", prec, "HRE");
+ seq_printf(p, "%*s:", prec, "HRE");
for_each_online_cpu(j)
- seq_printf(p, "%10u ",
- irq_stats(j)->irq_hv_reenlightenment_count);
+ seq_put_decimal_ull_width(p, " ",
+ irq_stats(j)->irq_hv_reenlightenment_count, 10);
seq_puts(p, " Hyper-V reenlightenment interrupts\n");
}
if (test_bit(HYPERV_STIMER0_VECTOR, system_vectors)) {
- seq_printf(p, "%*s: ", prec, "HVS");
+ seq_printf(p, "%*s:", prec, "HVS");
for_each_online_cpu(j)
- seq_printf(p, "%10u ",
- irq_stats(j)->hyperv_stimer0_count);
+ seq_put_decimal_ull_width(p, " ",
+ irq_stats(j)->hyperv_stimer0_count, 10);
seq_puts(p, " Hyper-V stimer0 interrupts\n");
}
#endif
@@ -167,28 +167,28 @@ int arch_show_interrupts(struct seq_file *p, int prec)
seq_printf(p, "%*s: %10u\n", prec, "MIS", atomic_read(&irq_mis_count));
#endif
#if IS_ENABLED(CONFIG_KVM)
- seq_printf(p, "%*s: ", prec, "PIN");
+ seq_printf(p, "%*s:", prec, "PIN");
for_each_online_cpu(j)
- seq_printf(p, "%10u ", irq_stats(j)->kvm_posted_intr_ipis);
+ seq_put_decimal_ull_width(p, " ", irq_stats(j)->kvm_posted_intr_ipis, 10);
seq_puts(p, " Posted-interrupt notification event\n");
- seq_printf(p, "%*s: ", prec, "NPI");
+ seq_printf(p, "%*s:", prec, "NPI");
for_each_online_cpu(j)
- seq_printf(p, "%10u ",
- irq_stats(j)->kvm_posted_intr_nested_ipis);
+ seq_put_decimal_ull_width(p, " ",
+ irq_stats(j)->kvm_posted_intr_nested_ipis, 10);
seq_puts(p, " Nested posted-interrupt event\n");
- seq_printf(p, "%*s: ", prec, "PIW");
+ seq_printf(p, "%*s:", prec, "PIW");
for_each_online_cpu(j)
- seq_printf(p, "%10u ",
- irq_stats(j)->kvm_posted_intr_wakeup_ipis);
+ seq_put_decimal_ull_width(p, " ",
+ irq_stats(j)->kvm_posted_intr_wakeup_ipis, 10);
seq_puts(p, " Posted-interrupt wakeup event\n");
#endif
#ifdef CONFIG_X86_POSTED_MSI
- seq_printf(p, "%*s: ", prec, "PMN");
+ seq_printf(p, "%*s:", prec, "PMN");
for_each_online_cpu(j)
- seq_printf(p, "%10u ",
- irq_stats(j)->posted_msi_notification_count);
+ seq_put_decimal_ull_width(p, " ",
+ irq_stats(j)->posted_msi_notification_count, 10);
seq_puts(p, " Posted MSI notification event\n");
#endif
return 0;
diff --git a/arch/xtensa/kernel/irq.c b/arch/xtensa/kernel/irq.c
index b1e410f6b5ab..c4f46989f9b7 100644
--- a/arch/xtensa/kernel/irq.c
+++ b/arch/xtensa/kernel/irq.c
@@ -58,7 +58,7 @@ int arch_show_interrupts(struct seq_file *p, int prec)
#if XTENSA_FAKE_NMI
seq_printf(p, "%*s:", prec, "NMI");
for_each_online_cpu(cpu)
- seq_printf(p, " %10lu", per_cpu(nmi_count, cpu));
+ seq_put_decimal_ull_width(p, " ", per_cpu(nmi_count, cpu), 10);
seq_puts(p, " Non-maskable interrupts\n");
#endif
return 0;
diff --git a/arch/xtensa/kernel/smp.c b/arch/xtensa/kernel/smp.c
index 94a23f100726..71ec9eced8b9 100644
--- a/arch/xtensa/kernel/smp.c
+++ b/arch/xtensa/kernel/smp.c
@@ -453,8 +453,8 @@ void show_ipi_list(struct seq_file *p, int prec)
for (i = 0; i < IPI_MAX; ++i) {
seq_printf(p, "%*s:", prec, ipi_text[i].short_text);
for_each_online_cpu(cpu)
- seq_printf(p, " %10lu",
- per_cpu(ipi_data, cpu).ipi_count[i]);
+ seq_put_decimal_ull_width(p, " ",
+ per_cpu(ipi_data, cpu).ipi_count[i], 10);
seq_printf(p, " %s\n", ipi_text[i].long_text);
}
}
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c
index 9081ada81c3d..988ce781e813 100644
--- a/kernel/irq/proc.c
+++ b/kernel/irq/proc.c
@@ -494,9 +494,11 @@ int show_interrupts(struct seq_file *p, void *v)
if (!desc->action || irq_desc_is_chained(desc) || !desc->kstat_irqs)
goto outsparse;
- seq_printf(p, "%*d: ", prec, i);
+ seq_printf(p, "%*d:", prec, i);
for_each_online_cpu(j)
- seq_printf(p, "%10u ", desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, j) : 0);
+ seq_put_decimal_ull_width(p, " ",
+ desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, j) : 0,
+ 10);
raw_spin_lock_irqsave(&desc->lock, flags);
if (desc->irq_data.chip) {
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH] kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width @ 2024-11-03 8:05 ` David Wang 0 siblings, 0 replies; 8+ messages in thread From: David Wang @ 2024-11-03 8:05 UTC (permalink / raw) To: tglx, richard.henderson, linux, catalin.marinas, will, guoren, chenhuacai, kernel, James.Bottomley, deller, mpe, paul.walmsley, ysato, dalias, glaubitz, davem, andreas, mingo, bp, dave.hansen, x86, chris, jcmvbkbc Cc: linux-kernel, linux-alpha, linux-arm-kernel, linux-csky, loongarch, linux-parisc, linuxppc-dev, linux-riscv, linux-sh, sparclinux, David Wang seq_printf is costy, when stress reading /proc/interrupts, profiling indicates seq_printf takes about ~47% of show_interrupts samples: show_interrupts(94.495% 5166019/5466991) seq_printf(47.429% 2450210/5166019) vsnprintf(89.232% 2186366/2450210) format_decode(24.005% 524831/2186366) number(19.488% 426084/2186366) memcpy_orig(3.739% 81753/2186366) ... _raw_spin_unlock_irqrestore(26.643% 1376379/5166019) mtree_load(8.059% 416304/5166019) 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, and profiling data shows: show_interrupts(92.221% 3609371/3913823) _raw_spin_unlock_irqrestore(39.123% 1412078/3609371) mtree_load(11.942% 431036/3609371) seq_put_decimal_ull_width(11.635% 419958/3609371) seq_printf(9.025% 325754/3609371) ... The improvement has pratical significance, considering many monitoring tools would read /proc/interrupts periodically. seq_put_decimal_ull_width(..," ", v, 10) is equivalent to seq_printf(.., " %10llu", v), not "%10llu "; Hence there is space adjustment along. Signed-off-by: David Wang <00107082@163.com> --- arch/alpha/kernel/irq.c | 8 +-- arch/arm/kernel/smp.c | 4 +- arch/arm64/kernel/smp.c | 3 +- arch/csky/kernel/smp.c | 4 +- arch/loongarch/kernel/smp.c | 2 +- arch/parisc/kernel/irq.c | 34 ++++++------ arch/powerpc/kernel/irq.c | 44 ++++++++-------- arch/riscv/kernel/smp.c | 3 +- arch/sh/kernel/irq.c | 4 +- arch/sparc/kernel/irq_32.c | 12 ++--- arch/sparc/kernel/irq_64.c | 4 +- arch/x86/kernel/irq.c | 100 ++++++++++++++++++------------------ arch/xtensa/kernel/irq.c | 2 +- arch/xtensa/kernel/smp.c | 4 +- kernel/irq/proc.c | 6 ++- 15 files changed, 120 insertions(+), 114 deletions(-) diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index c67047c5d830..0dbb8d3ed647 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c @@ -72,14 +72,14 @@ int arch_show_interrupts(struct seq_file *p, int prec) int j; #ifdef CONFIG_SMP - seq_puts(p, "IPI: "); + seq_puts(p, "IPI:"); for_each_online_cpu(j) - seq_printf(p, "%10lu ", cpu_data[j].ipi_count); + seq_put_decimal_ull_width(p, " ", cpu_data[j].ipi_count, 10); seq_putc(p, '\n'); #endif - seq_puts(p, "PMI: "); + seq_puts(p, "PMI:"); for_each_online_cpu(j) - seq_printf(p, "%10lu ", per_cpu(irq_pmi_count, j)); + seq_put_decimal_ull_width(p, " ", per_cpu(irq_pmi_count, j), 10); seq_puts(p, " Performance Monitoring\n"); seq_printf(p, "ERR: %10lu\n", irq_err_count); return 0; diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 3431c0553f45..1b0680477ae1 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -551,10 +551,10 @@ void show_ipi_list(struct seq_file *p, int prec) if (!ipi_desc[i]) continue; - seq_printf(p, "%*s%u: ", prec - 1, "IPI", i); + seq_printf(p, "%*s%u:", prec - 1, "IPI", i); for_each_online_cpu(cpu) - seq_printf(p, "%10u ", irq_desc_kstat_cpu(ipi_desc[i], cpu)); + seq_put_decimal_ull_width(p, " ", irq_desc_kstat_cpu(ipi_desc[i], cpu), 10); seq_printf(p, " %s\n", ipi_types[i]); } diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c index 3b3f6b56e733..35734a30ed8d 100644 --- a/arch/arm64/kernel/smp.c +++ b/arch/arm64/kernel/smp.c @@ -844,7 +844,8 @@ int arch_show_interrupts(struct seq_file *p, int prec) seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i, prec >= 4 ? " " : ""); for_each_online_cpu(cpu) - seq_printf(p, "%10u ", irq_desc_kstat_cpu(ipi_desc[i], cpu)); + seq_put_decimal_ull_width(p, " ", + irq_desc_kstat_cpu(ipi_desc[i], cpu), 10); seq_printf(p, " %s\n", ipi_types[i]); } diff --git a/arch/csky/kernel/smp.c b/arch/csky/kernel/smp.c index 92dbbf3e0205..65f399afc3f0 100644 --- a/arch/csky/kernel/smp.c +++ b/arch/csky/kernel/smp.c @@ -112,8 +112,8 @@ int arch_show_interrupts(struct seq_file *p, int prec) seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i, prec >= 4 ? " " : ""); for_each_online_cpu(cpu) - seq_printf(p, "%10lu ", - per_cpu_ptr(&ipi_data, cpu)->stats[i]); + seq_put_decimal_ull_width(p, " ", + per_cpu_ptr(&ipi_data, cpu)->stats[i], 10); seq_printf(p, " %s\n", ipi_names[i]); } diff --git a/arch/loongarch/kernel/smp.c b/arch/loongarch/kernel/smp.c index 9afc2d8b3414..86664adfb3cf 100644 --- a/arch/loongarch/kernel/smp.c +++ b/arch/loongarch/kernel/smp.c @@ -82,7 +82,7 @@ void show_ipi_list(struct seq_file *p, int prec) for (i = 0; i < NR_IPI; i++) { seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i, prec >= 4 ? " " : ""); for_each_online_cpu(cpu) - seq_printf(p, "%10u ", per_cpu(irq_stat, cpu).ipi_irqs[i]); + seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, cpu).ipi_irqs[i], 10); seq_printf(p, " LoongArch %d %s\n", i + 1, ipi_types[i]); } } diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index dff66be65d29..b060d7e6da46 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c @@ -133,40 +133,42 @@ int arch_show_interrupts(struct seq_file *p, int prec) int j; #ifdef CONFIG_DEBUG_STACKOVERFLOW - seq_printf(p, "%*s: ", prec, "STK"); + seq_printf(p, "%*s:", prec, "STK"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->kernel_stack_usage); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->kernel_stack_usage, 10); seq_puts(p, " Kernel stack usage\n"); # ifdef CONFIG_IRQSTACKS - seq_printf(p, "%*s: ", prec, "IST"); + seq_printf(p, "%*s:", prec, "IST"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_stack_usage); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_stack_usage, 10); seq_puts(p, " Interrupt stack usage\n"); # endif #endif #ifdef CONFIG_SMP if (num_online_cpus() > 1) { - seq_printf(p, "%*s: ", prec, "RES"); + seq_printf(p, "%*s:", prec, "RES"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_resched_count); + seq_put_decimal_ull_width(p, " ", + irq_stats(j)->irq_resched_count, 10); seq_puts(p, " Rescheduling interrupts\n"); - seq_printf(p, "%*s: ", prec, "CAL"); + seq_printf(p, "%*s:", prec, "CAL"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_call_count); + seq_put_decimal_ull_width(p, " ", + irq_stats(j)->irq_call_count, 10); seq_puts(p, " Function call interrupts\n"); } #endif - seq_printf(p, "%*s: ", prec, "UAH"); + seq_printf(p, "%*s:", prec, "UAH"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_unaligned_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_unaligned_count, 10); seq_puts(p, " Unaligned access handler traps\n"); - seq_printf(p, "%*s: ", prec, "FPA"); + seq_printf(p, "%*s:", prec, "FPA"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_fpassist_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_fpassist_count, 10); seq_puts(p, " Floating point assist traps\n"); - seq_printf(p, "%*s: ", prec, "TLB"); + seq_printf(p, "%*s:", prec, "TLB"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_tlb_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_tlb_count, 10); seq_puts(p, " TLB shootdowns\n"); return 0; } @@ -195,10 +197,10 @@ int show_interrupts(struct seq_file *p, void *v) action = desc->action; if (!action) goto skip; - seq_printf(p, "%3d: ", i); + seq_printf(p, "%3d:", i); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_desc_kstat_cpu(desc, j)); + seq_put_decimal_ull_width(p, " ", irq_desc_kstat_cpu(desc, j), 10); seq_printf(p, " %14s", irq_desc_get_chip(desc)->name); #ifndef PARISC_IRQ_CR16_COUNTS diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 2e1600a8bbbb..a0e8b998c9b5 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c @@ -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 diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c index c180a647a30e..f1e9c3db094c 100644 --- a/arch/riscv/kernel/smp.c +++ b/arch/riscv/kernel/smp.c @@ -226,7 +226,8 @@ void show_ipi_stats(struct seq_file *p, int prec) seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i, prec >= 4 ? " " : ""); for_each_online_cpu(cpu) - seq_printf(p, "%10u ", irq_desc_kstat_cpu(ipi_desc[i], cpu)); + seq_put_decimal_ull_width(p, " ", + irq_desc_kstat_cpu(ipi_desc[i], cpu), 10); seq_printf(p, " %s\n", ipi_names[i]); } } diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index 4e6835de54cf..9022d8af9d68 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c @@ -43,9 +43,9 @@ int arch_show_interrupts(struct seq_file *p, int prec) { int j; - 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.__nmi_count, j)); + seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat.__nmi_count, j), 10); seq_printf(p, " Non-maskable interrupts\n"); seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read(&irq_err_count)); diff --git a/arch/sparc/kernel/irq_32.c b/arch/sparc/kernel/irq_32.c index 8605dd710f3c..5210991429d5 100644 --- a/arch/sparc/kernel/irq_32.c +++ b/arch/sparc/kernel/irq_32.c @@ -199,18 +199,18 @@ int arch_show_interrupts(struct seq_file *p, int prec) int j; #ifdef CONFIG_SMP - seq_printf(p, "RES: "); + seq_printf(p, "RES:"); for_each_online_cpu(j) - seq_printf(p, "%10u ", cpu_data(j).irq_resched_count); + seq_put_decimal_ull_width(p, " ", cpu_data(j).irq_resched_count, 10); seq_printf(p, " IPI rescheduling interrupts\n"); - seq_printf(p, "CAL: "); + seq_printf(p, "CAL:"); for_each_online_cpu(j) - seq_printf(p, "%10u ", cpu_data(j).irq_call_count); + seq_put_decimal_ull_width(p, " ", cpu_data(j).irq_call_count, 10); seq_printf(p, " IPI function call interrupts\n"); #endif - seq_printf(p, "NMI: "); + seq_printf(p, "NMI:"); for_each_online_cpu(j) - seq_printf(p, "%10u ", cpu_data(j).counter); + seq_put_decimal_ull_width(p, " ", cpu_data(j).counter, 10); seq_printf(p, " Non-maskable interrupts\n"); return 0; } diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index 01ee800efde3..9ab6e79b617b 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c @@ -304,9 +304,9 @@ int arch_show_interrupts(struct seq_file *p, int prec) { int j; - seq_printf(p, "NMI: "); + seq_printf(p, "NMI:"); for_each_online_cpu(j) - seq_printf(p, "%10u ", cpu_data(j).__nmi_count); + seq_put_decimal_ull_width(p, " ", cpu_data(j).__nmi_count, 10); seq_printf(p, " Non-maskable interrupts\n"); return 0; } diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 385e3a5fc304..66cc8f001bd0 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c @@ -62,103 +62,103 @@ int arch_show_interrupts(struct seq_file *p, int prec) { int j; - seq_printf(p, "%*s: ", prec, "NMI"); + seq_printf(p, "%*s:", prec, "NMI"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->__nmi_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->__nmi_count, 10); seq_puts(p, " Non-maskable interrupts\n"); #ifdef CONFIG_X86_LOCAL_APIC - seq_printf(p, "%*s: ", prec, "LOC"); + seq_printf(p, "%*s:", prec, "LOC"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->apic_timer_irqs); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->apic_timer_irqs, 10); seq_puts(p, " Local timer interrupts\n"); - seq_printf(p, "%*s: ", prec, "SPU"); + seq_printf(p, "%*s:", prec, "SPU"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_spurious_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_spurious_count, 10); seq_puts(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 ", irq_stats(j)->apic_perf_irqs); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->apic_perf_irqs, 10); seq_puts(p, " Performance monitoring interrupts\n"); - seq_printf(p, "%*s: ", prec, "IWI"); + seq_printf(p, "%*s:", prec, "IWI"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->apic_irq_work_irqs); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->apic_irq_work_irqs, 10); seq_puts(p, " IRQ work interrupts\n"); - seq_printf(p, "%*s: ", prec, "RTR"); + seq_printf(p, "%*s:", prec, "RTR"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->icr_read_retry_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->icr_read_retry_count, 10); seq_puts(p, " APIC ICR read retries\n"); if (x86_platform_ipi_callback) { - seq_printf(p, "%*s: ", prec, "PLT"); + seq_printf(p, "%*s:", prec, "PLT"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->x86_platform_ipis); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->x86_platform_ipis, 10); seq_puts(p, " Platform interrupts\n"); } #endif #ifdef CONFIG_SMP - seq_printf(p, "%*s: ", prec, "RES"); + seq_printf(p, "%*s:", prec, "RES"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_resched_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_resched_count, 10); seq_puts(p, " Rescheduling interrupts\n"); - seq_printf(p, "%*s: ", prec, "CAL"); + seq_printf(p, "%*s:", prec, "CAL"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_call_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_call_count, 10); seq_puts(p, " Function call interrupts\n"); - seq_printf(p, "%*s: ", prec, "TLB"); + seq_printf(p, "%*s:", prec, "TLB"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_tlb_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_tlb_count, 10); seq_puts(p, " TLB shootdowns\n"); #endif #ifdef CONFIG_X86_THERMAL_VECTOR - seq_printf(p, "%*s: ", prec, "TRM"); + seq_printf(p, "%*s:", prec, "TRM"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_thermal_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_thermal_count, 10); seq_puts(p, " Thermal event interrupts\n"); #endif #ifdef CONFIG_X86_MCE_THRESHOLD - seq_printf(p, "%*s: ", prec, "THR"); + seq_printf(p, "%*s:", prec, "THR"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_threshold_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_threshold_count, 10); seq_puts(p, " Threshold APIC interrupts\n"); #endif #ifdef CONFIG_X86_MCE_AMD - seq_printf(p, "%*s: ", prec, "DFR"); + seq_printf(p, "%*s:", prec, "DFR"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->irq_deferred_error_count); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->irq_deferred_error_count, 10); seq_puts(p, " Deferred Error APIC interrupts\n"); #endif #ifdef CONFIG_X86_MCE - seq_printf(p, "%*s: ", prec, "MCE"); + seq_printf(p, "%*s:", prec, "MCE"); for_each_online_cpu(j) - seq_printf(p, "%10u ", per_cpu(mce_exception_count, j)); + seq_put_decimal_ull_width(p, " ", per_cpu(mce_exception_count, j), 10); seq_puts(p, " Machine check exceptions\n"); - seq_printf(p, "%*s: ", prec, "MCP"); + seq_printf(p, "%*s:", prec, "MCP"); for_each_online_cpu(j) - seq_printf(p, "%10u ", per_cpu(mce_poll_count, j)); + seq_put_decimal_ull_width(p, " ", per_cpu(mce_poll_count, j), 10); seq_puts(p, " Machine check polls\n"); #endif #ifdef CONFIG_X86_HV_CALLBACK_VECTOR if (test_bit(HYPERVISOR_CALLBACK_VECTOR, system_vectors)) { - seq_printf(p, "%*s: ", prec, "HYP"); + seq_printf(p, "%*s:", prec, "HYP"); for_each_online_cpu(j) - seq_printf(p, "%10u ", - irq_stats(j)->irq_hv_callback_count); + seq_put_decimal_ull_width(p, " ", + irq_stats(j)->irq_hv_callback_count, 10); seq_puts(p, " Hypervisor callback interrupts\n"); } #endif #if IS_ENABLED(CONFIG_HYPERV) if (test_bit(HYPERV_REENLIGHTENMENT_VECTOR, system_vectors)) { - seq_printf(p, "%*s: ", prec, "HRE"); + seq_printf(p, "%*s:", prec, "HRE"); for_each_online_cpu(j) - seq_printf(p, "%10u ", - irq_stats(j)->irq_hv_reenlightenment_count); + seq_put_decimal_ull_width(p, " ", + irq_stats(j)->irq_hv_reenlightenment_count, 10); seq_puts(p, " Hyper-V reenlightenment interrupts\n"); } if (test_bit(HYPERV_STIMER0_VECTOR, system_vectors)) { - seq_printf(p, "%*s: ", prec, "HVS"); + seq_printf(p, "%*s:", prec, "HVS"); for_each_online_cpu(j) - seq_printf(p, "%10u ", - irq_stats(j)->hyperv_stimer0_count); + seq_put_decimal_ull_width(p, " ", + irq_stats(j)->hyperv_stimer0_count, 10); seq_puts(p, " Hyper-V stimer0 interrupts\n"); } #endif @@ -167,28 +167,28 @@ int arch_show_interrupts(struct seq_file *p, int prec) seq_printf(p, "%*s: %10u\n", prec, "MIS", atomic_read(&irq_mis_count)); #endif #if IS_ENABLED(CONFIG_KVM) - seq_printf(p, "%*s: ", prec, "PIN"); + seq_printf(p, "%*s:", prec, "PIN"); for_each_online_cpu(j) - seq_printf(p, "%10u ", irq_stats(j)->kvm_posted_intr_ipis); + seq_put_decimal_ull_width(p, " ", irq_stats(j)->kvm_posted_intr_ipis, 10); seq_puts(p, " Posted-interrupt notification event\n"); - seq_printf(p, "%*s: ", prec, "NPI"); + seq_printf(p, "%*s:", prec, "NPI"); for_each_online_cpu(j) - seq_printf(p, "%10u ", - irq_stats(j)->kvm_posted_intr_nested_ipis); + seq_put_decimal_ull_width(p, " ", + irq_stats(j)->kvm_posted_intr_nested_ipis, 10); seq_puts(p, " Nested posted-interrupt event\n"); - seq_printf(p, "%*s: ", prec, "PIW"); + seq_printf(p, "%*s:", prec, "PIW"); for_each_online_cpu(j) - seq_printf(p, "%10u ", - irq_stats(j)->kvm_posted_intr_wakeup_ipis); + seq_put_decimal_ull_width(p, " ", + irq_stats(j)->kvm_posted_intr_wakeup_ipis, 10); seq_puts(p, " Posted-interrupt wakeup event\n"); #endif #ifdef CONFIG_X86_POSTED_MSI - seq_printf(p, "%*s: ", prec, "PMN"); + seq_printf(p, "%*s:", prec, "PMN"); for_each_online_cpu(j) - seq_printf(p, "%10u ", - irq_stats(j)->posted_msi_notification_count); + seq_put_decimal_ull_width(p, " ", + irq_stats(j)->posted_msi_notification_count, 10); seq_puts(p, " Posted MSI notification event\n"); #endif return 0; diff --git a/arch/xtensa/kernel/irq.c b/arch/xtensa/kernel/irq.c index b1e410f6b5ab..c4f46989f9b7 100644 --- a/arch/xtensa/kernel/irq.c +++ b/arch/xtensa/kernel/irq.c @@ -58,7 +58,7 @@ int arch_show_interrupts(struct seq_file *p, int prec) #if XTENSA_FAKE_NMI seq_printf(p, "%*s:", prec, "NMI"); for_each_online_cpu(cpu) - seq_printf(p, " %10lu", per_cpu(nmi_count, cpu)); + seq_put_decimal_ull_width(p, " ", per_cpu(nmi_count, cpu), 10); seq_puts(p, " Non-maskable interrupts\n"); #endif return 0; diff --git a/arch/xtensa/kernel/smp.c b/arch/xtensa/kernel/smp.c index 94a23f100726..71ec9eced8b9 100644 --- a/arch/xtensa/kernel/smp.c +++ b/arch/xtensa/kernel/smp.c @@ -453,8 +453,8 @@ void show_ipi_list(struct seq_file *p, int prec) for (i = 0; i < IPI_MAX; ++i) { seq_printf(p, "%*s:", prec, ipi_text[i].short_text); for_each_online_cpu(cpu) - seq_printf(p, " %10lu", - per_cpu(ipi_data, cpu).ipi_count[i]); + seq_put_decimal_ull_width(p, " ", + per_cpu(ipi_data, cpu).ipi_count[i], 10); seq_printf(p, " %s\n", ipi_text[i].long_text); } } diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index 9081ada81c3d..988ce781e813 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c @@ -494,9 +494,11 @@ int show_interrupts(struct seq_file *p, void *v) if (!desc->action || irq_desc_is_chained(desc) || !desc->kstat_irqs) goto outsparse; - seq_printf(p, "%*d: ", prec, i); + seq_printf(p, "%*d:", prec, i); for_each_online_cpu(j) - seq_printf(p, "%10u ", desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, j) : 0); + seq_put_decimal_ull_width(p, " ", + desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, j) : 0, + 10); raw_spin_lock_irqsave(&desc->lock, flags); if (desc->irq_data.chip) { -- 2.39.2 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width 2024-11-03 8:05 ` David Wang @ 2024-11-08 14:25 ` Thomas Gleixner -1 siblings, 0 replies; 8+ messages in thread From: Thomas Gleixner @ 2024-11-08 14:25 UTC (permalink / raw) To: David Wang, richard.henderson, linux, catalin.marinas, will, guoren, chenhuacai, kernel, James.Bottomley, deller, mpe, paul.walmsley, ysato, dalias, glaubitz, davem, andreas, mingo, bp, dave.hansen, x86, chris, jcmvbkbc Cc: linux-kernel, linux-alpha, linux-arm-kernel, linux-csky, loongarch, linux-parisc, linuxppc-dev, linux-riscv, linux-sh, sparclinux, David Wang David! On Sun, Nov 03 2024 at 16:05, David Wang wrote: $Subject: [PATCH] kernel/irq/proc: performance: ... That's not a valid subsystem prefix. > seq_printf is costy, when stress reading /proc/interrupts, profiling indicates > seq_printf takes about ~47% of show_interrupts samples: Also please follow the documentation for denoting functions in change logs: https://www.kernel.org/doc/html/latest/process/maintainer-tip.html#function-references-in-changelogs > arch/alpha/kernel/irq.c | 8 +-- > arch/arm/kernel/smp.c | 4 +- > arch/arm64/kernel/smp.c | 3 +- > arch/csky/kernel/smp.c | 4 +- > arch/loongarch/kernel/smp.c | 2 +- > arch/parisc/kernel/irq.c | 34 ++++++------ > arch/powerpc/kernel/irq.c | 44 ++++++++-------- > arch/riscv/kernel/smp.c | 3 +- > arch/sh/kernel/irq.c | 4 +- > arch/sparc/kernel/irq_32.c | 12 ++--- > arch/sparc/kernel/irq_64.c | 4 +- > arch/x86/kernel/irq.c | 100 ++++++++++++++++++------------------ > arch/xtensa/kernel/irq.c | 2 +- > arch/xtensa/kernel/smp.c | 4 +- > kernel/irq/proc.c | 6 ++- There is no dependency on these changes. So please split them up into seperate patches for core and the individual architectures. Thanks, tglx ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width @ 2024-11-08 14:25 ` Thomas Gleixner 0 siblings, 0 replies; 8+ messages in thread From: Thomas Gleixner @ 2024-11-08 14:25 UTC (permalink / raw) To: David Wang, richard.henderson, linux, catalin.marinas, will, guoren, chenhuacai, kernel, James.Bottomley, deller, mpe, paul.walmsley, ysato, dalias, glaubitz, davem, andreas, mingo, bp, dave.hansen, x86, chris, jcmvbkbc Cc: linux-kernel, linux-alpha, linux-arm-kernel, linux-csky, loongarch, linux-parisc, linuxppc-dev, linux-riscv, linux-sh, sparclinux, David Wang David! On Sun, Nov 03 2024 at 16:05, David Wang wrote: $Subject: [PATCH] kernel/irq/proc: performance: ... That's not a valid subsystem prefix. > seq_printf is costy, when stress reading /proc/interrupts, profiling indicates > seq_printf takes about ~47% of show_interrupts samples: Also please follow the documentation for denoting functions in change logs: https://www.kernel.org/doc/html/latest/process/maintainer-tip.html#function-references-in-changelogs > arch/alpha/kernel/irq.c | 8 +-- > arch/arm/kernel/smp.c | 4 +- > arch/arm64/kernel/smp.c | 3 +- > arch/csky/kernel/smp.c | 4 +- > arch/loongarch/kernel/smp.c | 2 +- > arch/parisc/kernel/irq.c | 34 ++++++------ > arch/powerpc/kernel/irq.c | 44 ++++++++-------- > arch/riscv/kernel/smp.c | 3 +- > arch/sh/kernel/irq.c | 4 +- > arch/sparc/kernel/irq_32.c | 12 ++--- > arch/sparc/kernel/irq_64.c | 4 +- > arch/x86/kernel/irq.c | 100 ++++++++++++++++++------------------ > arch/xtensa/kernel/irq.c | 2 +- > arch/xtensa/kernel/smp.c | 4 +- > kernel/irq/proc.c | 6 ++- There is no dependency on these changes. So please split them up into seperate patches for core and the individual architectures. Thanks, tglx _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width 2024-11-08 14:25 ` Thomas Gleixner @ 2024-11-08 15:28 ` David Wang -1 siblings, 0 replies; 8+ messages in thread From: David Wang @ 2024-11-08 15:28 UTC (permalink / raw) To: Thomas Gleixner Cc: richard.henderson, linux, catalin.marinas, will, guoren, chenhuacai, kernel, James.Bottomley, deller, mpe, paul.walmsley, ysato, dalias, glaubitz, davem, andreas, mingo, bp, dave.hansen, x86, chris, jcmvbkbc, linux-kernel, linux-alpha, linux-arm-kernel, linux-csky, loongarch, linux-parisc, linuxppc-dev, linux-riscv, linux-sh, sparclinux Hi, At 2024-11-08 22:25:13, "Thomas Gleixner" <tglx@linutronix.de> wrote: >David! > >On Sun, Nov 03 2024 at 16:05, David Wang wrote: > >$Subject: [PATCH] kernel/irq/proc: performance: ... > >That's not a valid subsystem prefix. copy that~ > >> seq_printf is costy, when stress reading /proc/interrupts, profiling indicates >> seq_printf takes about ~47% of show_interrupts samples: > >Also please follow the documentation for denoting functions in change >logs: > >https://www.kernel.org/doc/html/latest/process/maintainer-tip.html#function-references-in-changelogs > copy that~ >> arch/alpha/kernel/irq.c | 8 +-- >> arch/arm/kernel/smp.c | 4 +- >> arch/arm64/kernel/smp.c | 3 +- >> arch/csky/kernel/smp.c | 4 +- >> arch/loongarch/kernel/smp.c | 2 +- >> arch/parisc/kernel/irq.c | 34 ++++++------ >> arch/powerpc/kernel/irq.c | 44 ++++++++-------- >> arch/riscv/kernel/smp.c | 3 +- >> arch/sh/kernel/irq.c | 4 +- >> arch/sparc/kernel/irq_32.c | 12 ++--- >> arch/sparc/kernel/irq_64.c | 4 +- >> arch/x86/kernel/irq.c | 100 ++++++++++++++++++------------------ >> arch/xtensa/kernel/irq.c | 2 +- >> arch/xtensa/kernel/smp.c | 4 +- >> kernel/irq/proc.c | 6 ++- > >There is no dependency on these changes. So please split them up into >seperate patches for core and the individual architectures.an Thanks for all the review, I will make a patchset for this. > >Thanks, > > tglx David ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width @ 2024-11-08 15:28 ` David Wang 0 siblings, 0 replies; 8+ messages in thread From: David Wang @ 2024-11-08 15:28 UTC (permalink / raw) To: Thomas Gleixner Cc: richard.henderson, linux, catalin.marinas, will, guoren, chenhuacai, kernel, James.Bottomley, deller, mpe, paul.walmsley, ysato, dalias, glaubitz, davem, andreas, mingo, bp, dave.hansen, x86, chris, jcmvbkbc, linux-kernel, linux-alpha, linux-arm-kernel, linux-csky, loongarch, linux-parisc, linuxppc-dev, linux-riscv, linux-sh, sparclinux Hi, At 2024-11-08 22:25:13, "Thomas Gleixner" <tglx@linutronix.de> wrote: >David! > >On Sun, Nov 03 2024 at 16:05, David Wang wrote: > >$Subject: [PATCH] kernel/irq/proc: performance: ... > >That's not a valid subsystem prefix. copy that~ > >> seq_printf is costy, when stress reading /proc/interrupts, profiling indicates >> seq_printf takes about ~47% of show_interrupts samples: > >Also please follow the documentation for denoting functions in change >logs: > >https://www.kernel.org/doc/html/latest/process/maintainer-tip.html#function-references-in-changelogs > copy that~ >> arch/alpha/kernel/irq.c | 8 +-- >> arch/arm/kernel/smp.c | 4 +- >> arch/arm64/kernel/smp.c | 3 +- >> arch/csky/kernel/smp.c | 4 +- >> arch/loongarch/kernel/smp.c | 2 +- >> arch/parisc/kernel/irq.c | 34 ++++++------ >> arch/powerpc/kernel/irq.c | 44 ++++++++-------- >> arch/riscv/kernel/smp.c | 3 +- >> arch/sh/kernel/irq.c | 4 +- >> arch/sparc/kernel/irq_32.c | 12 ++--- >> arch/sparc/kernel/irq_64.c | 4 +- >> arch/x86/kernel/irq.c | 100 ++++++++++++++++++------------------ >> arch/xtensa/kernel/irq.c | 2 +- >> arch/xtensa/kernel/smp.c | 4 +- >> kernel/irq/proc.c | 6 ++- > >There is no dependency on these changes. So please split them up into >seperate patches for core and the individual architectures.an Thanks for all the review, I will make a patchset for this. > >Thanks, > > tglx David _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width 2024-11-03 8:05 ` David Wang @ 2024-12-11 22:32 ` patchwork-bot+linux-riscv -1 siblings, 0 replies; 8+ messages in thread From: patchwork-bot+linux-riscv @ 2024-12-11 22:32 UTC (permalink / raw) To: David Wang Cc: linux-riscv, tglx, richard.henderson, linux, catalin.marinas, will, guoren, chenhuacai, kernel, James.Bottomley, deller, mpe, paul.walmsley, ysato, dalias, glaubitz, davem, andreas, mingo, bp, dave.hansen, x86, chris, jcmvbkbc, linux-kernel, linux-alpha, linux-arm-kernel, linux-csky, loongarch, linux-parisc, linuxppc-dev, linux-sh, sparclinux Hello: This patch was applied to riscv/linux.git (fixes) by Michael Ellerman <mpe@ellerman.id.au>: On Sun, 3 Nov 2024 16:05:52 +0800 you wrote: > seq_printf is costy, when stress reading /proc/interrupts, profiling indicates > seq_printf takes about ~47% of show_interrupts samples: > > show_interrupts(94.495% 5166019/5466991) > seq_printf(47.429% 2450210/5166019) > vsnprintf(89.232% 2186366/2450210) > format_decode(24.005% 524831/2186366) > number(19.488% 426084/2186366) > memcpy_orig(3.739% 81753/2186366) > ... > _raw_spin_unlock_irqrestore(26.643% 1376379/5166019) > mtree_load(8.059% 416304/5166019) > > [...] Here is the summary with links: - kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width https://git.kernel.org/riscv/c/5b881c1f8379 You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width @ 2024-12-11 22:32 ` patchwork-bot+linux-riscv 0 siblings, 0 replies; 8+ messages in thread From: patchwork-bot+linux-riscv @ 2024-12-11 22:32 UTC (permalink / raw) To: David Wang Cc: linux-riscv, tglx, richard.henderson, linux, catalin.marinas, will, guoren, chenhuacai, kernel, James.Bottomley, deller, mpe, paul.walmsley, ysato, dalias, glaubitz, davem, andreas, mingo, bp, dave.hansen, x86, chris, jcmvbkbc, linux-kernel, linux-alpha, linux-arm-kernel, linux-csky, loongarch, linux-parisc, linuxppc-dev, linux-sh, sparclinux Hello: This patch was applied to riscv/linux.git (fixes) by Michael Ellerman <mpe@ellerman.id.au>: On Sun, 3 Nov 2024 16:05:52 +0800 you wrote: > seq_printf is costy, when stress reading /proc/interrupts, profiling indicates > seq_printf takes about ~47% of show_interrupts samples: > > show_interrupts(94.495% 5166019/5466991) > seq_printf(47.429% 2450210/5166019) > vsnprintf(89.232% 2186366/2450210) > format_decode(24.005% 524831/2186366) > number(19.488% 426084/2186366) > memcpy_orig(3.739% 81753/2186366) > ... > _raw_spin_unlock_irqrestore(26.643% 1376379/5166019) > mtree_load(8.059% 416304/5166019) > > [...] Here is the summary with links: - kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width https://git.kernel.org/riscv/c/5b881c1f8379 You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-12-11 23:45 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-11-03 8:05 [PATCH] kernel/irq/proc: performance: replace seq_printf with seq_put_decimal_ull_width David Wang 2024-11-03 8:05 ` David Wang 2024-11-08 14:25 ` Thomas Gleixner 2024-11-08 14:25 ` Thomas Gleixner 2024-11-08 15:28 ` David Wang 2024-11-08 15:28 ` David Wang 2024-12-11 22:32 ` patchwork-bot+linux-riscv 2024-12-11 22:32 ` patchwork-bot+linux-riscv
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.