diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2015-10-14 18:33:09 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-10-16 04:34:16 -0400 |
commit | 7cae2bedcbd4680b155999655e49c27b9cf020fa (patch) | |
tree | dbcb58f0bfaef1337e187710a2a039aa6793e787 /arch/x86/kvm | |
parent | 5225fdf8c8bea4418f69875804584c89a27c170e (diff) |
KVM: x86: move steal time initialization to vcpu entry time
As reported at https://bugs.launchpad.net/qemu/+bug/1494350,
it is possible to have vcpu->arch.st.last_steal initialized
from a thread other than vcpu thread, say the iothread, via
KVM_SET_MSRS.
Which can cause an overflow later (when subtracting from vcpu threads
sched_info.run_delay).
To avoid that, move steal time accumulation to vcpu entry time,
before copying steal time data to guest.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Reviewed-by: David Matlack <dmatlack@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r-- | arch/x86/kvm/x86.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index e33aebbf189e..9e9c226cb79d 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -1903,6 +1903,8 @@ static void accumulate_steal_time(struct kvm_vcpu *vcpu) | |||
1903 | 1903 | ||
1904 | static void record_steal_time(struct kvm_vcpu *vcpu) | 1904 | static void record_steal_time(struct kvm_vcpu *vcpu) |
1905 | { | 1905 | { |
1906 | accumulate_steal_time(vcpu); | ||
1907 | |||
1906 | if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED)) | 1908 | if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED)) |
1907 | return; | 1909 | return; |
1908 | 1910 | ||
@@ -2053,12 +2055,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
2053 | if (!(data & KVM_MSR_ENABLED)) | 2055 | if (!(data & KVM_MSR_ENABLED)) |
2054 | break; | 2056 | break; |
2055 | 2057 | ||
2056 | vcpu->arch.st.last_steal = current->sched_info.run_delay; | ||
2057 | |||
2058 | preempt_disable(); | ||
2059 | accumulate_steal_time(vcpu); | ||
2060 | preempt_enable(); | ||
2061 | |||
2062 | kvm_make_request(KVM_REQ_STEAL_UPDATE, vcpu); | 2058 | kvm_make_request(KVM_REQ_STEAL_UPDATE, vcpu); |
2063 | 2059 | ||
2064 | break; | 2060 | break; |
@@ -2634,7 +2630,6 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | |||
2634 | vcpu->cpu = cpu; | 2630 | vcpu->cpu = cpu; |
2635 | } | 2631 | } |
2636 | 2632 | ||
2637 | accumulate_steal_time(vcpu); | ||
2638 | kvm_make_request(KVM_REQ_STEAL_UPDATE, vcpu); | 2633 | kvm_make_request(KVM_REQ_STEAL_UPDATE, vcpu); |
2639 | } | 2634 | } |
2640 | 2635 | ||