Messages in this thread Patch in this message | | | From | Yinghai Lu <> | Subject | [PATCH 38/42] seperate irq_descX with irq_descX_free | Date | Fri, 8 Aug 2008 14:52:44 -0700 |
| |
so later don't need compare with -1U
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> --- include/linux/irq.h | 2 +- kernel/irq/handle.c | 113 ++++++++++++++++++++++++++------------------------ 2 files changed, 60 insertions(+), 55 deletions(-)
diff --git a/include/linux/irq.h b/include/linux/irq.h index 0d9578e..d130119 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -223,7 +223,7 @@ extern struct irq_desc *irq_descX; extern struct irq_desc *irq_descX; #define for_each_irq_desc(irqX, desc) \ - for (desc = irq_descX, irqX = desc->irq; desc && irqX != -1U; desc = desc->next, irqX = desc ? desc->irq: -1U) + for (desc = irq_descX, irqX = desc->irq; desc; desc = desc->next, irqX = desc ? desc->irq: -1U) #endif diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 194d815..0f5ea0c 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c @@ -111,6 +111,11 @@ static void init_kstat_irqs(struct irq_desc *desc, int nr_desc, int nr) } } +#ifdef CONFIG_HAVE_SPARSE_IRQ +static struct irq_desc *irq_descX_free; +struct irq_desc *irq_descX; +#endif + static void __init init_work(void *data) { struct dyn_array *da = data; @@ -126,13 +131,16 @@ static void __init init_work(void *data) #endif } + /* init kstat_irqs, nr_cpu_ids is ready already */ + init_kstat_irqs(desc, *da->nr, nr_cpu_ids); + #ifdef CONFIG_HAVE_SPARSE_IRQ for (i = 1; i < *da->nr; i++) desc[i-1].next = &desc[i]; -#endif - /* init kstat_irqs, nr_cpu_ids is ready already */ - init_kstat_irqs(desc, *da->nr, nr_cpu_ids); + irq_descX_free = irq_descX; + irq_descX = NULL; +#endif } #ifdef CONFIG_HAVE_SPARSE_IRQ @@ -147,23 +155,17 @@ static int __init parse_nr_irq_desc(char *arg) early_param("nr_irq_desc", parse_nr_irq_desc); -struct irq_desc *irq_descX; DEFINE_DYN_ARRAY(irq_descX, sizeof(struct irq_desc), nr_irq_desc, PAGE_SIZE, init_work); struct irq_desc *irq_desc(unsigned int irq) { struct irq_desc *desc; - BUG_ON(irq == -1U); - - desc = &irq_descX[0]; + desc = irq_descX; while (desc) { if (desc->irq == irq) return desc; - if (desc->irq == -1U) - return NULL; - desc = desc->next; } return NULL; @@ -173,21 +175,12 @@ struct irq_desc *irq_desc_with_new(unsigned int irq) struct irq_desc *desc, *desc_pri; int i; int count = 0; - unsigned long phys; - unsigned long total_bytes; - - BUG_ON(irq == -1U); - desc_pri = desc = &irq_descX[0]; + desc_pri = desc = irq_descX; while (desc) { if (desc->irq == irq) return desc; - if (desc->irq == -1U) { - desc->irq = irq; - printk("found new irq_desc for irq %d\n", desc->irq); - return desc; - } desc_pri = desc; desc = desc->next; count++; @@ -196,48 +189,60 @@ struct irq_desc *irq_desc_with_new(unsigned int irq) /* * we run out of pre-allocate ones, allocate more */ - printk(KERN_DEBUG "try to get more irq_desc %d\n", nr_irq_desc); - { - /* double check if some one mess up the list */ - struct irq_desc *desc; - int count = 0; - - desc = &irq_descX[0]; - while (desc) { - printk("found irq_desc for irq %d\n", desc->irq); - if (desc->next) - printk("found irq_desc for irq %d and next will be irq %d\n", desc->irq, desc->next->irq); - desc = desc->next; - count++; - } - printk("all preallocted %d\n", count); - } + if (!irq_descX_free) { + unsigned long phys; + unsigned long total_bytes; - total_bytes = sizeof(struct irq_desc) * nr_irq_desc; - if (after_bootmem) - desc = kzalloc(total_bytes, GFP_ATOMIC); - else - desc = __alloc_bootmem_nopanic(total_bytes, PAGE_SIZE, 0); + printk(KERN_DEBUG "try to get more irq_desc %d\n", nr_irq_desc); - if (!desc) - panic("please boot with nr_irq_desc= %d\n", count * 2); + total_bytes = sizeof(struct irq_desc) * nr_irq_desc; + if (after_bootmem) + desc = kzalloc(total_bytes, GFP_ATOMIC); + else + desc = __alloc_bootmem_nopanic(total_bytes, PAGE_SIZE, 0); - phys = __pa(desc); - printk(KERN_DEBUG "irq_desc ==> [%#lx - %#lx]\n", phys, phys + total_bytes); + if (!desc) + panic("please boot with nr_irq_desc= %d\n", count * 2); - for (i = 0; i < nr_irq_desc; i++) - init_one_irq_desc(&desc[i]); + phys = __pa(desc); + printk(KERN_DEBUG "irq_desc ==> [%#lx - %#lx]\n", phys, phys + total_bytes); - for (i = 1; i < nr_irq_desc; i++) - desc[i-1].next = &desc[i]; + for (i = 0; i < nr_irq_desc; i++) + init_one_irq_desc(&desc[i]); - /* init kstat_irqs, nr_cpu_ids is ready already */ - init_kstat_irqs(desc, nr_irq_desc, nr_cpu_ids); + for (i = 1; i < nr_irq_desc; i++) + desc[i-1].next = &desc[i]; - desc->irq = irq; - desc_pri->next = desc; - printk("1 found new irq_desc for irq %d and pri will be irq %d\n", desc->irq, desc_pri->irq); + /* init kstat_irqs, nr_cpu_ids is ready already */ + init_kstat_irqs(desc, nr_irq_desc, nr_cpu_ids); + + irq_descX_free = desc; + } + desc = irq_descX_free; + irq_descX_free = irq_descX_free->next; + desc->next = NULL; + if (desc_pri) + desc_pri->next = desc; + else + irq_descX = desc; + desc->irq = irq; + printk("found new irq_desc for irq %d\n", desc->irq); + { + /* dump the results */ + struct irq_desc *desc; + unsigned long phys; + unsigned long bytes = sizeof(struct irq_desc); + unsigned int irqx; + + printk(KERN_DEBUG "=========================== %d\n", irq); + printk(KERN_DEBUG "irq_desc dump after get that for %d\n", irq); + for_each_irq_desc(irqx, desc) { + phys = __pa(desc); + printk(KERN_DEBUG "irq_desc %d ==> [%#lx - %#lx]\n", irqx, phys, phys + bytes); + } + printk(KERN_DEBUG "===========================\n"); + } return desc; } #else -- 1.5.4.5
| |