x86: Fix virtualization of IRQ_MOVE_CLEANUP_VECTOR
PATCH 1/1 x86: Fix virtualization of IRQ_MOVE_CLEANUP_VECTOR
IRQ_MOVE_CLEANUP_VECTOR is at 0x20, ie. far below FIRST_SYSTEM_VECTOR. So we must not translate it when calling ipipe_virtualize_irq.
--- arch/x86/kernel/ipipe.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-)
arch/x86/kernel/ipipe.c +5 -2
@@ -289,7 +289,7 @@ void __init __ipipe_enable_pipeline(void) IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, - ipipe_apic_vector_irq(IRQ_MOVE_CLEANUP_VECTOR), + IRQ_MOVE_CLEANUP_VECTOR, (ipipe_irq_handler_t)&smp_irq_move_cleanup_interrupt, NULL, &__ipipe_ack_apic,
@@ -311,7 +311,10 @@ void __init __ipipe_enable_pipeline(void)* IPIPE_SYSTEM_MASK has been passed for them, that's ok. */ for (irq =0 ; irq <NR_IRQS ; irq++) -/* Fails for IPIPE_CRITICAL_IPI but that's ok. */ +/* +* Fails for IPIPE_CRITICAL_IPI and IRQ_MOVE_CLEANUP_VECTOR, +* but that's ok. +*/ ipipe_virtualize_irq(ipipe_root_domain, irq, (ipipe_irq_handler_t)&do_IRQ,
Signature · 1 line
1.6.0.2
PATCH v2 1/1 x86: Fix handling of IRQ_MOVE_CLEANUP_VECTOR
IRQ_MOVE_CLEANUP_VECTOR is at 0x20, ie. far below FIRST_SYSTEM_VECTOR. So we must not translate it when calling ipipe_virtualize_irq, and we have to demux it properly in __ipipe_handle_irq.
---
Changes in v2:
- special demux code for __ipipe_handle_irq
arch/x86/kernel/ipipe.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-)
arch/x86/kernel/ipipe.c +7 -2
@@ -289,7 +289,7 @@ void __init __ipipe_enable_pipeline(void) IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, - ipipe_apic_vector_irq(IRQ_MOVE_CLEANUP_VECTOR), + IRQ_MOVE_CLEANUP_VECTOR, (ipipe_irq_handler_t)&smp_irq_move_cleanup_interrupt, NULL, &__ipipe_ack_apic,
@@ -311,7 +311,10 @@ void __init __ipipe_enable_pipeline(void)* IPIPE_SYSTEM_MASK has been passed for them, that's ok. */ for (irq =0 ; irq <NR_IRQS ; irq++) -/* Fails for IPIPE_CRITICAL_IPI but that's ok. */ +/* +* Fails for IPIPE_CRITICAL_IPI and IRQ_MOVE_CLEANUP_VECTOR, +* but that's ok. +*/ ipipe_virtualize_irq(ipipe_root_domain, irq, (ipipe_irq_handler_t)&do_IRQ,
@@ -900,6 +903,8 @@ int __ipipe_handle_irq(struct pt_regs *regs)#ifdef CONFIG_X86_LOCAL_APIC if (vector >=FIRST_SYSTEM_VECTOR ) irq =ipipe_apic_vector_irq (vector); +else if (vector ==IRQ_MOVE_CLEANUP_VECTOR ) + irq = vector; else#endif irq =__get_cpu_var (vector_irq)[vector];
Signature · 1 line
1.6.0.2
PATCH v3 1/1 x86: Fix handling of IRQ_MOVE_CLEANUP_VECTOR
IRQ_MOVE_CLEANUP_VECTOR is at 0x20, ie. far below FIRST_SYSTEM_VECTOR. So we must not translate it when calling ipipe_virtualize_irq, and we have to demux it properly in __ipipe_handle_irq.
---
Changes in v3:
- special demux only required for SMP
Changes in v2:
- special demux code for __ipipe_handle_irq
arch/x86/kernel/ipipe.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-)
arch/x86/kernel/ipipe.c +10 -3
@@ -289,7 +289,7 @@ void __init __ipipe_enable_pipeline(void) IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, - ipipe_apic_vector_irq(IRQ_MOVE_CLEANUP_VECTOR), + IRQ_MOVE_CLEANUP_VECTOR, (ipipe_irq_handler_t)&smp_irq_move_cleanup_interrupt, NULL, &__ipipe_ack_apic,
@@ -311,7 +311,10 @@ void __init __ipipe_enable_pipeline(void)* IPIPE_SYSTEM_MASK has been passed for them, that's ok. */ for (irq =0 ; irq <NR_IRQS ; irq++) -/* Fails for IPIPE_CRITICAL_IPI but that's ok. */ +/* +* Fails for IPIPE_CRITICAL_IPI and IRQ_MOVE_CLEANUP_VECTOR, +* but that's ok. +*/ ipipe_virtualize_irq(ipipe_root_domain, irq, (ipipe_irq_handler_t)&do_IRQ,
@@ -900,8 +903,12 @@ int __ipipe_handle_irq(struct pt_regs *regs)#ifdef CONFIG_X86_LOCAL_APIC if (vector >=FIRST_SYSTEM_VECTOR ) irq =ipipe_apic_vector_irq (vector); +#ifdef CONFIG_SMP + else if (vector == IRQ_MOVE_CLEANUP_VECTOR) + irq = vector; +#endif /* CONFIG_SMP */ else -#endif +#endif /* CONFIG_X86_LOCAL_APIC */ irq =__get_cpu_var (vector_irq)[vector]; m_ack =0 ; }else {/* This is a self-triggered one. */
Signature · 1 line
1.6.0.2