From 0e21990ae7ee11af94f44f240b06e520cf1505d4 Mon Sep 17 00:00:00 2001
From: Mike Travis <travis@sgi.com>
Date: Sat, 10 Jan 2009 21:58:10 -0800
Subject: [PATCH] SGI UV cpumask: use static temp cpumask in flush_tlb

Impact: Improve tlb flush performance for UV

Calling alloc_cpumask_var a zillion times a second does affect
performance.  Replace with static cpumask.

Note: when CONFIG_X86_UV is defined, this extra PER_CPU memory
will be optimized out for non-UV configs as is_uv_system() will
then return a constant 0.

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

diff --git a/arch/x86/kernel/tlb_64.c b/arch/x86/kernel/tlb_64.c
index 38836aef51b4..7a3f9891302d 100644
--- a/arch/x86/kernel/tlb_64.c
+++ b/arch/x86/kernel/tlb_64.c
@@ -202,16 +202,17 @@ void native_flush_tlb_others(const struct cpumask *cpumask,
 			     struct mm_struct *mm, unsigned long va)
 {
 	if (is_uv_system()) {
-		cpumask_var_t after_uv_flush;
+		/* FIXME: could be an percpu_alloc'd thing */
+		static DEFINE_PER_CPU(cpumask_t, flush_tlb_mask);
+		struct cpumask *after_uv_flush = &get_cpu_var(flush_tlb_mask);
 
-		if (alloc_cpumask_var(&after_uv_flush, GFP_ATOMIC)) {
-			cpumask_andnot(after_uv_flush,
-				       cpumask, cpumask_of(smp_processor_id()));
-			if (!uv_flush_tlb_others(after_uv_flush, mm, va))
-				flush_tlb_others_ipi(after_uv_flush, mm, va);
-			free_cpumask_var(after_uv_flush);
-			return;
-		}
+		cpumask_andnot(after_uv_flush, cpumask,
+			       cpumask_of(smp_processor_id()));
+		if (!uv_flush_tlb_others(after_uv_flush, mm, va))
+			flush_tlb_others_ipi(after_uv_flush, mm, va);
+
+		put_cpu_var(flush_tlb_uv_cpumask);
+		return;
 	}
 	flush_tlb_others_ipi(cpumask, mm, va);
 }