diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-17 14:10:11 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-17 14:10:11 -0400 |
commit | fb9fc395174138983a49f2da982ed14caabbe741 (patch) | |
tree | 5d5d3643ee6853a899205613da272cc343fdc1a4 /arch/x86/xen/smp.c | |
parent | 0eafaae84e21ac033815cc9f33c3ae889cd7ccfe (diff) | |
parent | ace2e92e193126711cb3a83a3752b2c5b8396950 (diff) |
Merge branch 'xen-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen
* 'xen-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen:
xfs: eagerly remove vmap mappings to avoid upsetting Xen
xen: add some debug output for failed multicalls
xen: fix incorrect vcpu_register_vcpu_info hypercall argument
xen: ask the hypervisor how much space it needs reserved
xen: lock pte pages while pinning/unpinning
xen: deal with stale cr3 values when unpinning pagetables
xen: add batch completion callbacks
xen: yield to IPI target if necessary
Clean up duplicate includes in arch/i386/xen/
remove dead code in pgtable_cache_init
paravirt: clean up lazy mode handling
paravirt: refactor struct paravirt_ops into smaller pv_*_ops
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 || |