diff options
author | Andrew Banman <abanman@hpe.com> | 2018-03-27 18:09:06 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-03-28 04:40:55 -0400 |
commit | 151ad17fbe5e56afa59709f41980508672c777ce (patch) | |
tree | a21ee442806ee774be3c50dd6e2163594c8377f6 | |
parent | e847f6aaf68f6156a5e9b26afe1a7316b9ab697e (diff) |
x86/platform/uv/BAU: Add APIC idt entry
BAU uses the old alloc_initr_gate90 method to setup its interrupt. This
fails silently as the BAU vector is in the range of APIC vectors that are
registered to the spurious interrupt handler. As a consequence BAU
broadcasts are not handled, and the broadcast source CPU hangs.
Update BAU to use new idt structure.
Fixes: dc20b2d52653 ("x86/idt: Move interrupt gate initialization to IDT code")
Signed-off-by: Andrew Banman <abanman@hpe.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Mike Travis <mike.travis@hpe.com>
Cc: Dimitri Sivanich <sivanich@hpe.com>
Cc: Russ Anderson <rja@hpe.com>
Cc: stable@vger.kernel.org
Cc: "H. Peter Anvin" <hpa@zytor.com>
Link: https://lkml.kernel.org/r/1522188546-196177-1-git-send-email-abanman@hpe.com
-rw-r--r-- | arch/x86/include/asm/hw_irq.h | 1 | ||||
-rw-r--r-- | arch/x86/kernel/idt.c | 3 | ||||
-rw-r--r-- | arch/x86/platform/uv/tlb_uv.c | 2 |
3 files changed, 4 insertions, 2 deletions
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h index 2851077b6051..32e666e1231e 100644 --- a/arch/x86/include/asm/hw_irq.h +++ b/arch/x86/include/asm/hw_irq.h | |||
@@ -36,6 +36,7 @@ extern asmlinkage void kvm_posted_intr_wakeup_ipi(void); | |||
36 | extern asmlinkage void kvm_posted_intr_nested_ipi(void); | 36 | extern asmlinkage void kvm_posted_intr_nested_ipi(void); |
37 | extern asmlinkage void error_interrupt(void); | 37 | extern asmlinkage void error_interrupt(void); |
38 | extern asmlinkage void irq_work_interrupt(void); | 38 | extern asmlinkage void irq_work_interrupt(void); |
39 | extern asmlinkage void uv_bau_message_intr1(void); | ||
39 | 40 | ||
40 | extern asmlinkage void spurious_interrupt(void); | 41 | extern asmlinkage void spurious_interrupt(void); |
41 | extern asmlinkage void thermal_interrupt(void); | 42 | extern asmlinkage void thermal_interrupt(void); |
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c index 56d99be3706a..5d039c848bd9 100644 --- a/arch/x86/kernel/idt.c +++ b/arch/x86/kernel/idt.c | |||
@@ -140,6 +140,9 @@ static const __initconst struct idt_data apic_idts[] = { | |||
140 | # ifdef CONFIG_IRQ_WORK | 140 | # ifdef CONFIG_IRQ_WORK |
141 | INTG(IRQ_WORK_VECTOR, irq_work_interrupt), | 141 | INTG(IRQ_WORK_VECTOR, irq_work_interrupt), |
142 | # endif | 142 | # endif |
143 | #ifdef CONFIG_X86_UV | ||
144 | INTG(UV_BAU_MESSAGE, uv_bau_message_intr1), | ||
145 | #endif | ||
143 | INTG(SPURIOUS_APIC_VECTOR, spurious_interrupt), | 146 | INTG(SPURIOUS_APIC_VECTOR, spurious_interrupt), |
144 | INTG(ERROR_APIC_VECTOR, error_interrupt), | 147 | INTG(ERROR_APIC_VECTOR, error_interrupt), |
145 | #endif | 148 | #endif |
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index db77e087adaf..b36caae0fb2f 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c | |||
@@ -2255,8 +2255,6 @@ static int __init uv_bau_init(void) | |||
2255 | init_uvhub(uvhub, vector, uv_base_pnode); | 2255 | init_uvhub(uvhub, vector, uv_base_pnode); |
2256 | } | 2256 | } |
2257 | 2257 | ||
2258 | alloc_intr_gate(vector, uv_bau_message_intr1); | ||
2259 | |||
2260 | for_each_possible_blade(uvhub) { | 2258 | for_each_possible_blade(uvhub) { |
2261 | if (uv_blade_nr_possible_cpus(uvhub)) { | 2259 | if (uv_blade_nr_possible_cpus(uvhub)) { |
2262 | unsigned long val; | 2260 | unsigned long val; |