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>
This commit is contained in:
parent
4595f9620c
commit
0e21990ae7
@ -202,16 +202,17 @@ void native_flush_tlb_others(const struct cpumask *cpumask,
|
|||||||
struct mm_struct *mm, unsigned long va)
|
struct mm_struct *mm, unsigned long va)
|
||||||
{
|
{
|
||||||
if (is_uv_system()) {
|
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_andnot(after_uv_flush,
|
cpumask_of(smp_processor_id()));
|
||||||
cpumask, cpumask_of(smp_processor_id()));
|
if (!uv_flush_tlb_others(after_uv_flush, mm, va))
|
||||||
if (!uv_flush_tlb_others(after_uv_flush, mm, va))
|
flush_tlb_others_ipi(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;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
flush_tlb_others_ipi(cpumask, mm, va);
|
flush_tlb_others_ipi(cpumask, mm, va);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user