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: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Mike Travis <travis@sgi.com> Cc: jeremy@xensource.com
This commit is contained in:
@ -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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
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)
|
||||||
|
Reference in New Issue
Block a user