|
@@ -74,7 +74,7 @@
|
|
|
for_each_pin((idx), (pin))
|
|
|
|
|
|
#define for_each_irq_pin(entry, head) \
|
|
|
- for (entry = head; entry; entry = entry->next)
|
|
|
+ list_for_each_entry(entry, &head, list)
|
|
|
|
|
|
/*
|
|
|
* Is the SiS APIC rmw bug present ?
|
|
@@ -229,8 +229,8 @@ void mp_save_irq(struct mpc_intsrc *m)
|
|
|
}
|
|
|
|
|
|
struct irq_pin_list {
|
|
|
+ struct list_head list;
|
|
|
int apic, pin;
|
|
|
- struct irq_pin_list *next;
|
|
|
};
|
|
|
|
|
|
static struct irq_pin_list *alloc_irq_pin_list(int node)
|
|
@@ -297,6 +297,7 @@ static struct irq_cfg *alloc_irq_cfg(unsigned int irq, int node)
|
|
|
goto out_cfg;
|
|
|
if (!zalloc_cpumask_var_node(&cfg->old_domain, GFP_KERNEL, node))
|
|
|
goto out_domain;
|
|
|
+ INIT_LIST_HEAD(&cfg->irq_2_pin);
|
|
|
return cfg;
|
|
|
out_domain:
|
|
|
free_cpumask_var(cfg->domain);
|
|
@@ -460,15 +461,12 @@ static void ioapic_mask_entry(int apic, int pin)
|
|
|
*/
|
|
|
static int __add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin)
|
|
|
{
|
|
|
- struct irq_pin_list **last, *entry;
|
|
|
+ struct irq_pin_list *entry;
|
|
|
|
|
|
/* don't allow duplicates */
|
|
|
- last = &cfg->irq_2_pin;
|
|
|
- for_each_irq_pin(entry, cfg->irq_2_pin) {
|
|
|
+ for_each_irq_pin(entry, cfg->irq_2_pin)
|
|
|
if (entry->apic == apic && entry->pin == pin)
|
|
|
return 0;
|
|
|
- last = &entry->next;
|
|
|
- }
|
|
|
|
|
|
entry = alloc_irq_pin_list(node);
|
|
|
if (!entry) {
|
|
@@ -479,22 +477,19 @@ static int __add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pi
|
|
|
entry->apic = apic;
|
|
|
entry->pin = pin;
|
|
|
|
|
|
- *last = entry;
|
|
|
+ list_add_tail(&entry->list, &cfg->irq_2_pin);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static void __remove_pin_from_irq(struct irq_cfg *cfg, int apic, int pin)
|
|
|
{
|
|
|
- struct irq_pin_list **last, *entry;
|
|
|
+ struct irq_pin_list *tmp, *entry;
|
|
|
|
|
|
- last = &cfg->irq_2_pin;
|
|
|
- for_each_irq_pin(entry, cfg->irq_2_pin)
|
|
|
+ list_for_each_entry_safe(entry, tmp, &cfg->irq_2_pin, list)
|
|
|
if (entry->apic == apic && entry->pin == pin) {
|
|
|
- *last = entry->next;
|
|
|
+ list_del(&entry->list);
|
|
|
kfree(entry);
|
|
|
return;
|
|
|
- } else {
|
|
|
- last = &entry->next;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1739,8 +1734,7 @@ __apicdebuginit(void) print_IO_APICs(void)
|
|
|
cfg = irq_cfg(irq);
|
|
|
if (!cfg)
|
|
|
continue;
|
|
|
- entry = cfg->irq_2_pin;
|
|
|
- if (!entry)
|
|
|
+ if (list_empty(&cfg->irq_2_pin))
|
|
|
continue;
|
|
|
printk(KERN_DEBUG "IRQ%d ", irq);
|
|
|
for_each_irq_pin(entry, cfg->irq_2_pin)
|
|
@@ -4076,7 +4070,7 @@ void mp_irqdomain_unmap(struct irq_domain *domain, unsigned int virq)
|
|
|
|
|
|
ioapic_mask_entry(ioapic, pin);
|
|
|
__remove_pin_from_irq(cfg, ioapic, pin);
|
|
|
- WARN_ON(cfg->irq_2_pin != NULL);
|
|
|
+ WARN_ON(!list_empty(&cfg->irq_2_pin));
|
|
|
arch_teardown_hwirq(virq);
|
|
|
}
|
|
|
|