# HG changeset patch # User Keir Fraser # 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 Index: xen-3.4.1-testing/xen/arch/x86/domain.c =================================================================== --- xen-3.4.1-testing.orig/xen/arch/x86/domain.c +++ xen-3.4.1-testing/xen/arch/x86/domain.c @@ -1219,6 +1219,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)); @@ -1311,6 +1331,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); @@ -1350,21 +1373,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(); Index: xen-3.4.1-testing/xen/arch/x86/x86_64/domain.c =================================================================== --- xen-3.4.1-testing.orig/xen/arch/x86/x86_64/domain.c +++ xen-3.4.1-testing/xen/arch/x86/x86_64/domain.c @@ -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);