|
@@ -505,7 +505,6 @@ static void __vcpu_clear(void *arg)
|
|
|
vmcs_clear(vmx->vmcs);
|
|
|
if (per_cpu(current_vmcs, cpu) == vmx->vmcs)
|
|
|
per_cpu(current_vmcs, cpu) = NULL;
|
|
|
- rdtscll(vmx->vcpu.arch.host_tsc);
|
|
|
list_del(&vmx->local_vcpus_link);
|
|
|
vmx->vcpu.cpu = -1;
|
|
|
vmx->launched = 0;
|
|
@@ -881,7 +880,6 @@ static void vmx_load_host_state(struct vcpu_vmx *vmx)
|
|
|
static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
|
|
{
|
|
|
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
|
|
- u64 tsc_this, delta, new_offset;
|
|
|
u64 phys_addr = __pa(per_cpu(vmxarea, cpu));
|
|
|
|
|
|
if (!vmm_exclusive)
|
|
@@ -898,14 +896,12 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
|
|
struct desc_ptr *gdt = &__get_cpu_var(host_gdt);
|
|
|
unsigned long sysenter_esp;
|
|
|
|
|
|
- kvm_migrate_timers(vcpu);
|
|
|
kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
|
|
|
local_irq_disable();
|
|
|
list_add(&vmx->local_vcpus_link,
|
|
|
&per_cpu(vcpus_on_cpu, cpu));
|
|
|
local_irq_enable();
|
|
|
|
|
|
- vcpu->cpu = cpu;
|
|
|
/*
|
|
|
* Linux uses per-cpu TSS and GDT, so set these when switching
|
|
|
* processors.
|
|
@@ -915,16 +911,6 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
|
|
|
|
|
rdmsrl(MSR_IA32_SYSENTER_ESP, sysenter_esp);
|
|
|
vmcs_writel(HOST_IA32_SYSENTER_ESP, sysenter_esp); /* 22.2.3 */
|
|
|
-
|
|
|
- /*
|
|
|
- * Make sure the time stamp counter is monotonous.
|
|
|
- */
|
|
|
- rdtscll(tsc_this);
|
|
|
- if (tsc_this < vcpu->arch.host_tsc) {
|
|
|
- delta = vcpu->arch.host_tsc - tsc_this;
|
|
|
- new_offset = vmcs_read64(TSC_OFFSET) + delta;
|
|
|
- vmcs_write64(TSC_OFFSET, new_offset);
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1153,6 +1139,12 @@ static void vmx_write_tsc_offset(struct kvm_vcpu *vcpu, u64 offset)
|
|
|
vmcs_write64(TSC_OFFSET, offset);
|
|
|
}
|
|
|
|
|
|
+static void vmx_adjust_tsc_offset(struct kvm_vcpu *vcpu, s64 adjustment)
|
|
|
+{
|
|
|
+ u64 offset = vmcs_read64(TSC_OFFSET);
|
|
|
+ vmcs_write64(TSC_OFFSET, offset + adjustment);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Reads an msr value (of 'msr_index') into 'pdata'.
|
|
|
* Returns 0 on success, non-0 otherwise.
|
|
@@ -4108,6 +4100,7 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id)
|
|
|
|
|
|
cpu = get_cpu();
|
|
|
vmx_vcpu_load(&vmx->vcpu, cpu);
|
|
|
+ vmx->vcpu.cpu = cpu;
|
|
|
err = vmx_vcpu_setup(vmx);
|
|
|
vmx_vcpu_put(&vmx->vcpu);
|
|
|
put_cpu();
|
|
@@ -4347,6 +4340,7 @@ static struct kvm_x86_ops vmx_x86_ops = {
|
|
|
.has_wbinvd_exit = cpu_has_vmx_wbinvd_exit,
|
|
|
|
|
|
.write_tsc_offset = vmx_write_tsc_offset,
|
|
|
+ .adjust_tsc_offset = vmx_adjust_tsc_offset,
|
|
|
};
|
|
|
|
|
|
static int __init vmx_init(void)
|