From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pa0-f47.google.com ([209.85.220.47]:36719 "EHLO mail-pa0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S964852AbcCKIzV (ORCPT ); Fri, 11 Mar 2016 03:55:21 -0500 Received: by mail-pa0-f47.google.com with SMTP id tt10so90923773pab.3 for ; Fri, 11 Mar 2016 00:55:20 -0800 (PST) From: Liang Chen To: stable@vger.kernel.org Cc: mtosatti@redhat.com, pbonzini@redhat.com, lizefan@huawei.com, gregkh@linuxfoundation.org, jslaby@suse.cz, sasha.levin@oracle.com Subject: [PATCH] KVM: x86: move steal time initialization to vcpu entry time Date: Fri, 11 Mar 2016 16:53:11 +0800 Message-Id: <1457686391-17855-1-git-send-email-liangchen.linux@gmail.com> Sender: stable-owner@vger.kernel.org List-ID: From: Marcelo Tosatti commit 7cae2bedcbd4680b155999655e49c27b9cf020fa upstream This patch is needed on lts 3.4, 3.10, 3.12, 3.14, 3.18, and 4.1 for the same issue. Can you please to pick it up? 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 Reviewed-by: David Matlack Signed-off-by: Paolo Bonzini --- arch/x86/kvm/x86.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index d6e8bd0..7d4f352 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1987,6 +1987,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; @@ -2120,12 +2122,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; @@ -2808,7 +2804,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); } -- 1.9.1