x86,ioapic simplification,bugfix
cover x86,ioapic simplification,bugfix
Hi,
the series has an idea to simplify io-apic list handling and prevent from one possible NULL dereference. See patches comments for details.
Yinghai, please take a closer look on new body of add_pin_to_irq_node and __eoi_ioapic_irq.
I hope I didn't miss anything.
Please review. Comments are highly appreciated.
The patches on top of -tip tree commit
| commit 160bc9d163b0ba927770056783b79a684b74acc6 | Merge: d333597 d6c585a | Author: Ingo Molnar <[email protected]> | Date: Sun Jul 26 14:32:39 2009 +0200 | | Merge branch 'x86/urgent'
Cyrill
RFC 1/2 x86,ioapic: introduce for_each_irq_pin helper
This allow us to save a few lines of code.
--- arch/x86/kernel/apic/io_apic.c | 43 ++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 28 deletions(-)
arch/x86/kernel/apic/io_apic.c +15 -28
@@ -66,6 +66,8 @@#include <asm/apic.h> #define __apicdebuginit (type) static type __init +#define for_each_irq_pin (entry, head) \ + for (entry = head; entry; entry = entry->next)/* * Is the SiS APIC rmw bug present ?
@@ -410,7 +412,7 @@ static bool io_apic_level_ack_pending(stunsigned long flags;spin_lock_irqsave (&ioapic_lock, flags); -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {unsigned int reg;int pin;
@@ -490,22 +492,21 @@ static void ioapic_mask_entry(int apic,*/ static void add_pin_to_irq_node (struct irq_cfg *cfg,int node,int apic,int pin) { -struct irq_pin_list **entryp, *entry; +struct irq_pin_list **last, *entry; -for (entryp = &cfg->irq_2_pin; - *entryp !=NULL ; - entryp = &(*entryp)->next) { - entry = *entryp; -/* not again, please */ +/* don't allow duplicates */ + last = &cfg->irq_2_pin; +for_each_irq_pin (entry, cfg->irq_2_pin) {if (entry->apic == apic && entry->pin == pin)return ; + last = &entry->next; } entry =get_one_free_irq_2_pin (node); entry->apic = apic; entry->pin = pin; - *entryp = entry; + *last = entry; }/*
@@ -517,7 +518,7 @@ static void __init replace_pin_at_irq_no {struct irq_pin_list *entry; -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {if (entry->apic == oldapic && entry->pin == oldpin) { entry->apic = newapic; entry->pin = newpin;
@@ -537,7 +538,7 @@ static void io_apic_modify_irq(struct irint pin;struct irq_pin_list *entry; -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {unsigned int reg; pin = entry->pin; reg =io_apic_read (entry->apic,0x10 + pin *2 );
@@ -1669,12 +1670,8 @@ __apicdebuginit(void) print_IO_APIC(voidif (!entry)continue ;printk (KERN_DEBUG "IRQ%d " , irq); -for (;;) { +for_each_irq_pin (entry, cfg->irq_2_pin)printk ("-> %d:%d" , entry->apic, entry->pin); -if (!entry->next) -break ; - entry = entry->next; - }printk ("\n" ); }
@@ -2227,7 +2224,7 @@ static void __target_IO_APIC_irq(unsignestruct irq_pin_list *entry;u8 vector = cfg->vector; -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {unsigned int reg; apic = entry->apic;
@@ -2556,20 +2553,10 @@ static void ack_apic_level(unsigned int#ifdef CONFIG_INTR_REMAP static void __eoi_ioapic_irq (unsigned int irq,struct irq_cfg *cfg) { -int apic, pin;struct irq_pin_list *entry; - entry = cfg->irq_2_pin; -for (;;) { - -if (!entry) -break ; - - apic = entry->apic; - pin = entry->pin; -io_apic_eoi (apic, pin); - entry = entry->next; - } +for_each_irq_pin (entry, cfg->irq_2_pin) +io_apic_eoi (entry->apic, entry->pin); } static void
Re: [rfc 1/2] x86,ioapic: introduce for_each_irq_pin helper
Quoted 6 lines · Cyrill Gorcunov
This allow us to save a few lines of code.
Signed-off-by Cyrill Gorcunov <[email protected]>--- arch/x86/kernel/apic/io_apic.c | 43 ++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 28 deletions(-)
Nice cleanup! I'll queue it up and let you know if there's any problems with it in testing.
Ingo
[tip:x86/apic] x86, ioapic: Introduce for_each_irq_pin() helper
In reply to Cyrill GorcunovCommit-ID: a09204211bcf17eddfdbb5cb2ceb2173e0e3c0d0 Gitweb: http://git.kernel.org/tip/a09204211bcf17eddfdbb5cb2ceb2173e0e3c0d0 Author: Cyrill Gorcunov <[email protected]> AuthorDate: Sat, 1 Aug 2009 11:47:59 +0400 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 4 Aug 2009 16:11:53 +0200
x86, ioapic: Introduce for_each_irq_pin() helper
This allow us to save a few lines of code.
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/io_apic.c | 43 ++++++++++++++-------------------------- 1 files changed, 15 insertions(+), 28 deletions(-)
arch/x86/kernel/apic/io_apic.c +15 -28
@@ -66,6 +66,8 @@#include <asm/apic.h> #define __apicdebuginit (type) static type __init +#define for_each_irq_pin (entry, head) \ + for (entry = head; entry; entry = entry->next)/* * Is the SiS APIC rmw bug present ?
@@ -410,7 +412,7 @@ static bool io_apic_level_ack_pending(struct irq_cfg *cfg)unsigned long flags;spin_lock_irqsave (&ioapic_lock, flags); -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {unsigned int reg;int pin;
@@ -490,22 +492,21 @@ 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 **entryp, *entry; +struct irq_pin_list **last, *entry; -for (entryp = &cfg->irq_2_pin; - *entryp !=NULL ; - entryp = &(*entryp)->next) { - entry = *entryp; -/* not again, please */ +/* don't allow duplicates */ + last = &cfg->irq_2_pin; +for_each_irq_pin (entry, cfg->irq_2_pin) {if (entry->apic == apic && entry->pin == pin)return ; + last = &entry->next; } entry =get_one_free_irq_2_pin (node); entry->apic = apic; entry->pin = pin; - *entryp = entry; + *last = entry; }/*
@@ -517,7 +518,7 @@ static void __init replace_pin_at_irq_node(struct irq_cfg *cfg, int node, {struct irq_pin_list *entry; -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {if (entry->apic == oldapic && entry->pin == oldpin) { entry->apic = newapic; entry->pin = newpin;
@@ -537,7 +538,7 @@ static void io_apic_modify_irq(struct irq_cfg *cfg,int pin;struct irq_pin_list *entry; -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {unsigned int reg; pin = entry->pin; reg =io_apic_read (entry->apic,0x10 + pin *2 );
@@ -1669,12 +1670,8 @@ __apicdebuginit(void) print_IO_APIC(void)if (!entry)continue ;printk (KERN_DEBUG "IRQ%d " , irq); -for (;;) { +for_each_irq_pin (entry, cfg->irq_2_pin)printk ("-> %d:%d" , entry->apic, entry->pin); -if (!entry->next) -break ; - entry = entry->next; - }printk ("\n" ); }
@@ -2227,7 +2224,7 @@ static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irqstruct irq_pin_list *entry;u8 vector = cfg->vector; -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {unsigned int reg; apic = entry->apic;
@@ -2556,20 +2553,10 @@ static void ack_apic_level(unsigned int irq)#ifdef CONFIG_INTR_REMAP static void __eoi_ioapic_irq (unsigned int irq,struct irq_cfg *cfg) { -int apic, pin;struct irq_pin_list *entry; - entry = cfg->irq_2_pin; -for (;;) { - -if (!entry) -break ; - - apic = entry->apic; - pin = entry->pin; -io_apic_eoi (apic, pin); - entry = entry->next; - } +for_each_irq_pin (entry, cfg->irq_2_pin) +io_apic_eoi (entry->apic, entry->pin); } static void
[tip:x86/apic] x86, ioapic: Introduce for_each_irq_pin() helper
In reply to Cyrill GorcunovCommit-ID: 2977fb3ffc8493a2f4f0a362e8660a6cde9f1bb9 Gitweb: http://git.kernel.org/tip/2977fb3ffc8493a2f4f0a362e8660a6cde9f1bb9 Author: Cyrill Gorcunov <[email protected]> AuthorDate: Sat, 1 Aug 2009 11:47:59 +0400 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 5 Aug 2009 10:30:49 +0200
x86, ioapic: Introduce for_each_irq_pin() helper
This allow us to save a few lines of code.
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/io_apic.c | 43 ++++++++++++++-------------------------- 1 files changed, 15 insertions(+), 28 deletions(-)
arch/x86/kernel/apic/io_apic.c +15 -28
@@ -66,6 +66,8 @@#include <asm/apic.h> #define __apicdebuginit (type) static type __init +#define for_each_irq_pin (entry, head) \ + for (entry = head; entry; entry = entry->next)/* * Is the SiS APIC rmw bug present ?
@@ -410,7 +412,7 @@ static bool io_apic_level_ack_pending(struct irq_cfg *cfg)unsigned long flags;spin_lock_irqsave (&ioapic_lock, flags); -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {unsigned int reg;int pin;
@@ -490,22 +492,21 @@ 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 **entryp, *entry; +struct irq_pin_list **last, *entry; -for (entryp = &cfg->irq_2_pin; - *entryp !=NULL ; - entryp = &(*entryp)->next) { - entry = *entryp; -/* not again, please */ +/* don't allow duplicates */ + last = &cfg->irq_2_pin; +for_each_irq_pin (entry, cfg->irq_2_pin) {if (entry->apic == apic && entry->pin == pin)return ; + last = &entry->next; } entry =get_one_free_irq_2_pin (node); entry->apic = apic; entry->pin = pin; - *entryp = entry; + *last = entry; }/*
@@ -517,7 +518,7 @@ static void __init replace_pin_at_irq_node(struct irq_cfg *cfg, int node, {struct irq_pin_list *entry; -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {if (entry->apic == oldapic && entry->pin == oldpin) { entry->apic = newapic; entry->pin = newpin;
@@ -537,7 +538,7 @@ static void io_apic_modify_irq(struct irq_cfg *cfg,int pin;struct irq_pin_list *entry; -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {unsigned int reg; pin = entry->pin; reg =io_apic_read (entry->apic,0x10 + pin *2 );
@@ -1669,12 +1670,8 @@ __apicdebuginit(void) print_IO_APIC(void)if (!entry)continue ;printk (KERN_DEBUG "IRQ%d " , irq); -for (;;) { +for_each_irq_pin (entry, cfg->irq_2_pin)printk ("-> %d:%d" , entry->apic, entry->pin); -if (!entry->next) -break ; - entry = entry->next; - }printk ("\n" ); }
@@ -2227,7 +2224,7 @@ static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irqstruct irq_pin_list *entry;u8 vector = cfg->vector; -for (entry = cfg->irq_2_pin; entry !=NULL ; entry = entry->next) { +for_each_irq_pin (entry, cfg->irq_2_pin) {unsigned int reg; apic = entry->apic;
@@ -2556,20 +2553,10 @@ static void ack_apic_level(unsigned int irq)#ifdef CONFIG_INTR_REMAP static void __eoi_ioapic_irq (unsigned int irq,struct irq_cfg *cfg) { -int apic, pin;struct irq_pin_list *entry; - entry = cfg->irq_2_pin; -for (;;) { - -if (!entry) -break ; - - apic = entry->apic; - pin = entry->pin; -io_apic_eoi (apic, pin); - entry = entry->next; - } +for_each_irq_pin (entry, cfg->irq_2_pin) +io_apic_eoi (entry->apic, entry->pin); } static void
RFC 2/2 x86,ioapic: throw BUG instead of NULL dereference
In reply to Cyrill GorcunovInstead of plain NULL deref we better throw error
message with a backtrace. Actually we need more
gracious error handling here. Meanwhile leave it
as is.
--- arch/x86/kernel/apic/io_apic.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/x86/kernel/apic/io_apic.c +4 -0
@@ -503,6 +503,10 @@ static void add_pin_to_irq_node(struct i } entry =get_one_free_irq_2_pin (node); +if (!entry) { +printk (KERN_ERR "can not alloc irq_pin_list\n" ); +BUG_ON (1 ); + } entry->apic = apic; entry->pin = pin;
[tip:x86/apic] x86, ioapic: Throw BUG instead of NULL dereference
Commit-ID: 460ba8dfa8decb3885256fc4cbb3d2ee46a6466f Gitweb: http://git.kernel.org/tip/460ba8dfa8decb3885256fc4cbb3d2ee46a6466f Author: Cyrill Gorcunov <[email protected]> AuthorDate: Sat, 1 Aug 2009 11:48:00 +0400 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 4 Aug 2009 16:11:54 +0200
x86, ioapic: Throw BUG instead of NULL dereference
Instead of plain NULL deref we better throw error message with a backtrace. Actually we need more gracious error handling here. Meanwhile leave it as is.
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/io_apic.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
arch/x86/kernel/apic/io_apic.c +4 -0
@@ -503,6 +503,10 @@ static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin } entry =get_one_free_irq_2_pin (node); +if (!entry) { +printk (KERN_ERR "can not alloc irq_pin_list\n" ); +BUG_ON (1 ); + } entry->apic = apic; entry->pin = pin;
[tip:x86/apic] x86, ioapic: Throw BUG instead of NULL dereference
In reply to Cyrill GorcunovCommit-ID: a7428cd2ef77734465e36bceb43290e37e2a97c6 Gitweb: http://git.kernel.org/tip/a7428cd2ef77734465e36bceb43290e37e2a97c6 Author: Cyrill Gorcunov <[email protected]> AuthorDate: Sat, 1 Aug 2009 11:48:00 +0400 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 5 Aug 2009 10:30:50 +0200
x86, ioapic: Throw BUG instead of NULL dereference
Instead of plain NULL deref we better throw error message with a backtrace. Actually we need more gracious error handling here. Meanwhile leave it as is.
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/io_apic.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
arch/x86/kernel/apic/io_apic.c +4 -0
@@ -503,6 +503,10 @@ static void add_pin_to_irq_node(struct irq_cfg *cfg, int node, int apic, int pin } entry =get_one_free_irq_2_pin (node); +if (!entry) { +printk (KERN_ERR "can not alloc irq_pin_list\n" ); +BUG_ON (1 ); + } entry->apic = apic; entry->pin = pin;