[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH for-4.21 v3 1/2] x86/apic: Avoid infinite loop in io_apic_level_ack_pending()
io_apic_level_ack_pending() will end up in an infinite loop if entry->pin == -1. entry does not change, so it will keep reading -1. Convert to a proper for loop so that continue works. Add a new helper, next_entry(), to handle advancing to the next irq_pin_list entry. Noticed during code inspection. The infinite loop was not observed. Fixes: f821102450a1 ("x86: IRQ Migration logic enhancement.") Signed-off-by: Jason Andryuk <jason.andryuk@xxxxxxx> Release-Acked-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> --- v3: const on next_entry() parameter Remove spaces inside for loop braces Remove inner if (!entry) check Expand commit message to state noticed during code inspection v2: continue (not break) for pin == -1. I added the next_entry() helper since putting the expression in the for loop is a little cluttered. The helper can also be re-used for other instances within the file. --- xen/arch/x86/io_apic.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c index c384f10c1b..c35d611ecf 100644 --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -1586,20 +1586,24 @@ static int __init cf_check setup_ioapic_ack(const char *s) } custom_param("ioapic_ack", setup_ioapic_ack); +static struct irq_pin_list *next_entry(const struct irq_pin_list *entry) +{ + if ( !entry->next ) + return NULL; + + return irq_2_pin + entry->next; +} + static bool io_apic_level_ack_pending(unsigned int irq) { struct irq_pin_list *entry; unsigned long flags; spin_lock_irqsave(&ioapic_lock, flags); - entry = &irq_2_pin[irq]; - for (;;) { + for (entry = &irq_2_pin[irq]; entry; entry = next_entry(entry)) { unsigned int reg; int pin; - if (!entry) - break; - pin = entry->pin; if (pin == -1) continue; @@ -1609,9 +1613,6 @@ static bool io_apic_level_ack_pending(unsigned int irq) spin_unlock_irqrestore(&ioapic_lock, flags); return 1; } - if (!entry->next) - break; - entry = irq_2_pin + entry->next; } spin_unlock_irqrestore(&ioapic_lock, flags); -- 2.51.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |