mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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>

  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®