generic: add irq_desc in function in parameter
authorYinghai Lu <yhlu.kernel@gmail.com>
Wed, 20 Aug 2008 03:50:15 +0000 (20:50 -0700)
committerIngo Molnar <mingo@elte.hu>
Thu, 16 Oct 2008 14:52:50 +0000 (16:52 +0200)
So we could remove some duplicated calling to irq_desc

v2: make sure irq_desc in  init/main.c is not used without generic_hardirqs

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/irq_64.c
include/linux/irq.h
init/main.c
kernel/irq/handle.c

index a3e36336d9147ebddfe2b278a80a849f7e098842..f58b995b30ee6adc7598ed98eaa09ad838a1726d 100644 (file)
@@ -189,6 +189,7 @@ u64 arch_irq_stat(void)
 asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
 {
        struct pt_regs *old_regs = set_irq_regs(regs);
+       struct irq_desc *desc;
 
        /* high bit used in ret_from_ code  */
        unsigned vector = ~regs->orig_ax;
@@ -202,8 +203,9 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
        stack_overflow_check(regs);
 #endif
 
-       if (likely(__irq_to_desc(irq)))
-               generic_handle_irq(irq);
+       desc = __irq_to_desc(irq);
+       if (likely(desc))
+               generic_handle_irq_desc(irq, desc);
        else {
                if (!disable_apic)
                        ack_APIC_irq();
index 9de16ca8b8e569f4b5be9701677a53b5a4cf96b6..7b59e193a1196c05021d3effc5762d3d247ca281 100644 (file)
@@ -315,10 +315,8 @@ extern unsigned int __do_IRQ(unsigned int irq);
  * irqchip-style controller then we call the ->handle_irq() handler,
  * and it calls __do_IRQ() if it's attached to an irqtype-style controller.
  */
-static inline void generic_handle_irq(unsigned int irq)
+static inline void generic_handle_irq_desc(unsigned int irq, struct irq_desc *desc)
 {
-       struct irq_desc *desc = irq_to_desc(irq);
-
 #ifdef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ
        desc->handle_irq(irq, desc);
 #else
@@ -329,6 +327,11 @@ static inline void generic_handle_irq(unsigned int irq)
 #endif
 }
 
+static inline void generic_handle_irq(unsigned int irq)
+{
+       generic_handle_irq_desc(irq, irq_to_desc(irq));
+}
+
 /* Handling of unhandled and spurious interrupts: */
 extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
                           int action_ret);
index ab97d0877acc71de909a8ef2a9757994de57966a..0d2e60144f83511e11ba89c5b3479dbd4b5c8e93 100644 (file)
@@ -590,6 +590,13 @@ void pre_alloc_dyn_array(void)
                if (da->init_work)
                        da->init_work(da);
        }
+#else
+#ifdef CONFIF_GENERIC_HARDIRQS
+       unsigned int i;
+
+       for (i = 0; i < NR_IRQS; i++)
+               irq_desc[i].irq = i;
+#endif
 #endif
 }
 
index 8e55dbe50afc759b5ff859d7a9c36336c8979d8d..e1d787e9169b363476890cf66cc3ee8327cae336 100644 (file)
@@ -197,6 +197,21 @@ struct irq_desc *irq_to_desc(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 = &sparse_irqs[0];
+               while (desc) {
+                       printk(KERN_DEBUG "found irq_desc for irq %d\n", desc->irq);
+                       if (desc->next)
+                               printk(KERN_DEBUG "found irq_desc for irq %d and next will be irq %d\n", desc->irq, desc->next->irq);
+                       desc = desc->next;
+                       count++;
+               }
+               printk(KERN_DEBUG "all preallocted %d\n", count);
+       }
 
        total_bytes = sizeof(struct irq_desc) * nr_irq_desc;
        if (after_bootmem)
@@ -221,6 +236,21 @@ struct irq_desc *irq_to_desc(unsigned int irq)
 
        desc->irq = irq;
        desc_pri->next = desc;
+       {
+               /* double check if some one mess up the list */
+               struct irq_desc *desc;
+               int count = 0;
+
+               desc = &sparse_irqs[0];
+               while (desc) {
+                       printk(KERN_DEBUG "1 found irq_desc for irq %d\n", desc->irq);
+                       if (desc->next)
+                               printk(KERN_DEBUG "1 found irq_desc for irq %d and next will be irq %d\n", desc->irq, desc->next->irq);
+                       desc = desc->next;
+                       count++;
+               }
+               printk(KERN_DEBUG "1 all preallocted %d\n", count);
+       }
 
        return desc;
 }