From: Shrikanth Hegde <sshegde@linux.ibm.com>
To: Thomas Gleixner <tglx@kernel.org>, LKML <linux-kernel@vger.kernel.org>
Cc: x86@kernel.org, Michael Kelley <mhklinux@outlook.com>,
Dmitry Ilvokhin <d@ilvokhin.com>, Radu Rendec <radu@rendec.net>,
Jan Kiszka <jan.kiszka@siemens.com>,
Kieran Bingham <kbingham@kernel.org>,
Florian Fainelli <florian.fainelli@broadcom.com>,
Marc Zyngier <maz@kernel.org>
Subject: Re: [patch V6 00/16] Improve /proc/interrupts further
Date: Wed, 20 May 2026 02:48:42 +0530 [thread overview]
Message-ID: <e123b8b9-a179-48fa-9e48-2bfcbcc24b86@linux.ibm.com> (raw)
In-Reply-To: <20260517194421.705253664@kernel.org>
Hi Thomas.
On 5/18/26 1:31 AM, Thomas Gleixner wrote:
> This is a follow up to v5 which can be found here:
>
> https://lore.kernel.org/20260401195625.213446764@kernel.org
>
> The v1 cover letter contains a full analysis, explanation and numbers:
>
> https://lore.kernel.org/20260303150539.513068586@kernel.org
>
> TLDR:
>
> - The performance of reading of /proc/interrupts has been improved
> piecewise over the years, but most of the low hanging fruit has been
> left on the table.
>
Ran this on powerVM box with 240 CPUs.
Ran perf stat -r 1000 cat /proc/interrupts > tmp.txt
and Observed minimal improvement with series.
Base:
Performance counter stats for 'cat /proc/interrupts' (1000 runs):
0.32 msec task-clock:HG # 0.617 CPUs utilized ( +- 0.17% )
0 context-switches:HG # 0.000 /sec
0 cpu-migrations:HG # 0.000 /sec
44 page-faults:HG # 136.122 K/sec ( +- 0.03% )
1,313,263 cycles:HG # 4.063 GHz ( +- 0.17% )
2,172,511 instructions:HG # 1.65 insn per cycle ( +- 0.05% )
371,171 branches:HG # 1.148 G/sec ( +- 0.05% )
4,918 branch-misses:HG # 1.32% of all branches ( +- 0.35% )
0.000523661 +- 0.000000914 seconds time elapsed ( +- 0.17% )
v6 series:
Performance counter stats for 'cat /proc/interrupts' (1000 runs):
0.30 msec task-clock:HG # 0.591 CPUs utilized ( +- 0.25% )
0 context-switches:HG # 0.000 /sec
0 cpu-migrations:HG # 0.000 /sec
44 page-faults:HG # 145.802 K/sec ( +- 0.03% )
1,224,666 cycles:HG # 4.058 GHz ( +- 0.25% )
1,667,435 instructions:HG # 1.36 insn per cycle ( +- 0.08% )
277,534 branches:HG # 919.660 M/sec ( +- 0.09% )
5,066 branch-misses:HG # 1.83% of all branches ( +- 0.45% )
0.00051099 +- 0.00000110 seconds time elapsed ( +- 0.21% ) << 3-4% improvement
Looking at powerpc arch_show_interrupts,
It could use the similar set of optimizations.
- move to array based
- use irq_proc_emit_counts
- some interrupts such as machine check, is hardly set. set skip_vector.
Copilot suggested below diff to quickly try irq_proc_emit_counts integration.
It showed little gains compared to v6. So it maybe worth fixing that in the
right way. (similar to x86 stuff you have done)
Performance counter stats for 'cat /proc/interrupts' (1000 runs):
0.29 msec task-clock:HG # 0.586 CPUs utilized ( +- 0.22% )
0 context-switches:HG # 0.000 /sec
0 cpu-migrations:HG # 0.000 /sec
44 page-faults:HG # 153.067 K/sec ( +- 0.03% )
1,166,567 cycles:HG # 4.058 GHz ( +- 0.22% )
1,475,365 instructions:HG # 1.26 insn per cycle ( +- 0.09% )
249,051 branches:HG # 866.397 M/sec ( +- 0.10% )
5,104 branch-misses:HG # 2.05% of all branches ( +- 0.33% )
0.000490211 +- 0.000000992 seconds time elapsed ( +- 0.20% ) <<< 3-4% improvements.
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index a0e8b998c9b5..19c9f28c39d3 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -83,6 +83,18 @@ u32 tau_interrupts(unsigned long cpu);
#endif
#endif /* CONFIG_PPC32 */
+
+/*
+ * Return a percpu pointer to a given unsigned int member of irq_stat.
+ */
+static __always_inline unsigned int __percpu *ppc_irq_stat_member(size_t off)
+{
+ return (unsigned int __percpu *)((char __percpu *)&irq_stat + off);
+}
+
+#define PPC_IRQ_STAT_PCPU(member) \
+ ppc_irq_stat_member(offsetof(irq_cpustat_t, member))
+
int arch_show_interrupts(struct seq_file *p, int prec)
{
int j;
@@ -97,33 +109,27 @@ int arch_show_interrupts(struct seq_file *p, int prec)
#endif /* CONFIG_PPC32 && CONFIG_TAU_INT */
seq_printf(p, "%*s:", prec, "LOC");
- for_each_online_cpu(j)
- seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).timer_irqs_event, 10);
+ irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(timer_irqs_event));
seq_printf(p, " Local timer interrupts for timer event device\n");
seq_printf(p, "%*s:", prec, "BCT");
- for_each_online_cpu(j)
- seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).broadcast_irqs_event, 10);
+ irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(broadcast_irqs_event));
seq_printf(p, " Broadcast timer interrupts for timer event device\n");
seq_printf(p, "%*s:", prec, "LOC");
- for_each_online_cpu(j)
- seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).timer_irqs_others, 10);
+ irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(timer_irqs_others));
seq_printf(p, " Local timer interrupts for others\n");
seq_printf(p, "%*s:", prec, "SPU");
- for_each_online_cpu(j)
- seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).spurious_irqs, 10);
+ irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(spurious_irqs));
seq_printf(p, " Spurious interrupts\n");
seq_printf(p, "%*s:", prec, "PMI");
- for_each_online_cpu(j)
- seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).pmu_irqs, 10);
+ irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(pmu_irqs));
seq_printf(p, " Performance monitoring interrupts\n");
seq_printf(p, "%*s:", prec, "MCE");
- for_each_online_cpu(j)
- seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).mce_exceptions, 10);
+ irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(mce_exceptions));
seq_printf(p, " Machine check exceptions\n");
#ifdef CONFIG_PPC_BOOK3S_64
@@ -136,22 +142,19 @@ int arch_show_interrupts(struct seq_file *p, int prec)
#endif
seq_printf(p, "%*s:", prec, "NMI");
- for_each_online_cpu(j)
- seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).sreset_irqs, 10);
+ irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(sreset_irqs));
seq_printf(p, " System Reset interrupts\n");
#ifdef CONFIG_PPC_WATCHDOG
seq_printf(p, "%*s:", prec, "WDG");
- for_each_online_cpu(j)
- seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).soft_nmi_irqs, 10);
+ irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(soft_nmi_irqs));
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");
- for_each_online_cpu(j)
- seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat, j).doorbell_irqs, 10);
+ irq_proc_emit_counts(p, PPC_IRQ_STAT_PCPU(doorbell_irqs));
seq_printf(p, " Doorbell interrupts\n");
}
#endif
next prev parent reply other threads:[~2026-05-19 21:19 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-17 20:01 Thomas Gleixner
2026-05-17 20:01 ` [patch V6 01/16] x86/irq: Optimize interrupts decimals printing Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Dmitry Ilvokhin
2026-05-17 20:01 ` [patch V6 02/16] genirq/proc: Avoid formatting zero counts in /proc/interrupts Thomas Gleixner
2026-05-19 21:24 ` Shrikanth Hegde
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:01 ` [patch V6 03/16] genirq/proc: Utilize irq_desc::tot_count to avoid evaluation Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:01 ` [patch V6 04/16] x86/irq: Make irqstats array based Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-30 9:36 ` [patch V6 04/16] " Dan Carpenter
2026-05-17 20:01 ` [patch V6 05/16] x86/irq: Suppress unlikely interrupt stats by default Thomas Gleixner
2026-05-21 15:52 ` Shrikanth Hegde
2026-05-21 20:46 ` Thomas Gleixner
2026-05-23 17:48 ` Shrikanth Hegde
2026-05-24 12:37 ` Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:01 ` [patch V6 06/16] x86/irq: Move IOAPIC misrouted and PIC/APIC error counts into irq_stats Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 07/16] scripts/gdb: Update x86 interrupts to the array based storage Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 08/16] genirq: Expose nr_irqs in core code Thomas Gleixner
2026-05-19 21:29 ` Shrikanth Hegde
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 09/16] genirq/manage: Make NMI cleanup RT safe Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 10/16] genirq: Cache the condition for /proc/interrupts exposure Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 11/16] genirq: Calculate precision only when required Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 12/16] genirq/proc: Increase default interrupt number precision to four Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 13/16] genirq: Add rcuref count to struct irq_desc Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 14/16] genirq: Expose irq_find_desc_at_or_after() in core code Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 15/16] genirq/proc: Runtime size the chip name Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-17 20:02 ` [patch V6 16/16] genirq/proc: Speed up /proc/interrupts iteration Thomas Gleixner
2026-05-26 14:22 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
2026-05-18 3:54 ` [patch V6 00/16] Improve /proc/interrupts further mhklkml
2026-05-19 21:18 ` Shrikanth Hegde [this message]
2026-05-20 15:27 ` Thomas Gleixner
2026-05-21 4:34 ` Shrikanth Hegde
2026-05-21 7:53 ` Thomas Gleixner
2026-05-21 14:48 ` Shrikanth Hegde
2026-05-21 21:07 ` Thomas Gleixner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e123b8b9-a179-48fa-9e48-2bfcbcc24b86@linux.ibm.com \
--to=sshegde@linux.ibm.com \
--cc=d@ilvokhin.com \
--cc=florian.fainelli@broadcom.com \
--cc=jan.kiszka@siemens.com \
--cc=kbingham@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=mhklinux@outlook.com \
--cc=radu@rendec.net \
--cc=tglx@kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome