Messages in this thread | | | From | (Eric W. Biederman) | Date | Sun, 03 Aug 2008 02:15:54 -0700 | Subject | Re: [PATCH 00/25] dyn_array and nr_irqs support v3 |
| |
"Yinghai Lu" <yhlu.kernel@gmail.com> writes:
> how about > > diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c > index f4c8a03..aa6888c 100644 > --- a/kernel/irq/handle.c > +++ b/kernel/irq/handle.c > @@ -47,19 +47,73 @@ handle_bad_irq(unsigned int irq, struct irq_desc *desc) > * > * Controller mappings for all interrupt sources: > */ > -struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { > - [0 ... NR_IRQS-1] = { > - .status = IRQ_DISABLED, > - .chip = &no_irq_chip, > - .handle_irq = handle_bad_irq, > - .depth = 1, > - .lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock), > +static irq_desc **irq_desc_ptr; > +DEFINE_DYN_ARRAY(irq_desc_ptr, sizeof(struct irq_desc *), nr_irqs, > PAGE_SIZE, NULL); > + > +#define NR_IRQ_DESC 4096 > + > +static struct irq_desc irq_desc__init = { > + .irq = -1;
Do you perhaps mean 0xffffffffU ?
> + .status = IRQ_DISABLED, > + .chip = &no_irq_chip, > + .handle_irq = handle_bad_irq, > + .depth = 1, > + .lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock), > #ifdef CONFIG_SMP > - .affinity = CPU_MASK_ALL > + .affinity = CPU_MASK_ALL > #endif > - } > }; > > +static int nr_irq_desc = NR_IRQ_DESC; > + > +static int __init parse_nr_irq_desc(char *arg) > +{ > + if (arg) > + nr_irq_desc = simple_strtoul(arg, NULL, 0); > + return 0; > +} > + > +early_param("nr_irq_desc", parse_nr_irq_desc); > + > +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)); > +} > + > +static struct irq_desc *irq_desc; > +DEFINE_DYN_ARRAY(irq_desc, sizeof(struct irq_desc), nr_irq_desc, > PAGE_SIZE, init_work); > + > +struct irq_desc *get_irq_desc(int irq)
Ugh. This has the wrong type. It must be unsigned int irq. > +{ > + struct irq_desc *desc; > + int i; > + > + desc = irq_desc_ptr[irq]; > + > + if (desc) > + return desc; > + > + for (i = 0; i < nr_irq_desc; i++) { > + if (irq_desc[i]->irq != -1)
Which makes this line wrong. > + continue; > + > + desc = &irq_desc[i]; > + desc->irq = irq; > + irq_desc_ptr[irq] = desc; > + > + return desc; > + } > + > + panic("please boot with nr_irq_desc=%d\n", nr_irq_desc * 2); > +} > + > /* > * What should we do if we get a hw irq event on an illegal vector? > * Each architecture has to answer this themself. > > > and later use get_irq_desc(i) instead irq_desc + i;
That is the general idea.
Eric
| |