KVM: x86: move steal time initialization to vcpu entry time
PATCH 1/1 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.
arch/x86/kvm/x86.c +2 -7
@@ -2030,6 +2030,8 @@ static void accumulate_steal_time(struct kvm_vcpu *vcpu)static void record_steal_time (struct kvm_vcpu *vcpu) { +accumulate_steal_time (vcpu); +if (!(vcpu->arch.st.msr_val &KVM_MSR_ENABLED ))return ;
@@ -2182,12 +2184,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)if (!(data &KVM_MSR_ENABLED ))break ; - vcpu->arch.st.last_steal = current->sched_info.run_delay; - -preempt_disable (); -accumulate_steal_time (vcpu); -preempt_enable (); -kvm_make_request (KVM_REQ_STEAL_UPDATE , vcpu);break ;
@@ -2830,7 +2826,6 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) vcpu->cpu = cpu; } -accumulate_steal_time (vcpu);kvm_make_request (KVM_REQ_STEAL_UPDATE , vcpu); }
Quoted 6 lines · Marcelo Tosatti
As reported at https://bugs.launchpad.net/qemu/+bug/1494350,
it is possible to havevcpu->arch.st.last_stealinitialized from a thread other than vcpu thread, say the iothread, viaKVM_SET_MSRS.
Quoted 7 lines
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 <[email protected]>
Quoted 39 lines
arch/x86/kvm/x86.c +2
-8@@ -2030,6 +2030,8 @@ static void accumulate_steal_time(struct kvm_vcpu *vcpu)static void record_steal_time (struct kvm_vcpu *vcpu) { +accumulate_steal_time (vcpu); +if (!(vcpu->arch.st.msr_val &KVM_MSR_ENABLED ))return ;@@ -2182,12 +2184,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)if (!(data &KVM_MSR_ENABLED ))break ; - vcpu->arch.st.last_steal = current->sched_info.run_delay; - -preempt_disable (); -accumulate_steal_time (vcpu); -preempt_enable (); -kvm_make_request (KVM_REQ_STEAL_UPDATE , vcpu);break ;@@ -2830,7 +2826,6 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) vcpu->cpu = cpu; } -accumulate_steal_time (vcpu);kvm_make_request (KVM_REQ_STEAL_UPDATE , vcpu); } --To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 8 lines · David Matlack
Quoted 8 lines
As reported at https://bugs.launchpad.net/qemu/+bug/1494350,
it is possible to havevcpu->arch.st.last_stealinitialized from a thread other than vcpu thread, say the iothread, viaKVM_SET_MSRS.Which can cause an overflow later (when subtracting from vcpu threads sched_info.run_delay).
Quoted 6 lines
Quoted 4 lines
To avoid that, move steal time accumulation to vcpu entry time, before copying steal time data to guest.
Signed-off-by Marcelo Tosatti <[email protected]>Reviewed-by David Matlack <[email protected]>
Applied to kvm/queue. Thanks Marcelo, and thanks David for the review.
Paolo