From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoffer Dall Subject: Re: [PATCH v3 10/10] KVM: arm/arm64: PMU: remove request-less vcpu kick Date: Sat, 6 May 2017 20:55:43 +0200 Message-ID: <20170506185543.GG5923@cbox> References: <20170503160635.21669-1-drjones@redhat.com> <20170503160635.21669-11-drjones@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, marc.zyngier@arm.com, pbonzini@redhat.com, rkrcmar@redhat.com To: Andrew Jones Return-path: Received: from mail-wm0-f47.google.com ([74.125.82.47]:36328 "EHLO mail-wm0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752505AbdEFSzs (ORCPT ); Sat, 6 May 2017 14:55:48 -0400 Received: by mail-wm0-f47.google.com with SMTP id u65so47875422wmu.1 for ; Sat, 06 May 2017 11:55:48 -0700 (PDT) Content-Disposition: inline In-Reply-To: <20170503160635.21669-11-drjones@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On Wed, May 03, 2017 at 06:06:35PM +0200, Andrew Jones wrote: > Refactor PMU overflow handling in order to remove the request-less > vcpu kick. Now, since kvm_vgic_inject_irq() uses vcpu requests, > there should be no chance that a kick sent at just the wrong time > (between the VCPU's call to kvm_pmu_flush_hwstate() and before it > enters guest mode) results in a failure for the guest to see updated > GIC state until its next exit some time later for some other reason. > > Signed-off-by: Andrew Jones Reviewed-by: Christoffer Dall > --- > virt/kvm/arm/pmu.c | 40 +++++++++++++++++++--------------------- > 1 file changed, 19 insertions(+), 21 deletions(-) > > diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c > index 4b43e7f3b158..2451607dc25e 100644 > --- a/virt/kvm/arm/pmu.c > +++ b/virt/kvm/arm/pmu.c > @@ -203,6 +203,23 @@ static u64 kvm_pmu_overflow_status(struct kvm_vcpu *vcpu) > return reg; > } > > +static void kvm_pmu_check_overflow(struct kvm_vcpu *vcpu) > +{ > + struct kvm_pmu *pmu = &vcpu->arch.pmu; > + bool overflow = !!kvm_pmu_overflow_status(vcpu); > + > + if (pmu->irq_level == overflow) > + return; > + > + pmu->irq_level = overflow; > + > + if (likely(irqchip_in_kernel(vcpu->kvm))) { > + int ret = kvm_vgic_inject_irq(vcpu->kvm, vcpu->vcpu_id, > + pmu->irq_num, overflow); > + WARN_ON(ret); > + } > +} > + > /** > * kvm_pmu_overflow_set - set PMU overflow interrupt > * @vcpu: The vcpu pointer > @@ -210,37 +227,18 @@ static u64 kvm_pmu_overflow_status(struct kvm_vcpu *vcpu) > */ > void kvm_pmu_overflow_set(struct kvm_vcpu *vcpu, u64 val) > { > - u64 reg; > - > if (val == 0) > return; > > vcpu_sys_reg(vcpu, PMOVSSET_EL0) |= val; > - reg = kvm_pmu_overflow_status(vcpu); > - if (reg != 0) > - kvm_vcpu_kick(vcpu); > + kvm_pmu_check_overflow(vcpu); > } > > static void kvm_pmu_update_state(struct kvm_vcpu *vcpu) > { > - struct kvm_pmu *pmu = &vcpu->arch.pmu; > - bool overflow; > - > if (!kvm_arm_pmu_v3_ready(vcpu)) > return; > - > - overflow = !!kvm_pmu_overflow_status(vcpu); > - if (pmu->irq_level == overflow) > - return; > - > - pmu->irq_level = overflow; > - > - if (likely(irqchip_in_kernel(vcpu->kvm))) { > - int ret; > - ret = kvm_vgic_inject_irq(vcpu->kvm, vcpu->vcpu_id, > - pmu->irq_num, overflow); > - WARN_ON(ret); > - } > + kvm_pmu_check_overflow(vcpu); > } > > bool kvm_pmu_should_notify_user(struct kvm_vcpu *vcpu) > -- > 2.9.3 >