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 D74333DD506 for ; Mon, 23 Mar 2026 19:48:42 +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=1774295325; cv=none; b=k5G6I99qq0Ug4zRrrjyG7yE+KtjOmSqFyS8yyugjm/S/cL0f2jpbbvNXWkB+TPYQNftO3hPP9TnlHIJQmbNyAUVH50Pb2jBXILb/l6Hazn6BKhFPIgSMh1tQqruGSvwWL9jqLUJKqiNt8hwsXHp+QatPO62YX0lgxiiMRq/aaTg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774295325; c=relaxed/simple; bh=+ZPN5yLM8hTS+nOTQY3qFazyEKhP9PRxvGWu/VDsub0=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: Content-Type:MIME-Version; b=VSCAw4XL001W7S68pHJxNi8zC/7c/6v0HXecM6AwR4Fg7KNtSMoZ5+jAF2ERafg9xiDkDySA/C7gxXzEYsIxZ1t9YJLpncFwW1+86PFxnQoTQku1KMUH3Xb66Zuh9dmxUcV5iHPE7JzvCEusYPiCk7TmhJLQgxEpFtsM1vnvm4c= 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=uMgZ7Pws; 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="uMgZ7Pws" 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 10995C247B; Mon, 23 Mar 2026 21:48:39 +0200 (EET) DKIM-Filter: OpenDKIM Filter v2.11.0 mail.mindbit.ro 10995C247B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rendec.net; s=default; t=1774295321; bh=Sj0LWApKr4YWUeEZ2zPjK9ASCMcA+wVNpqh32H7OIsQ=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=uMgZ7PwsaJPSbgjLOG8eM0eTG5Fqutczj5PoY7rw+zi82myK0n9IQu7Ywu++zKUDS mHa9W1HX+xr6O4AMJC+JSO5a1D4Qq3Qe0AKYKl4gdik0ykinfHHHDcGwJnEU5Bx4eI LfoDXNfaKXbz7GXHiSpbTgTF/wtUcPatyQWl1cdvp0bfDfc9u77LsaXwombCC7ee/b bFlwo2vtTDiSo4mWS5BM8Rqi9zlrvEaUTDQ/Hldvaxw8gtslxDN0MABeo78w7fliJ1 ov7vuS0BporLcQ5D1UTTDvrRXBI4gODiyjzSMg/3r1h45Ff6HGKPNvltmc4YjoTb4w zRwRPjKit+wXQ== Message-ID: <4826b7249e4276677fa4bee4100b72d1ef0f98fd.camel@rendec.net> Subject: Re: [patch v2 05/14] genirq: Expose nr_irqs in core code From: Radu Rendec To: Thomas Gleixner , LKML Cc: x86@kernel.org, Dmitry Ilvokhin , Neil Horman Date: Mon, 23 Mar 2026 15:48:38 -0400 In-Reply-To: <20260320132102.364535811@kernel.org> References: <20260320131108.344376329@kernel.org> <20260320132102.364535811@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: > ... to avoid function calls in the core code to retrieve the maximum numb= er > of interrupts. >=20 > Signed-off-by: Thomas Gleixner > Reviewed-by: Dmitry Ilvokhin > --- > =C2=A0kernel/irq/internals.h |=C2=A0=C2=A0=C2=A0 1 + > =C2=A0kernel/irq/irqdesc.c=C2=A0=C2=A0 |=C2=A0=C2=A0 28 ++++++++++++++---= ----------- > =C2=A0kernel/irq/proc.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0= 2 +- > =C2=A03 files changed, 16 insertions(+), 15 deletions(-) >=20 > --- a/kernel/irq/internals.h > +++ b/kernel/irq/internals.h > @@ -21,6 +21,7 @@ > =C2=A0 > =C2=A0extern bool noirqdebug; > =C2=A0extern int irq_poll_cpu; > +extern unsigned int total_nr_irqs; > =C2=A0 > =C2=A0extern struct irqaction chained_action; > =C2=A0 > --- a/kernel/irq/irqdesc.c > +++ b/kernel/irq/irqdesc.c > @@ -140,14 +140,14 @@ static void desc_set_defaults(unsigned i > =C2=A0 desc_smp_init(desc, node, affinity); > =C2=A0} > =C2=A0 > -static unsigned int nr_irqs =3D NR_IRQS; > +unsigned int total_nr_irqs __read_mostly =3D NR_IRQS; > =C2=A0 > =C2=A0/** > =C2=A0 * irq_get_nr_irqs() - Number of interrupts supported by the system= . > =C2=A0 */ > =C2=A0unsigned int irq_get_nr_irqs(void) > =C2=A0{ > - return nr_irqs; > + return total_nr_irqs; > =C2=A0} > =C2=A0EXPORT_SYMBOL_GPL(irq_get_nr_irqs); > =C2=A0 > @@ -159,7 +159,7 @@ EXPORT_SYMBOL_GPL(irq_get_nr_irqs); > =C2=A0 */ > =C2=A0unsigned int irq_set_nr_irqs(unsigned int nr) > =C2=A0{ > - nr_irqs =3D nr; > + total_nr_irqs =3D nr; > =C2=A0 > =C2=A0 return nr; > =C2=A0} > @@ -187,9 +187,9 @@ static unsigned int irq_find_at_or_after > =C2=A0 struct irq_desc *desc; > =C2=A0 > =C2=A0 guard(rcu)(); > - desc =3D mt_find(&sparse_irqs, &index, nr_irqs); > + desc =3D mt_find(&sparse_irqs, &index, total_nr_irqs); > =C2=A0 > - return desc ? irq_desc_get_irq(desc) : nr_irqs; > + return desc ? irq_desc_get_irq(desc) : total_nr_irqs; > =C2=A0} > =C2=A0 > =C2=A0static void irq_insert_desc(unsigned int irq, struct irq_desc *desc= ) > @@ -543,7 +543,7 @@ static bool irq_expand_nr_irqs(unsigned > =C2=A0{ > =C2=A0 if (nr > MAX_SPARSE_IRQS) > =C2=A0 return false; > - nr_irqs =3D nr; > + total_nr_irqs =3D nr; > =C2=A0 return true; > =C2=A0} > =C2=A0 > @@ -557,16 +557,16 @@ int __init early_irq_init(void) > =C2=A0 /* Let arch update nr_irqs and return the nr of preallocated irqs = */ > =C2=A0 initcnt =3D arch_probe_nr_irqs(); > =C2=A0 printk(KERN_INFO "NR_IRQS: %d, nr_irqs: %d, preallocated irqs: %d\= n", > - =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NR_IRQS, nr_irqs, initcnt); > + =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NR_IRQS, total_nr_irqs, initcnt); > =C2=A0 > - if (WARN_ON(nr_irqs > MAX_SPARSE_IRQS)) > - nr_irqs =3D MAX_SPARSE_IRQS; > + if (WARN_ON(total_nr_irqs > MAX_SPARSE_IRQS)) > + total_nr_irqs =3D MAX_SPARSE_IRQS; > =C2=A0 > =C2=A0 if (WARN_ON(initcnt > MAX_SPARSE_IRQS)) > =C2=A0 initcnt =3D MAX_SPARSE_IRQS; > =C2=A0 > - if (initcnt > nr_irqs) > - nr_irqs =3D initcnt; > + if (initcnt > total_nr_irqs) > + total_nr_irqs =3D initcnt; > =C2=A0 > =C2=A0 for (i =3D 0; i < initcnt; i++) { > =C2=A0 desc =3D alloc_desc(i, node, 0, NULL, NULL); > @@ -862,7 +862,7 @@ void irq_free_descs(unsigned int from, u > =C2=A0{ > =C2=A0 int i; > =C2=A0 > - if (from >=3D nr_irqs || (from + cnt) > nr_irqs) > + if (from >=3D total_nr_irqs || (from + cnt) > total_nr_irqs) > =C2=A0 return; > =C2=A0 > =C2=A0 guard(mutex)(&sparse_irq_lock); > @@ -911,7 +911,7 @@ int __ref __irq_alloc_descs(int irq, uns > =C2=A0 if (irq >=3D0 && start !=3D irq) > =C2=A0 return -EEXIST; > =C2=A0 > - if (start + cnt > nr_irqs) { > + if (start + cnt > total_nr_irqs) { > =C2=A0 if (!irq_expand_nr_irqs(start + cnt)) > =C2=A0 return -ENOMEM; > =C2=A0 } > @@ -923,7 +923,7 @@ EXPORT_SYMBOL_GPL(__irq_alloc_descs); > =C2=A0 * irq_get_next_irq - get next allocated irq number > =C2=A0 * @offset: where to start the search > =C2=A0 * > - * Returns next irq number after offset or nr_irqs if none is found. > + * Returns next irq number after offset or total_nr_irqs if none is foun= d. > =C2=A0 */ > =C2=A0unsigned int irq_get_next_irq(unsigned int offset) > =C2=A0{ > --- a/kernel/irq/proc.c > +++ b/kernel/irq/proc.c > @@ -447,7 +447,7 @@ int __weak arch_show_interrupts(struct s > =C2=A0} > =C2=A0 > =C2=A0#ifndef ACTUAL_NR_IRQS > -# define ACTUAL_NR_IRQS irq_get_nr_irqs() > +# define ACTUAL_NR_IRQS total_nr_irqs > =C2=A0#endif > =C2=A0 > =C2=A0#define ZSTR1 "=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 0" Nit: This is modified again in the next patch, so it doesn't matter. But for the purpose of this patch in isolation, looking at where ACTUAL_NR_IRQS is used, in show_interrupts() the nr_irqs variable should also be initialized to total_nr_irqs to avoid the extra function call. Reviewed-by: Radu Rendec