From patchwork Thu Apr 6 19:04:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoffer Dall X-Patchwork-Id: 9668103 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 89CBE602B3 for ; Thu, 6 Apr 2017 19:04:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 64CE7285C4 for ; Thu, 6 Apr 2017 19:04:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 58175285D4; Thu, 6 Apr 2017 19:04:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BE505285C4 for ; Thu, 6 Apr 2017 19:04:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752682AbdDFTER (ORCPT ); Thu, 6 Apr 2017 15:04:17 -0400 Received: from mail-wr0-f177.google.com ([209.85.128.177]:36009 "EHLO mail-wr0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752194AbdDFTEQ (ORCPT ); Thu, 6 Apr 2017 15:04:16 -0400 Received: by mail-wr0-f177.google.com with SMTP id c55so3115294wrc.3 for ; Thu, 06 Apr 2017 12:04:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=EhkjXLTHV2qq5vL/62b1e0HX31XKKdELxKSLivTxv8M=; b=PcmFhSbRQ5A6LhaKz7UHDkTyCCO6eSsdtqMH0n4foeVl86min6aeB1Oton1kl97VVM TVT0B5x1KbsqOurAljupIGeYYhG9Y97RcO5fhDNxlWfrhDW0yrmGCk9v2hnfk0VOCaXQ t+AHfQSy8aYoJkg7p8BwX3VTrZ+vlZmItJX0w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=EhkjXLTHV2qq5vL/62b1e0HX31XKKdELxKSLivTxv8M=; b=AM+ZRx1AOGYaIyjGukYfArwTPMzqxfVa+VD9YggNNlu0mDMkX+LmPML5TFYqsFhvAW 7Ek32FTIBPsaiusNUzWc/pKVsl+O2vXHihHA7c5cA9rm4hCyP2q6k9Fa1aLhwq/+FpxJ sa6NM0AThehbdsMFwFD5jQ9hZn8o+SRTxtYF+9cNPSPKweOegDfn7reLFMWCvecF6Z9J HSuYDC/gtUmMKwUx16BVRvZiBWYHVrFLqVb3lVv0Yr5urux/Z7EeJRYL5ircWiPjNwBa rfuvKxCAIYc0xoSLWm7sFyb5kMCFCpRWWswJ3YQYza6fhcJL8bT6C/48sZ1d/bYRTEjU z3Mg== X-Gm-Message-State: AN3rC/4Y9i+tOFITB94uReEenIeB8i7AsJVzd50Mou6d8hAiITbcCumz 7/dtWE/ksBQmqz8J X-Received: by 10.28.213.198 with SMTP id m189mr6614830wmg.102.1491505452847; Thu, 06 Apr 2017 12:04:12 -0700 (PDT) Received: from localhost (xd93ddc2d.cust.hiper.dk. [217.61.220.45]) by smtp.gmail.com with ESMTPSA id c18sm3131237wre.48.2017.04.06.12.04.11 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Thu, 06 Apr 2017 12:04:11 -0700 (PDT) Date: Thu, 6 Apr 2017 21:04:13 +0200 From: Christoffer Dall To: Marc Zyngier Cc: kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org, Alexander Graf , Peter Maydell , Pekka Enberg , Christoffer Dall Subject: Re: [PATCH v3 4/5] KVM: arm/arm64: Report PMU overflow interrupts to userspace irqchip Message-ID: <20170406190413.GH27123@cbox> References: <20170405092815.22503-1-cdall@linaro.org> <20170405092815.22503-5-cdall@linaro.org> <6c476719-8fb3-27b6-c7f6-84088443dcd4@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <6c476719-8fb3-27b6-c7f6-84088443dcd4@arm.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On Thu, Apr 06, 2017 at 06:12:10PM +0100, Marc Zyngier wrote: > On 05/04/17 10:28, Christoffer Dall wrote: > > From: Christoffer Dall > > > > When not using an in-kernel VGIC, but instead emulating an interrupt > > controller in userspace, we should report the PMU overflow status to > > that userspace interrupt controller using the KVM_CAP_ARM_USER_IRQ > > feature. > > > > Signed-off-by: Christoffer Dall > > --- > > arch/arm/kvm/arm.c | 9 ++++++--- > > include/kvm/arm_pmu.h | 7 +++++++ > > virt/kvm/arm/pmu.c | 42 ++++++++++++++++++++++++++++++++++++++---- > > 3 files changed, 51 insertions(+), 7 deletions(-) > > > > diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c > > index efb16e5..f935383 100644 > > --- a/arch/arm/kvm/arm.c > > +++ b/arch/arm/kvm/arm.c > > @@ -635,11 +635,13 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) > > > > /* > > * If we have a singal pending, or need to notify a userspace > > - * irqchip about timer level changes, then we exit (and update > > - * the timer level state in kvm_timer_update_run below). > > + * irqchip about timer or PMU level changes, then we exit (and > > + * update the timer level state in kvm_timer_update_run > > + * below). > > */ > > if (signal_pending(current) || > > - kvm_timer_should_notify_user(vcpu)) { > > + kvm_timer_should_notify_user(vcpu) || > > + kvm_pmu_should_notify_user(vcpu)) { > > ret = -EINTR; > > run->exit_reason = KVM_EXIT_INTR; > > } > > @@ -713,6 +715,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) > > > > /* Tell userspace about in-kernel device output levels */ > > kvm_timer_update_run(vcpu); > > + kvm_pmu_update_run(vcpu); > > Very minor nit: as we now have a couple of functions that are going to > check the same thing (irqchip_in_kernel), we could consider moving the > test here. I don't have strong feelings about it though. I like it: Thanks, -Christoffer diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index f935383..4263785 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -714,8 +714,10 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) } /* Tell userspace about in-kernel device output levels */ - kvm_timer_update_run(vcpu); - kvm_pmu_update_run(vcpu); + if (unlikely(!irqchip_in_kernel(vcpu->kvm))) { + kvm_timer_update_run(vcpu); + kvm_pmu_update_run(vcpu); + } if (vcpu->sigset_active) sigprocmask(SIG_SETMASK, &sigsaved, NULL); diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c index 5dc2167..5976609 100644 --- a/virt/kvm/arm/arch_timer.c +++ b/virt/kvm/arm/arch_timer.c @@ -193,9 +193,6 @@ void kvm_timer_update_run(struct kvm_vcpu *vcpu) struct arch_timer_context *ptimer = vcpu_ptimer(vcpu); struct kvm_sync_regs *regs = &vcpu->run->s.regs; - if (likely(irqchip_in_kernel(vcpu->kvm))) - return; - /* Populate the device bitmap with the timer states */ regs->device_irq_level &= ~(KVM_ARM_DEV_EL1_VTIMER | KVM_ARM_DEV_EL1_PTIMER); diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c index 51218be..4b43e7f 100644 --- a/virt/kvm/arm/pmu.c +++ b/virt/kvm/arm/pmu.c @@ -262,9 +262,6 @@ void kvm_pmu_update_run(struct kvm_vcpu *vcpu) { struct kvm_sync_regs *regs = &vcpu->run->s.regs; - if (likely(irqchip_in_kernel(vcpu->kvm))) - return; - /* Populate the timer bitmap for user space */ regs->device_irq_level &= ~KVM_ARM_DEV_PMU; if (vcpu->arch.pmu.irq_level)