[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.2] x86: don't drop guest visible state updates when 64-bit PV guest is in user mode
commit 0620cc886eef9018d2b2a5fcdc641be70b5ac54b Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Thu Feb 20 08:41:22 2014 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Feb 20 08:41:22 2014 +0100 x86: don't drop guest visible state updates when 64-bit PV guest is in user mode Since 64-bit PV uses separate kernel and user mode page tables, kernel addresses (as usually provided via VCPUOP_register_runstate_memory_area) aren't necessarily accessible when the respective updating occurs. Add logic for toggle_guest_mode() to take care of this (if necessary) the next time the vCPU switches to kernel mode. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> master commit: 231d7f4098c8ac9cdb78f18fcb820d8618c8b0c2 master date: 2014-01-23 10:30:08 +0100 --- xen/arch/x86/domain.c | 24 ++++++++++++++++-------- xen/arch/x86/x86_64/traps.c | 7 +++++++ xen/include/asm-x86/domain.h | 5 +++++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index ecba304..2dfea87 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1563,10 +1563,10 @@ static void paravirt_ctxt_switch_to(struct vcpu *v) } /* Update per-VCPU guest runstate shared memory area (if registered). */ -static void update_runstate_area(struct vcpu *v) +bool_t update_runstate_area(const struct vcpu *v) { if ( guest_handle_is_null(runstate_guest(v)) ) - return; + return 1; #ifdef CONFIG_COMPAT if ( has_32bit_shinfo(v->domain) ) @@ -1575,11 +1575,19 @@ static void update_runstate_area(struct vcpu *v) XLAT_vcpu_runstate_info(&info, &v->runstate); __copy_to_guest(v->runstate_guest.compat, &info, 1); - return; + return 1; } #endif - __copy_to_guest(runstate_guest(v), &v->runstate, 1); + return __copy_to_guest(runstate_guest(v), &v->runstate, 1) != + sizeof(v->runstate); +} + +static void _update_runstate_area(struct vcpu *v) +{ + if ( !update_runstate_area(v) && !is_hvm_vcpu(v) && + !(v->arch.flags & TF_kernel_mode) ) + v->arch.pv_vcpu.need_update_runstate_area = 1; } static inline int need_full_gdt(struct vcpu *v) @@ -1684,8 +1692,8 @@ void context_switch(struct vcpu *prev, struct vcpu *next) flush_tlb_mask(&dirty_mask); } - if (prev != next) - update_runstate_area(prev); + if ( prev != next ) + _update_runstate_area(prev); if ( is_hvm_vcpu(prev) && !list_empty(&prev->arch.hvm_vcpu.tm_list) ) pt_save_timer(prev); @@ -1730,8 +1738,8 @@ void context_switch(struct vcpu *prev, struct vcpu *next) context_saved(prev); - if (prev != next) - update_runstate_area(next); + if ( prev != next ) + _update_runstate_area(next); schedule_tail(next); BUG(); diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index d20e528..ba1c408 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -266,6 +266,13 @@ void toggle_guest_mode(struct vcpu *v) #else write_ptbase(v); #endif + + if ( !(v->arch.flags & TF_kernel_mode) ) + return; + + if ( v->arch.pv_vcpu.need_update_runstate_area && + update_runstate_area(v) ) + v->arch.pv_vcpu.need_update_runstate_area = 0; } unsigned long do_iret(void) diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index 9be5239..6c62c25 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -419,6 +419,9 @@ struct pv_vcpu /* Current LDT details. */ unsigned long shadow_ldt_mapcnt; spinlock_t shadow_ldt_lock; + + /* Deferred VA-based update state. */ + bool_t need_update_runstate_area; }; struct arch_vcpu @@ -514,6 +517,8 @@ struct arch_vcpu #define hvm_vmx hvm_vcpu.u.vmx #define hvm_svm hvm_vcpu.u.svm +bool_t update_runstate_area(const struct vcpu *); + void vcpu_show_execution_state(struct vcpu *); void vcpu_show_registers(const struct vcpu *); -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.2 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |