On Wed, Oct 14, 2015 at 3:33 PM, Marcelo Tosatti <mtosatti@xxxxxxxxxx> wrote: > > 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@xxxxxxxxxx> Reviewed-by: David Matlack <dmatlack@xxxxxxxxxx> > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 8f0f6ec..0e0332e 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -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 majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html