x86/ioapic.c: simplify add_pin_to_irq_node()
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Mon, 8 Jun 2009 10:24:11 +0000 (03:24 -0700)
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Tue, 14 Jul 2009 20:32:50 +0000 (13:32 -0700)
Rather than duplicating the same alloc/init code twice, restructure
the function to look for duplicates and then add an entry
if none is found.

This function is not performance critical; all but one of its callers
are __init functions, and the non-__init caller is for PCI device setup.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
arch/x86/kernel/apic/io_apic.c

index 0d04018..d9e8f19 100644 (file)
@@ -490,34 +490,22 @@ static void ioapic_mask_entry(int apic, int pin)
  */
 static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin)
 {
-       struct irq_pin_list *entry;
+       struct irq_pin_list **entryp, *entry;
 
-       entry = cfg->irq_2_pin;
-       if (!entry) {
-               entry = get_one_free_irq_2_pin(node);
-               if (!entry) {
-                       printk(KERN_ERR "can not alloc irq_2_pin to add %d - %d\n",
-                                       apic, pin);
-                       return;
-               }
-               cfg->irq_2_pin = entry;
-               entry->apic = apic;
-               entry->pin = pin;
-               return;
-       }
-
-       while (entry->next) {
+       for (entryp = &cfg->irq_2_pin;
+            *entryp != NULL;
+            entryp = &(*entryp)->next) {
+               entry = *entryp;
                /* not again, please */
                if (entry->apic == apic && entry->pin == pin)
                        return;
-
-               entry = entry->next;
        }
 
-       entry->next = get_one_free_irq_2_pin(node);
-       entry = entry->next;
+       entry = get_one_free_irq_2_pin(node);
        entry->apic = apic;
        entry->pin = pin;
+
+       *entryp = entry;
 }
 
 /*