On Sun, 2007-07-08 at 20:58 +0800, Avi Kivity wrote:
> The only fly in the ointment is that it crashes quite soon. Haven't
> figured
> out why yet, but comments on the general direction would be welcome.
Attached patch seems help in my test. prepare_task_switch is called with
irq disabled.
> -static void vmx_vcpu_load(struct kvm_vcpu *vcpu)
> +static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
> {
> u64 phys_addr = __pa(vcpu->vmcs);
> - int cpu;
> u64 tsc_this, delta;
>
> - cpu = get_cpu();
> -
> + WARN_ON(!preempt_count());
This and below change will break preempt disabled case. better remove
them.
> if (vcpu->cpu != cpu)
> vcpu_clear(vcpu);
>
> @@ -426,9 +432,9 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu)
>
> static void vmx_vcpu_put(struct kvm_vcpu *vcpu)
> {
> + WARN_ON(!preempt_count());
> vmx_load_host_state(vcpu);
> kvm_put_guest_fpu(vcpu);
> - put_cpu();
> }
Index: linux-2.6/drivers/kvm/vmx.c
===================================================================
--- linux-2.6.orig/drivers/kvm/vmx.c
+++ linux-2.6/drivers/kvm/vmx.c
@@ -347,6 +347,7 @@ static void vmx_save_host_state(struct k
static void vmx_load_host_state(struct kvm_vcpu *vcpu)
{
struct vmx_host_state *hs = &vcpu->vmx_host_state;
+ unsigned long flags;
if (!hs->loaded)
return;
@@ -359,12 +360,12 @@ static void vmx_load_host_state(struct k
* If we have to reload gs, we must take care to
* preserve our gs base.
*/
- local_irq_disable();
+ local_irq_save(flags);
load_gs(hs->gs_sel);
#ifdef CONFIG_X86_64
wrmsrl(MSR_GS_BASE, vmcs_readl(HOST_GS_BASE));
#endif
- local_irq_enable();
+ local_irq_restore(flags);
reload_tss();
}
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]