diff options
author | Cyrill Gorcunov <gorcunov@openvz.org> | 2009-08-01 03:47:59 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-08-05 04:30:49 -0400 |
commit | 2977fb3ffc8493a2f4f0a362e8660a6cde9f1bb9 (patch) | |
tree | 29a3ea6d05c83a07a841af7c498f678209455a05 | |
parent | 25f6e89bedd29cc49bfa0d55497e91a671b9ae6e (diff) |
x86, ioapic: Introduce for_each_irq_pin() helper
This allow us to save a few lines of code.
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: yinghai@kernel.org
LKML-Reference: <20090801075435.597863129@openvz.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 43 |
1 files changed, 15 insertions, 28 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 7e92a9212fd7..ffd8fdfcbe4c 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -66,6 +66,8 @@ | |||
66 | #include <asm/apic.h> | 66 | #include <asm/apic.h> |
67 | 67 | ||
68 | #define __apicdebuginit(type) static type __init | 68 | #define __apicdebuginit(type) static type __init |
69 | #define for_each_irq_pin(entry, head) \ | ||
70 | for (entry = head; entry; entry = entry->next) | ||
69 | 71 | ||
70 | /* | 72 | /* |
71 | * Is the SiS APIC rmw bug present ? | 73 | * Is the SiS APIC rmw bug present ? |
@@ -410,7 +412,7 @@ static bool io_apic_level_ack_pending(struct irq_cfg *cfg) | |||
410 | unsigned long flags; | 412 | unsigned long flags; |
411 | 413 | ||
412 | spin_lock_irqsave(&ioapic_lock, flags); | 414 | spin_lock_irqsave(&ioapic_lock, flags); |
413 | for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) { | 415 | for_each_irq_pin(entry, cfg->irq_2_pin) { |
414 | unsigned int reg; | 416 | unsigned int reg; |
415 | int pin; | 417 | int pin; |
416 | 418 | ||
@@ -490,22 +492,21 @@ static void ioapic_mask_entry(int apic, int pin) | |||
490 | */ | 492 | */ |
491 | static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin) | 493 | static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin) |
492 | { | 494 | { |
493 | struct irq_pin_list **entryp, *entry; | 495 | struct irq_pin_list **last, *entry; |
494 | 496 | ||
495 | for (entryp = &cfg->irq_2_pin; | 497 | /* don't allow duplicates */ |
496 | *entryp != NULL; | 498 | last = &cfg->irq_2_pin; |
497 | entryp = &(*entryp)->next) { | 499 | for_each_irq_pin(entry, cfg->irq_2_pin) { |
498 | entry = *entryp; | ||
499 | /* not again, please */ | ||
500 | if (entry->apic == apic && entry->pin == pin) | 500 | if (entry->apic == apic && entry->pin == pin) |
501 | return; | 501 | return; |
502 | last = &entry->next; | ||
502 | } | 503 | } |
503 | 504 | ||
504 | entry = get_one_free_irq_2_pin(node); | 505 | entry = get_one_free_irq_2_pin(node); |
505 | entry->apic = apic; | 506 | entry->apic = apic; |
506 | entry->pin = pin; | 507 | entry->pin = pin; |
507 | 508 | ||
508 | *entryp = entry; | 509 | *last = entry; |
509 | } | 510 | } |
510 | 511 | ||
511 | /* | 512 | /* |
@@ -517,7 +518,7 @@ static void __init replace_pin_at_irq_node(struct irq_cfg *cfg, int node, | |||
517 | { | 518 | { |
518 | struct irq_pin_list *entry; | 519 | struct irq_pin_list *entry; |
519 | 520 | ||
520 | for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) { | 521 | for_each_irq_pin(entry, cfg->irq_2_pin) { |
521 | if (entry->apic == oldapic && entry->pin == oldpin) { | 522 | if (entry->apic == oldapic && entry->pin == oldpin) { |
522 | entry->apic = newapic; | 523 | entry->apic = newapic; |
523 | entry->pin = newpin; | 524 | entry->pin = newpin; |
@@ -537,7 +538,7 @@ static void io_apic_modify_irq(struct irq_cfg *cfg, | |||
537 | int pin; | 538 | int pin; |
538 | struct irq_pin_list *entry; | 539 | struct irq_pin_list *entry; |
539 | 540 | ||
540 | for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) { | 541 | for_each_irq_pin(entry, cfg->irq_2_pin) { |
541 | unsigned int reg; | 542 | unsigned int reg; |
542 | pin = entry->pin; | 543 | pin = entry->pin; |
543 | reg = io_apic_read(entry->apic, 0x10 + pin * 2); | 544 | reg = io_apic_read(entry->apic, 0x10 + pin * 2); |
@@ -1669,12 +1670,8 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1669 | if (!entry) | 1670 | if (!entry) |
1670 | continue; | 1671 | continue; |
1671 | printk(KERN_DEBUG "IRQ%d ", irq); | 1672 | printk(KERN_DEBUG "IRQ%d ", irq); |
1672 | for (;;) { | 1673 | for_each_irq_pin(entry, cfg->irq_2_pin) |
1673 | printk("-> %d:%d", entry->apic, entry->pin); | 1674 | printk("-> %d:%d", entry->apic, entry->pin); |
1674 | if (!entry->next) | ||
1675 | break; | ||
1676 | entry = entry->next; | ||
1677 | } | ||
1678 | printk("\n"); | 1675 | printk("\n"); |
1679 | } | 1676 | } |
1680 | 1677 | ||
@@ -2227,7 +2224,7 @@ static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq | |||
2227 | struct irq_pin_list *entry; | 2224 | struct irq_pin_list *entry; |
2228 | u8 vector = cfg->vector; | 2225 | u8 vector = cfg->vector; |
2229 | 2226 | ||
2230 | for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) { | 2227 | for_each_irq_pin(entry, cfg->irq_2_pin) { |
2231 | unsigned int reg; | 2228 | unsigned int reg; |
2232 | 2229 | ||
2233 | apic = entry->apic; | 2230 | apic = entry->apic; |
@@ -2556,20 +2553,10 @@ static void ack_apic_level(unsigned int irq) | |||
2556 | #ifdef CONFIG_INTR_REMAP | 2553 | #ifdef CONFIG_INTR_REMAP |
2557 | static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) | 2554 | static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) |
2558 | { | 2555 | { |
2559 | int apic, pin; | ||
2560 | struct irq_pin_list *entry; | 2556 | struct irq_pin_list *entry; |
2561 | 2557 | ||
2562 | entry = cfg->irq_2_pin; | 2558 | for_each_irq_pin(entry, cfg->irq_2_pin) |
2563 | for (;;) { | 2559 | io_apic_eoi(entry->apic, entry->pin); |
2564 | |||
2565 | if (!entry) | ||
2566 | break; | ||
2567 | |||
2568 | apic = entry->apic; | ||
2569 | pin = entry->pin; | ||
2570 | io_apic_eoi(apic, pin); | ||
2571 | entry = entry->next; | ||
2572 | } | ||
2573 | } | 2560 | } |
2574 | 2561 | ||
2575 | static void | 2562 | static void |