On Sat, Aug 2, 2008 at 11:39 PM, Eric W. Biederman <ebiederm@xmission.com> wrote: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; + .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) +{ + 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) + 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; YH --
| Greg Kroah-Hartman | [PATCH 004/196] Chinese: add translation of SubmittingPatches |
| Rafael J. Wysocki | [Bug #11210] libata badness |
| Andrea Arcangeli | [PATCH 00 of 11] mmu notifier #v16 |
| Andrew Morton | Re: -mm merge plans for 2.6.23 -- sys_fallocate |
git: | |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Daniel Eischen | Re: error with thread |
| David Miller | Re: [GIT]: Networking |
| Jarek Poplawski | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
