x86:io_apic-leak-fix.patch

Signed-off-by: Mike Travis <travis@sgi.com>
---
 arch/x86/kernel/io_apic.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff -r 77afa9cdbd2d arch/x86/kernel/io_apic.c
--- a/arch/x86/kernel/io_apic.c	Tue Nov 18 23:36:27 2008 +1030
+++ b/arch/x86/kernel/io_apic.c	Tue Nov 18 23:38:44 2008 +1030
@@ -1057,6 +1057,7 @@
 	int cpu;
 	struct irq_cfg *cfg;
 	cpumask_var_t tmp_mask;
+	int retval = 0;
 
 	cfg = irq_cfg(irq);
 	if ((cfg->move_in_progress) || cfg->move_cleanup_count)
@@ -1070,7 +1071,7 @@
 		cpumask_and(tmp_mask, mask, cpu_online_mask);
 		cpumask_and(tmp_mask, tmp_mask, to_cpumask(cfg->domain));
 		if (!cpumask_empty(tmp_mask))
-			return 0;
+			goto out;
 	}
 
 	/* Only try and allocate irqs on cpus that are present */
@@ -1113,9 +1114,12 @@
 			per_cpu(vector_irq, new_cpu)[vector] = irq;
 		cfg->vector = vector;
 		cpumask_copy(to_cpumask(cfg->domain), tmp_mask);
-		return 0;
+		goto out;
 	}
-	return -ENOSPC;
+	retval = -ENOSPC;
+out:
+	free_cpumask_var(tmp_mask);
+	return retval;
 }
 
 static int assign_irq_vector(int irq, const cpumask_t *mask)
