From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.mindbit.ro (xs1.mindbit.ro [80.86.107.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6775241B379 for ; Wed, 25 Mar 2026 19:47:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=80.86.107.70 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774468075; cv=none; b=QR1G/uHuGssA7Xm7p2kABDAe5/JF8rLVcFgl4ffm9Y2VbG6Y+E+6rSIOANqZMf7trN9T83KH7JpDOpPndBuBb8ASZ6Z6Cl+1xdJqntPmdpuhvTXub+oGgHdUkS62YPlKoYZCmWmeUJ8oM0M9JsaJ3+zBpnkcrC52fAKtuLfgiYQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774468075; c=relaxed/simple; bh=OZVdZ6LKfTs05oQa3TZThOjSlsBoDGQSSPAprn+H7r8=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: Content-Type:MIME-Version; b=V89c5Xf7u0thYGv4k7Pu7xm18p/xNePGeX4FPmJOdDgevwd9+O0ivkdoft7A8g/6nQiNUB6F6iIG6LfGwqjtOAKYuAjzCWn4UVx26U+XtVr0hYOA9hdSdK8IfwknGWl5zzXHe4GbBUiNObx1Jtp7lkcITeXtc2SCo419DKSeYj8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=rendec.net; spf=pass smtp.mailfrom=rendec.net; dkim=pass (2048-bit key) header.d=rendec.net header.i=@rendec.net header.b=qcRsQFac; arc=none smtp.client-ip=80.86.107.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=rendec.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rendec.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rendec.net header.i=@rendec.net header.b="qcRsQFac" Received: from dog.kanata.rendec.net (pool-174-112-193-187.cpe.net.cable.rogers.com [174.112.193.187]) by mail.mindbit.ro (Postfix) with ESMTPSA id D0A29C238F; Wed, 25 Mar 2026 21:47:50 +0200 (EET) DKIM-Filter: OpenDKIM Filter v2.11.0 mail.mindbit.ro D0A29C238F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rendec.net; s=default; t=1774468071; bh=AEMniEogqXwrnHT8xMePSQBzlJ/VmVahjWEvOlGpe30=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=qcRsQFacmJKp1R3bbt7lQ8oGv9pmSH0BxRVcNrw8YE71/QFUAEO3OlfKbFM+xkA87 eu74eo+2b+EbiUQmw+Zg0Sot61LRuUhn4DQGL5TzZEo5H0dQGhx1MMtXOeWD4ueJb+ ZKhJNbcN9KRtKS4Z94e06kzuBjErwg7YapjyrJzcJYSX6qWTmLiRW2csrVYfa9AcWh 7pOeAuPvQZmr5tSqb/L68uk00Hw1a5A01BzZxFM5dxOtjAFeKBV0nT557z0VK6S4v6 ggA8NBCu8Q3kpkk8Vy21T+FBnYYPaACd3idt1GLd5Yg0lUk6oc6ZMtZqqKq1qCvchh 9VmU/NT7Uaw8A== Message-ID: <1e3803cfee5be6cd970efda16a853a7082c49280.camel@rendec.net> Subject: Re: [patch v2 07/14] genirq: Calculate precision only when required From: Radu Rendec To: Thomas Gleixner , LKML Cc: x86@kernel.org, Dmitry Ilvokhin , Neil Horman Date: Wed, 25 Mar 2026 15:47:49 -0400 In-Reply-To: <20260320132102.498431075@kernel.org> References: <20260320131108.344376329@kernel.org> <20260320132102.498431075@kernel.org> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.56.2 (3.56.2-2.fc42) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 On Fri, 2026-03-20 at 14:21 +0100, Thomas Gleixner wrote: > Calculating the precision of the interrupt number column on every initial > show_interrupt() invocation is a pointless exercise as the underlying > maximum number of interrupts rarely changes. >=20 > Calculate it only when that number is modified and let show_interrupts() > use the cached value. >=20 > Signed-off-by: Thomas Gleixner > Reviewed-by: Dmitry Ilvokhin > --- > =C2=A0kernel/irq/internals.h |=C2=A0=C2=A0=C2=A0 6 ++++++ > =C2=A0kernel/irq/irqdesc.c=C2=A0=C2=A0 |=C2=A0=C2=A0 10 ++++++---- > =C2=A0kernel/irq/proc.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0 28 ++= +++++++++++++++++--------- > =C2=A03 files changed, 31 insertions(+), 13 deletions(-) >=20 > --- a/kernel/irq/internals.h > +++ b/kernel/irq/internals.h > @@ -134,6 +134,12 @@ static inline void unregister_handler_pr > =C2=A0static inline void irq_proc_update_valid(struct irq_desc *desc) { } > =C2=A0#endif > =C2=A0 > +#if defined(CONFIG_PROC_FS) && defined(CONFIG_GENERIC_IRQ_SHOW) > +void irq_proc_calc_prec(void); > +#else > +static inline void irq_proc_calc_prec(void) { } > +#endif > + > =C2=A0extern bool irq_can_set_affinity_usr(unsigned int irq); > =C2=A0 > =C2=A0extern int irq_do_set_affinity(struct irq_data *data, > --- a/kernel/irq/irqdesc.c > +++ b/kernel/irq/irqdesc.c > @@ -157,13 +157,12 @@ EXPORT_SYMBOL_GPL(irq_get_nr_irqs); > =C2=A0 * > =C2=A0 * Return: @nr. > =C2=A0 */ > -unsigned int irq_set_nr_irqs(unsigned int nr) > +unsigned int __init irq_set_nr_irqs(unsigned int nr) > =C2=A0{ > =C2=A0 total_nr_irqs =3D nr; > - > + irq_proc_calc_prec(); > =C2=A0 return nr; > =C2=A0} > -EXPORT_SYMBOL_GPL(irq_set_nr_irqs); > =C2=A0 > =C2=A0static DEFINE_MUTEX(sparse_irq_lock); > =C2=A0static struct maple_tree sparse_irqs =3D MTREE_INIT_EXT(sparse_irqs= , > @@ -544,6 +543,7 @@ static bool irq_expand_nr_irqs(unsigned > =C2=A0 if (nr > MAX_SPARSE_IRQS) > =C2=A0 return false; > =C2=A0 total_nr_irqs =3D nr; > + irq_proc_calc_prec(); > =C2=A0 return true; > =C2=A0} > =C2=A0 > @@ -572,6 +572,7 @@ int __init early_irq_init(void) > =C2=A0 desc =3D alloc_desc(i, node, 0, NULL, NULL); > =C2=A0 irq_insert_desc(i, desc); > =C2=A0 } > + irq_proc_calc_prec(); > =C2=A0 return arch_early_irq_init(); > =C2=A0} > =C2=A0 > @@ -592,7 +593,7 @@ int __init early_irq_init(void) > =C2=A0 > =C2=A0 init_irq_default_affinity(); > =C2=A0 > - printk(KERN_INFO "NR_IRQS: %d\n", NR_IRQS); > + pr_info("NR_IRQS: %d\n", NR_IRQS); > =C2=A0 > =C2=A0 count =3D ARRAY_SIZE(irq_desc); > =C2=A0 > @@ -602,6 +603,7 @@ int __init early_irq_init(void) > =C2=A0 goto __free_desc_res; > =C2=A0 } > =C2=A0 > + irq_proc_calc_prec(); > =C2=A0 return arch_early_irq_init(); > =C2=A0 > =C2=A0__free_desc_res: > --- a/kernel/irq/proc.c > +++ b/kernel/irq/proc.c > @@ -457,10 +457,21 @@ int __weak arch_show_interrupts(struct s > =C2=A0 return 0; > =C2=A0} > =C2=A0 > +static int irq_num_prec __read_mostly =3D 3; > + > =C2=A0#ifndef ACTUAL_NR_IRQS > =C2=A0# define ACTUAL_NR_IRQS total_nr_irqs > =C2=A0#endif > =C2=A0 > +void irq_proc_calc_prec(void) > +{ > + unsigned int prec, n; > + > + for (prec =3D 3, n =3D 1000; prec < 10 && n <=3D total_nr_irqs; ++prec) > + n *=3D 10; > + WRITE_ONCE(irq_num_prec, prec); > +} > + > =C2=A0#define ZSTR1 "=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 0" > =C2=A0#define ZSTR1_LEN (sizeof(ZSTR1) - 1) > =C2=A0#define ZSTR16 ZSTR1 ZSTR1 ZSTR1 ZSTR1 ZSTR1 ZSTR1 ZSTR1 ZSTR1 \ > @@ -499,8 +510,7 @@ void irq_proc_emit_counts(struct seq_fil > =C2=A0 > =C2=A0int show_interrupts(struct seq_file *p, void *v) > =C2=A0{ > - const unsigned int nr_irqs =3D irq_get_nr_irqs(); > - static int prec; > + int prec =3D READ_ONCE(irq_num_prec); > =C2=A0 > =C2=A0 int i =3D *(loff_t *) v, j; > =C2=A0 struct irqaction *action; > @@ -514,9 +524,6 @@ int show_interrupts(struct seq_file *p, > =C2=A0 > =C2=A0 /* print header and calculate the width of the first column */ > =C2=A0 if (i =3D=3D 0) { > - for (prec =3D 3, j =3D 1000; prec < 10 && j <=3D nr_irqs; ++prec) > - j *=3D 10; > - > =C2=A0 seq_printf(p, "%*s", prec + 8, ""); > =C2=A0 for_each_online_cpu(j) > =C2=A0 seq_printf(p, "CPU%-8d", j); > @@ -552,13 +559,16 @@ int show_interrupts(struct seq_file *p, > =C2=A0 } else { > =C2=A0 seq_printf(p, "%8s", "None"); > =C2=A0 } > + > + seq_putc(p, ' '); > =C2=A0 if (desc->irq_data.domain) > - seq_printf(p, " %*lu", prec, desc->irq_data.hwirq); > + seq_put_decimal_ull_width(p, "", desc->irq_data.hwirq, prec); > =C2=A0 else > =C2=A0 seq_printf(p, " %*s", prec, ""); > -#ifdef CONFIG_GENERIC_IRQ_SHOW_LEVEL > - seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : = "Edge"); > -#endif > + > + if (IS_ENABLED(CONFIG_GENERIC_IRQ_SHOW_LEVEL)) > + seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" := "Edge"); > + > =C2=A0 if (desc->name) > =C2=A0 seq_printf(p, "-%-8s", desc->name); > =C2=A0 Reviewed-by: Radu Rendec