Commit 1ad2048b authored by Bart Van Assche's avatar Bart Van Assche Committed by Thomas Gleixner
Browse files

genirq: Switch to irq_get_nr_irqs()



Use the irq_get_nr_irqs() function instead of the global variable
'nr_irqs'. Cache the result of this function in a local variable in
order not to rely on CSE (common subexpression elimination). Prepare
for changing 'nr_irqs' from an exported global variable into a variable
with file scope.

Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20241015190953.1266194-22-bvanassche@acm.org
parent f4dd946c
Loading
Loading
Loading
Loading
+19 −14
Original line number Diff line number Diff line
@@ -12,25 +12,30 @@ extern struct irq_desc *irq_to_desc(unsigned int irq);
unsigned int irq_get_next_irq(unsigned int offset);

#define for_each_irq_desc(irq, desc)                                      \
	for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs;		\
	for (unsigned int __nr_irqs__ = irq_get_nr_irqs(); __nr_irqs__;   \
	     __nr_irqs__ = 0)                                             \
		for (irq = 0, desc = irq_to_desc(irq); irq < __nr_irqs__; \
		     irq++, desc = irq_to_desc(irq))                      \
			if (!desc)                                        \
				;                                         \
			else


# define for_each_irq_desc_reverse(irq, desc)				\
	for (irq = nr_irqs - 1, desc = irq_to_desc(irq); irq >= 0;	\
	     irq--, desc = irq_to_desc(irq))				\
	for (irq = irq_get_nr_irqs() - 1, desc = irq_to_desc(irq);	\
	     irq >= 0; irq--, desc = irq_to_desc(irq))			\
		if (!desc)						\
			;						\
		else

#define for_each_active_irq(irq)                                        \
	for (irq = irq_get_next_irq(0); irq < nr_irqs;	\
	for (unsigned int __nr_irqs__ = irq_get_nr_irqs(); __nr_irqs__; \
	     __nr_irqs__ = 0)                                           \
		for (irq = irq_get_next_irq(0); irq < __nr_irqs__;      \
		     irq = irq_get_next_irq(irq + 1))

#define for_each_irq_nr(irq)                                            \
       for (irq = 0; irq < nr_irqs; irq++)
	for (unsigned int __nr_irqs__ = irq_get_nr_irqs(); __nr_irqs__; \
	     __nr_irqs__ = 0)                                           \
		for (irq = 0; irq < __nr_irqs__; irq++)

#endif
+1 −1
Original line number Diff line number Diff line
@@ -1225,7 +1225,7 @@ int irq_domain_alloc_descs(int virq, unsigned int cnt, irq_hw_number_t hwirq,
		virq = __irq_alloc_descs(virq, virq, cnt, node, THIS_MODULE,
					 affinity);
	} else {
		hint = hwirq % nr_irqs;
		hint = hwirq % irq_get_nr_irqs();
		if (hint == 0)
			hint++;
		virq = __irq_alloc_descs(-1, hint, cnt, node, THIS_MODULE,
+2 −1
Original line number Diff line number Diff line
@@ -457,11 +457,12 @@ int __weak arch_show_interrupts(struct seq_file *p, int prec)
}

#ifndef ACTUAL_NR_IRQS
# define ACTUAL_NR_IRQS nr_irqs
# define ACTUAL_NR_IRQS irq_get_nr_irqs()
#endif

int show_interrupts(struct seq_file *p, void *v)
{
	const unsigned int nr_irqs = irq_get_nr_irqs();
	static int prec;

	int i = *(loff_t *) v, j;