From: Michael Kelley <mhklinux@outlook.com>
To: Haris Okanovic <harisokn@amazon.com>,
Thomas Gleixner <tglx@kernel.org>, Radu Rendec <radu@rendec.net>,
Dmitry Ilvokhin <d@ilvokhin.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: RE: [PATCH] genirq/proc: Fix missing CPU header in /proc/interrupts
Date: Tue, 22 Sep 2026 00:52:34 +0000 [thread overview]
Message-ID: <SN6PR02MB415743EDDFEB5B52EF1DC698D4832@SN6PR02MB4157.namprd02.prod.outlook.com> (raw)
In-Reply-To: <20260911-dev-harisokn-proc-interrupts-fix-b4-v1-1-f9ff208efcfa@amazon.com>
From: Haris Okanovic <harisokn@amazon.com> Sent: Friday, September 11, 2026 11:32 AM
>
> irq_seq_show() must be idempotent since it may be called multiple times
> to render the same record, e.g. when seq_file's buffer is exceeded. It
> emits the CPU header behind the one-shot print_header flag, which the
> first pass clears, so the header is lost with the discarded buffer.
>
> This can be seen on large systems, such as 8g.48xl (192 CPUs) and
> 8i.96xl (384 CPUs) AWS instance types:
>
> $ head -1 /proc/interrupts
> 9: 0 0 ... 0 GICv3 25 Level vgic
>
> Replace print_header with the position of the first record and include
> the header whenever that record is emitted.
>
> Fixes: 171cc0d9eed1 ("genirq/proc: Speed up /proc/interrupts iteration")
> Signed-off-by: Haris Okanovic <harisokn@amazon.com>
> ---
> kernel/irq/proc.c | 24 +++++++++++++++++-------
> 1 file changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c
> index 1b835725f7b1c..0c0df16de5816 100644
> --- a/kernel/irq/proc.c
> +++ b/kernel/irq/proc.c
> @@ -462,7 +462,7 @@ int __weak arch_show_interrupts(struct seq_file *p, int prec)
> static DEFINE_RAW_SPINLOCK(irq_proc_constraints_lock);
>
> static struct irq_proc_constraints {
> - bool print_header;
> + loff_t first_pos;
> unsigned int num_prec;
> unsigned int chip_width;
> } irq_proc_constraints __read_mostly = {
> @@ -543,14 +543,13 @@ static int irq_seq_show(struct seq_file *p, void *v)
> struct irqaction *action;
>
> /* Print header for the first interrupt? */
> - if (constr->print_header) {
> + if (p->index == constr->first_pos) {
> unsigned int cpu;
>
> seq_printf(p, "%*s", constr->num_prec + 8, "");
> for_each_online_cpu(cpu)
> seq_printf(p, "CPU%-8d", cpu);
> seq_putc(p, '\n');
> - constr->print_header = false;
> }
>
> if (desc == ARCH_PROC_IRQDESC)
> @@ -635,14 +634,25 @@ static void *irq_seq_next_desc(loff_t *pos)
>
> static void *irq_seq_start(struct seq_file *f, loff_t *pos)
> {
> - if (!*pos) {
> - struct irq_proc_constraints *constr = f->private;
> + struct irq_proc_constraints *constr = f->private;
> + bool first = !*pos;
> + void *ret;
>
> + if (first) {
> constr->num_prec = READ_ONCE(irq_proc_constraints.num_prec);
> constr->chip_width = READ_ONCE(irq_proc_constraints.chip_width);
> - constr->print_header = true;
> }
> - return irq_seq_next_desc(pos);
> +
> + ret = irq_seq_next_desc(pos);
> +
> + /*
> + * Record position of the first output record so that irq_seq_show()
> + * knows where to write the header.
> + */
> + if (first)
> + constr->first_pos = *pos;
> +
> + return ret;
> }
>
> static void *irq_seq_next(struct seq_file *f, void *v, loff_t *pos)
>
I tested this patch in an Azure x86/x64 VM with 416 CPUs. The "CPU"
header line is missing without the patch, and it appears when the
patch is applied. I verified that the 416 "CPU<nnn>" column labels
are correctly shown.
I have not reviewed the code.
Tested-by: Michael Kelley <mhklinux@outlook.com>
next prev parent reply other threads:[~2026-09-22 0:52 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-11 18:31 Haris Okanovic
2026-09-17 22:44 ` Okanovic, Haris
2026-09-18 2:55 ` Radu Rendec
2026-09-18 16:14 ` Okanovic, Haris
2026-09-22 0:52 ` Michael Kelley [this message]
2026-10-05 20:12 ` Okanovic, Haris
2026-10-05 20:46 ` Okanovic, Haris
2026-10-07 16:53 ` Radu Rendec
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=SN6PR02MB415743EDDFEB5B52EF1DC698D4832@SN6PR02MB4157.namprd02.prod.outlook.com \
--to=mhklinux@outlook.com \
--cc=d@ilvokhin.com \
--cc=harisokn@amazon.com \
--cc=linux-kernel@vger.kernel.org \
--cc=radu@rendec.net \
--cc=tglx@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
all inboxes | Powered by JetHome®