[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86: extend runstate area updates
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1250683301 -3600 # Node ID 456b4ec002443227f6d97f79b213dc4b2d281f9e # Parent 2b8b6ee95c939089a0a7182286c9a21f0acce8fe x86: extend runstate area updates In order to give guests a hint at whether their vCPU-s are currently scheduled (so they can e.g. adapt their behavior in spin loops), update the run state area (if registered) also when de-scheduling a vCPU. Also fix an oversight in the compat mode implementation of VCPUOP_register_runstate_memory_area. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> --- xen/arch/x86/domain.c | 40 +++++++++++++++++++++++++--------------- xen/arch/x86/x86_64/domain.c | 2 +- 2 files changed, 26 insertions(+), 16 deletions(-) diff -r 2b8b6ee95c93 -r 456b4ec00244 xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Wed Aug 19 12:58:15 2009 +0100 +++ b/xen/arch/x86/domain.c Wed Aug 19 13:01:41 2009 +0100 @@ -1273,6 +1273,26 @@ static void paravirt_ctxt_switch_to(stru } } +/* Update per-VCPU guest runstate shared memory area (if registered). */ +static void update_runstate_area(struct vcpu *v) +{ + if ( guest_handle_is_null(runstate_guest(v)) ) + return; + +#ifdef CONFIG_COMPAT + if ( is_pv_32on64_domain(v->domain) ) + { + struct compat_vcpu_runstate_info info; + + XLAT_vcpu_runstate_info(&info, &v->runstate); + __copy_to_guest(v->runstate_guest.compat, &info, 1); + return; + } +#endif + + __copy_to_guest(runstate_guest(v), &v->runstate, 1); +} + static inline int need_full_gdt(struct vcpu *v) { return (!is_hvm_vcpu(v) && !is_idle_vcpu(v)); @@ -1364,6 +1384,9 @@ void context_switch(struct vcpu *prev, s flush_tlb_mask(&dirty_mask); } + if (prev != next) + update_runstate_area(prev); + if ( is_hvm_vcpu(prev) && !list_empty(&prev->arch.hvm_vcpu.tm_list) ) pt_save_timer(prev); @@ -1403,21 +1426,8 @@ void context_switch(struct vcpu *prev, s context_saved(prev); - /* Update per-VCPU guest runstate shared memory area (if registered). */ - if ( !guest_handle_is_null(runstate_guest(next)) ) - { - if ( !is_pv_32on64_domain(next->domain) ) - __copy_to_guest(runstate_guest(next), &next->runstate, 1); -#ifdef CONFIG_COMPAT - else - { - struct compat_vcpu_runstate_info info; - - XLAT_vcpu_runstate_info(&info, &next->runstate); - __copy_to_guest(next->runstate_guest.compat, &info, 1); - } -#endif - } + if (prev != next) + update_runstate_area(next); schedule_tail(next); BUG(); diff -r 2b8b6ee95c93 -r 456b4ec00244 xen/arch/x86/x86_64/domain.c --- a/xen/arch/x86/x86_64/domain.c Wed Aug 19 12:58:15 2009 +0100 +++ b/xen/arch/x86/x86_64/domain.c Wed Aug 19 13:01:41 2009 +0100 @@ -56,7 +56,7 @@ arch_compat_vcpu_op( struct vcpu_runstate_info runstate; vcpu_runstate_get(v, &runstate); - XLAT_vcpu_runstate_info(&info, &v->runstate); + XLAT_vcpu_runstate_info(&info, &runstate); } __copy_to_guest(v->runstate_guest.compat, &info, 1); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |