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

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

irq: make irq_desc to use dyn_array



Signed-off-by: default avatarYinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 5aeecaf4
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -179,7 +179,11 @@ struct irq_desc {
	const char		*name;
} ____cacheline_internodealigned_in_smp;

#ifdef CONFIG_HAVE_DYN_ARRAY
extern struct irq_desc *irq_desc;
#else
extern struct irq_desc irq_desc[NR_IRQS];
#endif

/*
 * Migration helpers for obsolete names, they will go away:
+31 −0
Original line number Diff line number Diff line
@@ -48,6 +48,36 @@ handle_bad_irq(unsigned int irq, struct irq_desc *desc)
 * Controller mappings for all interrupt sources:
 */
int nr_irqs = NR_IRQS;

#ifdef CONFIG_HAVE_DYN_ARRAY
static struct irq_desc irq_desc_init __initdata = {
	.status = IRQ_DISABLED,
	.chip = &no_irq_chip,
	.handle_irq = handle_bad_irq,
	.depth = 1,
	.lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
#ifdef CONFIG_SMP
	.affinity = CPU_MASK_ALL
#endif
};

static void __init init_work(void *data)
{
	struct dyn_array *da = data;
	int i;
	struct  irq_desc *desc;

	desc = *da->name;

	for (i = 0; i < *da->nr; i++)
		memcpy(&desc[i], &irq_desc_init, sizeof(struct irq_desc));
}

struct irq_desc *irq_desc;
DEFINE_DYN_ARRAY(irq_desc, sizeof(struct irq_desc), nr_irqs, PAGE_SIZE, init_work);

#else

struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
	[0 ... NR_IRQS-1] = {
		.status = IRQ_DISABLED,
@@ -60,6 +90,7 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
#endif
	}
};
#endif

/*
 * What should we do if we get a hw irq event on an illegal vector?