diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2012-02-03 12:43:55 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-03-08 07:10:07 -0500 |
commit | f1e2b26003c41e581243c09ceed7567677449468 (patch) | |
tree | 9c6dc330959815651611bf9636c401ba24cd6cd9 /arch/x86/kvm | |
parent | 6f526ec5383dcd5fa5ffc7b3ac1d62099a0b46ad (diff) |
KVM: Allow adjust_tsc_offset to be in host or guest cycles
Redefine the API to take a parameter indicating whether an
adjustment is in host or guest cycles.
Signed-off-by: Zachary Amsden <zamsden@gmail.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r-- | arch/x86/kvm/svm.c | 6 | ||||
-rw-r--r-- | arch/x86/kvm/vmx.c | 2 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 2 |
3 files changed, 7 insertions, 3 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index e12026e5244e..0b7690ee20bd 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -1016,10 +1016,14 @@ static void svm_write_tsc_offset(struct kvm_vcpu *vcpu, u64 offset) | |||
1016 | mark_dirty(svm->vmcb, VMCB_INTERCEPTS); | 1016 | mark_dirty(svm->vmcb, VMCB_INTERCEPTS); |
1017 | } | 1017 | } |
1018 | 1018 | ||
1019 | static void svm_adjust_tsc_offset(struct kvm_vcpu *vcpu, s64 adjustment) | 1019 | static void svm_adjust_tsc_offset(struct kvm_vcpu *vcpu, s64 adjustment, bool host) |
1020 | { | 1020 | { |
1021 | struct vcpu_svm *svm = to_svm(vcpu); | 1021 | struct vcpu_svm *svm = to_svm(vcpu); |
1022 | 1022 | ||
1023 | WARN_ON(adjustment < 0); | ||
1024 | if (host) | ||
1025 | adjustment = svm_scale_tsc(vcpu, adjustment); | ||
1026 | |||
1023 | svm->vmcb->control.tsc_offset += adjustment; | 1027 | svm->vmcb->control.tsc_offset += adjustment; |
1024 | if (is_guest_mode(vcpu)) | 1028 | if (is_guest_mode(vcpu)) |
1025 | svm->nested.hsave->control.tsc_offset += adjustment; | 1029 | svm->nested.hsave->control.tsc_offset += adjustment; |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index e6bf61fa1c03..575fb742a6fc 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -1856,7 +1856,7 @@ static void vmx_write_tsc_offset(struct kvm_vcpu *vcpu, u64 offset) | |||
1856 | } | 1856 | } |
1857 | } | 1857 | } |
1858 | 1858 | ||
1859 | static void vmx_adjust_tsc_offset(struct kvm_vcpu *vcpu, s64 adjustment) | 1859 | static void vmx_adjust_tsc_offset(struct kvm_vcpu *vcpu, s64 adjustment, bool host) |
1860 | { | 1860 | { |
1861 | u64 offset = vmcs_read64(TSC_OFFSET); | 1861 | u64 offset = vmcs_read64(TSC_OFFSET); |
1862 | vmcs_write64(TSC_OFFSET, offset + adjustment); | 1862 | vmcs_write64(TSC_OFFSET, offset + adjustment); |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 39a57dac884a..3b931302fa55 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -1116,7 +1116,7 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) | |||
1116 | if (vcpu->tsc_catchup) { | 1116 | if (vcpu->tsc_catchup) { |
1117 | u64 tsc = compute_guest_tsc(v, kernel_ns); | 1117 | u64 tsc = compute_guest_tsc(v, kernel_ns); |
1118 | if (tsc > tsc_timestamp) { | 1118 | if (tsc > tsc_timestamp) { |
1119 | kvm_x86_ops->adjust_tsc_offset(v, tsc - tsc_timestamp); | 1119 | adjust_tsc_offset_guest(v, tsc - tsc_timestamp); |
1120 | tsc_timestamp = tsc; | 1120 | tsc_timestamp = tsc; |
1121 | } | 1121 | } |
1122 | } | 1122 | } |