# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 26befe042dd54cf7539a5c82449fe57938ce1fd8
# Parent 01fa38f7920701c1529d0db72cf2fac478e5e92a
Fix CPU-migration of VMX domains.
Signed-off-by: Yunhong Jiang <yunhong.jiang@xxxxxxxxx>
diff -r 01fa38f79207 -r 26befe042dd5 xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c Thu Feb 9 10:32:17 2006
+++ b/xen/arch/x86/hvm/vmx/vmcs.c Thu Feb 9 11:10:28 2006
@@ -73,6 +73,26 @@
}
set_bit(ARCH_VMX_VMCS_LOADED, &arch_vmx->flags);
return 0;
+}
+
+static void vmx_smp_clear_vmcs(void *info)
+{
+ struct vcpu *v = (struct vcpu *)info;
+
+ ASSERT(HVM_DOMAIN(v));
+
+ if (v->arch.hvm_vmx.launch_cpu == smp_processor_id())
+ __vmpclear(virt_to_maddr(v->arch.hvm_vmx.vmcs));
+}
+
+void vmx_request_clear_vmcs(struct vcpu *v)
+{
+ ASSERT(HVM_DOMAIN(v));
+
+ if (v->arch.hvm_vmx.launch_cpu == smp_processor_id())
+ __vmpclear(virt_to_maddr(v->arch.hvm_vmx.vmcs));
+ else
+ smp_call_function(vmx_smp_clear_vmcs, v, 1, 1);
}
#if 0
@@ -167,6 +187,7 @@
host_env.tr_base = (unsigned long) &init_tss[cpu];
error |= __vmwrite(HOST_TR_SELECTOR, host_env.tr_selector);
error |= __vmwrite(HOST_TR_BASE, host_env.tr_base);
+ error |= __vmwrite(HOST_RSP, (unsigned long)get_stack_bottom());
}
static void vmx_do_launch(struct vcpu *v)
@@ -212,7 +233,6 @@
shadow_direct_map_init(v);
__vmwrite(GUEST_CR3, pagetable_get_paddr(v->domain->arch.phys_table));
__vmwrite(HOST_CR3, pagetable_get_paddr(v->arch.monitor_table));
- __vmwrite(HOST_RSP, (unsigned long)get_stack_bottom());
v->arch.schedule_tail = arch_vmx_do_resume;
v->arch.hvm_vmx.launch_cpu = smp_processor_id();
@@ -510,10 +530,11 @@
}
else
{
- __vmpclear(virt_to_maddr(v->arch.hvm_vmx.vmcs));
+ vmx_request_clear_vmcs(v);
load_vmcs(&v->arch.hvm_vmx, virt_to_maddr(v->arch.hvm_vmx.vmcs));
+ vmx_migrate_timers(v);
+ vmx_set_host_env(v);
vmx_do_resume(v);
- vmx_set_host_env(v);
v->arch.hvm_vmx.launch_cpu = smp_processor_id();
reset_stack_and_jump(vmx_asm_do_relaunch);
}
diff -r 01fa38f79207 -r 26befe042dd5 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Thu Feb 9 10:32:17 2006
+++ b/xen/arch/x86/hvm/vmx/vmx.c Thu Feb 9 11:10:28 2006
@@ -91,6 +91,7 @@
(void *)d->arch.hvm_domain.shared_page_va);
}
+ vmx_request_clear_vmcs(v);
destroy_vmcs(&v->arch.hvm_vmx);
free_monitor_pagetable(v);
vpit = &v->domain->arch.hvm_domain.vpit;
@@ -336,6 +337,16 @@
{
vmx_relinquish_resources(v);
return 1;
+}
+
+void vmx_migrate_timers(struct vcpu *v)
+{
+ struct hvm_virpit *vpit = &(v->domain->arch.hvm_domain.vpit);
+
+ migrate_timer(&vpit->pit_timer, v->processor);
+ migrate_timer(&v->arch.hvm_vmx.hlt_timer, v->processor);
+ if ( hvm_apic_support(v->domain) && VLAPIC(v))
+ migrate_timer(&(VLAPIC(v)->vlapic_timer), v->processor);
}
void vmx_store_cpu_guest_regs(struct vcpu *v, struct cpu_user_regs *regs)
diff -r 01fa38f79207 -r 26befe042dd5 xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h Thu Feb 9 10:32:17 2006
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h Thu Feb 9 11:10:28 2006
@@ -94,6 +94,8 @@
int modify_vmcs(struct arch_vmx_struct *arch_vmx,
struct cpu_user_regs *regs);
void destroy_vmcs(struct arch_vmx_struct *arch_vmx);
+
+extern void vmx_request_clear_vmcs(struct vcpu *v);
#define VMCS_USE_HOST_ENV 1
#define VMCS_USE_SEPARATE_ENV 0
diff -r 01fa38f79207 -r 26befe042dd5 xen/include/asm-x86/hvm/vmx/vmx.h
--- a/xen/include/asm-x86/hvm/vmx/vmx.h Thu Feb 9 10:32:17 2006
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h Thu Feb 9 11:10:28 2006
@@ -31,7 +31,7 @@
extern void vmx_asm_do_launch(void);
extern void vmx_intr_assist(void);
extern void vmx_set_tsc_shift(struct vcpu *, struct hvm_virpit *);
-
+extern void vmx_migrate_timers(struct vcpu *v);
extern void arch_vmx_do_launch(struct vcpu *);
extern void arch_vmx_do_resume(struct vcpu *);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|