d94c859728
OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=b6b207d81cd5754c754f7e4e72bb82de
96 lines
3.0 KiB
Diff
96 lines
3.0 KiB
Diff
# HG changeset patch
|
|
# User Keir Fraser <keir.fraser@citrix.com>
|
|
# 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@novell.com>
|
|
|
|
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);
|
|
|