[PATCH 12/16] x86/ioapic.c: simplify add_pin_to_irq_node()

Jeremy Fitzhardinge
2009-06-16T20:17:42Z

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 | 28 ++++++++--------------------
1 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 8ee2b14..350d99b 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -487,34 +487,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;
}

/*
--
1.6.2.2