Commit 0e21990a authored by Mike Travis's avatar Mike Travis Committed by Ingo Molnar
Browse files

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: default avatarMike Travis <travis@sgi.com>
parent 4595f962
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -202,17 +202,18 @@ 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()));
		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);

		put_cpu_var(flush_tlb_uv_cpumask);
		return;
	}
	}
	flush_tlb_others_ipi(cpumask, mm, va);
}