diff options
Diffstat (limited to 'arch/x86/xen/smp.c')
-rw-r--r-- | arch/x86/xen/smp.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 4fa33c27ccb6..d53bf9d8a72d 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -370,7 +370,8 @@ int xen_smp_call_function_mask(cpumask_t mask, void (*func)(void *), | |||
370 | void *info, int wait) | 370 | void *info, int wait) |
371 | { | 371 | { |
372 | struct call_data_struct data; | 372 | struct call_data_struct data; |
373 | int cpus; | 373 | int cpus, cpu; |
374 | bool yield; | ||
374 | 375 | ||
375 | /* Holding any lock stops cpus from going down. */ | 376 | /* Holding any lock stops cpus from going down. */ |
376 | spin_lock(&call_lock); | 377 | spin_lock(&call_lock); |
@@ -399,9 +400,14 @@ int xen_smp_call_function_mask(cpumask_t mask, void (*func)(void *), | |||
399 | /* Send a message to other CPUs and wait for them to respond */ | 400 | /* Send a message to other CPUs and wait for them to respond */ |
400 | xen_send_IPI_mask(mask, XEN_CALL_FUNCTION_VECTOR); | 401 | xen_send_IPI_mask(mask, XEN_CALL_FUNCTION_VECTOR); |
401 | 402 | ||
402 | /* Make sure other vcpus get a chance to run. | 403 | /* Make sure other vcpus get a chance to run if they need to. */ |
403 | XXX too severe? Maybe we should check the other CPU's states? */ | 404 | yield = false; |
404 | HYPERVISOR_sched_op(SCHEDOP_yield, 0); | 405 | for_each_cpu_mask(cpu, mask) |
406 | if (xen_vcpu_stolen(cpu)) | ||
407 | yield = true; | ||
408 | |||
409 | if (yield) | ||
410 | HYPERVISOR_sched_op(SCHEDOP_yield, 0); | ||
405 | 411 | ||
406 | /* Wait for response */ | 412 | /* Wait for response */ |
407 | while (atomic_read(&data.started) != cpus || | 413 | while (atomic_read(&data.started) != cpus || |