smp_irq_move_cleanup_interrupt walks all vectors starting at
FIRST_EXTERNAL_VECTOR, checking for vectors on the move. Unfortunately,
FIRST_EXTERNAL_VECTOR equals IRQ_MOVE_CLEANUP_VECTOR and is incorrectly
identified as a migrating one because we set its vector_irq to something
else than -1. The result is that smp_irq_move_cleanup_interrupt sets
vector_irq to -1 again, and __ipipe_handle_irq will BUG on the next
migration IRQ.

Fix this by starting the vector walk above FIRST_EXTERNAL_VECTOR.

Signed-off-by: Jan Kiszka <[email protected]>
---
 arch/x86/kernel/apic/io_apic.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index db1e9f3..2c0f203 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -2337,7 +2337,8 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void)
        irq_enter();
 
        me = smp_processor_id();
-       for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) {
+       for (vector = FIRST_EXTERNAL_VECTOR + 1; vector < NR_VECTORS;
+            vector++) {
                unsigned int irq;
                unsigned int irr;
                struct irq_desc *desc;
-- 
1.7.1


_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main

Reply via email to