Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c6927a3 authored by Yinghai Lu's avatar Yinghai Lu Committed by Ingo Molnar
Browse files

irq: replace loop with nr_irqs with for_each_irq_desc



There are a handful of loops that go from 0 to nr_irqs and use
get_irq_desc() on them. These would allocate all the irq_desc
entries, regardless of the need for them.

Use the smarter for_each_irq_desc() iterator that will only iterate
over the present ones.

v2: make sure arch without GENERIC_HARDIRQS work too

Signed-off-by: default avatarYinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 9059d8fa
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1871,10 +1871,10 @@ static int migrate_irq_remapped_level(int irq)

static void ir_irq_migration(struct work_struct *work)
{
	int irq;
	unsigned int irq;
	struct irq_desc *desc;

	for (irq = 0; irq < nr_irqs; irq++) {
		struct irq_desc *desc = irq_to_desc(irq);
	for_each_irq_desc(irq, desc) {
		if (desc->status & IRQ_MOVE_PENDING) {
			unsigned long flags;

+2 −3
Original line number Diff line number Diff line
@@ -224,17 +224,16 @@ void fixup_irqs(cpumask_t map)
{
	unsigned int irq;
	static int warned;
	struct irq_desc *desc;

	for (irq = 0; irq < nr_irqs; irq++) {
	for_each_irq_desc(irq, desc) {
		cpumask_t mask;
		int break_affinity = 0;
		int set_affinity = 1;
		struct irq_desc *desc;

		if (irq == 2)
			continue;

		desc = irq_to_desc(irq);
		/* interrupt's are disabled at this point */
		spin_lock(&desc->lock);

+5 −12
Original line number Diff line number Diff line
@@ -142,25 +142,18 @@ void __init init_ISA_irqs(void)
	init_bsp_APIC();
	init_8259A(0);

	for (i = 0; i < nr_irqs; i++) {
	for (i = 0; i < 16; i++) {
		struct irq_desc *desc = irq_to_desc(i);

		desc->status = IRQ_DISABLED;
		desc->action = NULL;
		desc->depth = 1;

		if (i < 16) {
		/*
		 * 16 old-style INTA-cycle interrupts:
		 */
		set_irq_chip_and_handler_name(i, &i8259A_chip,
						      handle_level_irq, "XT");
		} else {
			/*
			 * 'high' PCI IRQs filled in on demand
			 */
			desc->chip = &no_irq_chip;
		}
	}
}

+7 −0
Original line number Diff line number Diff line
@@ -202,9 +202,16 @@ extern struct irq_desc irq_desc[NR_IRQS];
extern struct irq_desc *irq_desc;
#endif

#ifdef CONFIG_GENERIC_HARDIRQS
#define for_each_irq_desc(irq, desc)		\
	for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc = &irq_desc[irq])
#endif

#else

extern struct irq_desc *sparse_irqs;
#define for_each_irq_desc(irqX, desc)		\
	for (desc = sparse_irqs, irqX = desc->irq; desc && irqX != -1U; desc = desc->next, irqX = desc ? desc->irq : -1U)

#endif

+2 −2
Original line number Diff line number Diff line
@@ -14,11 +14,11 @@ extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
		unsigned long flags);

#ifdef CONFIG_PROC_FS
extern void register_irq_proc(unsigned int irq);
extern void register_irq_proc(unsigned int irq, struct irq_desc *desc);
extern void register_handler_proc(unsigned int irq, struct irqaction *action);
extern void unregister_handler_proc(unsigned int irq, struct irqaction *action);
#else
static inline void register_irq_proc(unsigned int irq) { }
static inline void register_irq_proc(unsigned int irq, struct irq_desc *desc) { }
static inline void register_handler_proc(unsigned int irq,
					 struct irqaction *action) { }
static inline void unregister_handler_proc(unsigned int irq,
Loading