--- /dev/null
+From 45d55e7bac4028af93f5fa324e69958a0b868e96 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Tue, 16 Jan 2018 12:20:18 +0100
+Subject: x86/apic/vector: Fix off by one in error path
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit 45d55e7bac4028af93f5fa324e69958a0b868e96 upstream.
+
+Keith reported the following warning:
+
+WARNING: CPU: 28 PID: 1420 at kernel/irq/matrix.c:222 irq_matrix_remove_managed+0x10f/0x120
+ x86_vector_free_irqs+0xa1/0x180
+ x86_vector_alloc_irqs+0x1e4/0x3a0
+ msi_domain_alloc+0x62/0x130
+
+The reason for this is that if the vector allocation fails the error
+handling code tries to free the failed vector as well, which causes the
+above imbalance warning to trigger.
+
+Adjust the error path to handle this correctly.
+
+Fixes: b5dc8e6c21e7 ("x86/irq: Use hierarchical irqdomain to manage CPU interrupt vectors")
+Reported-by: Keith Busch <keith.busch@intel.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Keith Busch <keith.busch@intel.com>
+Cc: stable@vger.kernel.org
+Link: https://lkml.kernel.org/r/alpine.DEB.2.20.1801161217300.1823@nanos
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/kernel/apic/vector.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+--- a/arch/x86/kernel/apic/vector.c
++++ b/arch/x86/kernel/apic/vector.c
+@@ -359,14 +359,17 @@ static int x86_vector_alloc_irqs(struct
+ irq_data->chip_data = data;
+ irq_data->hwirq = virq + i;
+ err = assign_irq_vector_policy(virq + i, node, data, info);
+- if (err)
++ if (err) {
++ irq_data->chip_data = NULL;
++ free_apic_chip_data(data);
+ goto error;
++ }
+ }
+
+ return 0;
+
+ error:
+- x86_vector_free_irqs(domain, virq, i + 1);
++ x86_vector_free_irqs(domain, virq, i);
+ return err;
+ }
+