| From 1bdb8970392a68489b469c3a330a1adb5ef61beb Mon Sep 17 00:00:00 2001 |
| From: Keith Busch <keith.busch@intel.com> |
| Date: Wed, 27 Apr 2016 14:22:32 -0600 |
| Subject: x86/apic: Handle zero vector gracefully in clear_vector_irq() |
| |
| From: Keith Busch <keith.busch@intel.com> |
| |
| commit 1bdb8970392a68489b469c3a330a1adb5ef61beb upstream. |
| |
| If x86_vector_alloc_irq() fails x86_vector_free_irqs() is invoked to cleanup |
| the already allocated vectors. This subsequently calls clear_vector_irq(). |
| |
| The failed irq has no vector assigned, which triggers the BUG_ON(!vector) in |
| clear_vector_irq(). |
| |
| We cannot suppress the call to x86_vector_free_irqs() for the failed |
| interrupt, because the other data related to this irq must be cleaned up as |
| well. So calling clear_vector_irq() with vector == 0 is legitimate. |
| |
| Remove the BUG_ON and return if vector is zero, |
| |
| [ tglx: Massaged changelog ] |
| |
| Fixes: b5dc8e6c21e7 "x86/irq: Use hierarchical irqdomain to manage CPU interrupt vectors" |
| Signed-off-by: Keith Busch <keith.busch@intel.com> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/apic/vector.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/apic/vector.c |
| +++ b/arch/x86/kernel/apic/vector.c |
| @@ -256,7 +256,8 @@ static void clear_irq_vector(int irq, st |
| struct irq_desc *desc; |
| int cpu, vector; |
| |
| - BUG_ON(!data->cfg.vector); |
| + if (!data->cfg.vector) |
| + return; |
| |
| vector = data->cfg.vector; |
| for_each_cpu_and(cpu, data->domain, cpu_online_mask) |