Commit e4d98207 authored by Mike Travis's avatar Mike Travis

x86: xen: use smp_call_function_many()

Impact: use new API, remove cpumask from stack.

Change smp_call_function_mask() callers to smp_call_function_many().

This removes a cpumask from the stack, and falls back should allocating
the cpumask var fail (only possible with CONFIG_CPUMASKS_OFFSTACK).
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarMike Travis <travis@sgi.com>
Cc: jeremy@xensource.com
parent 4cd4601d
...@@ -1079,7 +1079,7 @@ static void drop_other_mm_ref(void *info) ...@@ -1079,7 +1079,7 @@ static void drop_other_mm_ref(void *info)
static void xen_drop_mm_ref(struct mm_struct *mm) static void xen_drop_mm_ref(struct mm_struct *mm)
{ {
cpumask_t mask; cpumask_var_t mask;
unsigned cpu; unsigned cpu;
if (current->active_mm == mm) { if (current->active_mm == mm) {
...@@ -1091,7 +1091,16 @@ static void xen_drop_mm_ref(struct mm_struct *mm) ...@@ -1091,7 +1091,16 @@ static void xen_drop_mm_ref(struct mm_struct *mm)
} }
/* Get the "official" set of cpus referring to our pagetable. */ /* Get the "official" set of cpus referring to our pagetable. */
mask = mm->cpu_vm_mask; if (!alloc_cpumask_var(&mask, GFP_ATOMIC)) {
for_each_online_cpu(cpu) {
if (!cpumask_test_cpu(cpu, &mm->cpu_vm_mask)
&& per_cpu(xen_current_cr3, cpu) != __pa(mm->pgd))
continue;
smp_call_function_single(cpu, drop_other_mm_ref, mm, 1);
}
return;
}
cpumask_copy(mask, &mm->cpu_vm_mask);
/* It's possible that a vcpu may have a stale reference to our /* It's possible that a vcpu may have a stale reference to our
cr3, because its in lazy mode, and it hasn't yet flushed cr3, because its in lazy mode, and it hasn't yet flushed
...@@ -1100,11 +1109,12 @@ static void xen_drop_mm_ref(struct mm_struct *mm) ...@@ -1100,11 +1109,12 @@ static void xen_drop_mm_ref(struct mm_struct *mm)
if needed. */ if needed. */
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
if (per_cpu(xen_current_cr3, cpu) == __pa(mm->pgd)) if (per_cpu(xen_current_cr3, cpu) == __pa(mm->pgd))
cpu_set(cpu, mask); cpumask_set_cpu(cpu, mask);
} }
if (!cpus_empty(mask)) if (!cpumask_empty(mask))
smp_call_function_mask(mask, drop_other_mm_ref, mm, 1); smp_call_function_many(mask, drop_other_mm_ref, mm, 1);
free_cpumask_var(mask);
} }
#else #else
static void xen_drop_mm_ref(struct mm_struct *mm) static void xen_drop_mm_ref(struct mm_struct *mm)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment