From patchwork Mon Jan 30 18:31:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 9545905 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 4F59760415 for ; Mon, 30 Jan 2017 18:33:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 467C427F82 for ; Mon, 30 Jan 2017 18:33:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3B33D2818B; Mon, 30 Jan 2017 18:33:24 +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=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id E07DC27F82 for ; Mon, 30 Jan 2017 18:33:23 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cYGjA-0007wn-R0; Mon, 30 Jan 2017 18:30:56 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cYGj8-0007so-V4 for xen-devel@lists.xenproject.org; Mon, 30 Jan 2017 18:30:55 +0000 Received: from [193.109.254.147] by server-7.bemta-6.messagelabs.com id 8E/75-29440-E568F885; Mon, 30 Jan 2017 18:30:54 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrGLMWRWlGSWpSXmKPExsVysyfVTTe2rT/ CYOEyfYvvWyYzOTB6HP5whSWAMYo1My8pvyKBNePOhGVMBedEK27v62ZvYNwl2MXIxSEksJlR YuWWC8wQznJGiSd3F7B2MXJysAnoSuy4+ZoZxBYRCJWY8/MRkM3BwSzgJfHlvTdIWFjAQqL59 VQWEJtFQFXi4YLNYK28AjYSvz/MZwKxJQTkJBrO3wcbwwkUn735N1hcSMBa4l/PcsYJjNwLGB lWMWoUpxaVpRbpGhnoJRVlpmeU5CZm5ugaGpjp5aYWFyemp+YkJhXrJefnbmIE+pcBCHYw/lo WcIhRkoNJSZS372NfhBBfUn5KZUZicUZ8UWlOavEhRhkODiUJXqnW/gghwaLU9NSKtMwcYKDB pCU4eJREeD+3AKV5iwsSc4sz0yFSpxgVpcR5f4AkBEASGaV5cG2w4L7EKCslzMsIdIgQT0FqU W5mCar8K0ZxDkYlYV4/kO08mXklcNNfAS1mAlrs/qoPZHFJIkJKqoGxma1lzqPz/i3blvDVrn Vs+Hjj+ET9uD1zOj4emiLbwlMvlzXv4b1d9Vl2Bk+m+fNMybhtqGbTck7bM1wqxXzXFv6sOat 5Dm7PV98jqV0z13/74bS0rLZ/IiaOVnIvgiuOsPSpMbw5+bIh9n0q0yTfgJ2LKo5rnPB+q+gu 8zqze5WMpHht2SQlluKMREMt5qLiRACYUjTWaQIAAA== X-Env-Sender: andre.przywara@arm.com X-Msg-Ref: server-16.tower-27.messagelabs.com!1485801053!84167490!1 X-Originating-IP: [217.140.101.70] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.1.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 51640 invoked from network); 30 Jan 2017 18:30:53 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-16.tower-27.messagelabs.com with SMTP; 30 Jan 2017 18:30:53 -0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 18CDC1595; Mon, 30 Jan 2017 10:30:53 -0800 (PST) Received: from e104803-lin.lan (unknown [10.1.207.46]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 38C7A3F24D; Mon, 30 Jan 2017 10:30:52 -0800 (PST) From: Andre Przywara To: Stefano Stabellini , Julien Grall Date: Mon, 30 Jan 2017 18:31:39 +0000 Message-Id: <20170130183153.28566-15-andre.przywara@arm.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20170130183153.28566-1-andre.przywara@arm.com> References: <20170130183153.28566-1-andre.przywara@arm.com> Cc: xen-devel@lists.xenproject.org, Vijay Kilari Subject: [Xen-devel] [PATCH 14/28] ARM: vGICv3: Handle disabled LPIs X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP If a guest disables an LPI, we do not forward this to the associated host LPI to avoid queueing commands to the host ITS command queue. So it may happen that an LPI fires nevertheless on the host. In this case we can bail out early, but have to save the pending state on the virtual side. Signed-off-by: Andre Przywara --- xen/arch/arm/gic-v3-lpi.c | 8 ++++++++ xen/arch/arm/vgic-v3.c | 12 ++++++++++++ xen/include/asm-arm/vgic.h | 6 ++++++ 3 files changed, 26 insertions(+) diff --git a/xen/arch/arm/gic-v3-lpi.c b/xen/arch/arm/gic-v3-lpi.c index d270053..ade8b69 100644 --- a/xen/arch/arm/gic-v3-lpi.c +++ b/xen/arch/arm/gic-v3-lpi.c @@ -124,6 +124,14 @@ void do_LPI(unsigned int lpi) put_domain(d); + /* + * We keep all host LPIs enabled, so check if it's disabled on the guest + * side and just record this LPI in the virtual pending table in this case. + * The guest picks it up once it gets enabled again. + */ + if ( !vgic_can_inject_lpi(vcpu, hlpi.virt_lpi) ) + return; + vgic_vcpu_inject_irq(vcpu, hlpi.virt_lpi); } diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index c6db2d7..de625bf 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -498,6 +498,18 @@ bool vgic_lpi_is_enabled(struct domain *d, uint32_t vlpi) return d->arch.vgic.proptable[vlpi - LPI_OFFSET] & LPI_PROP_ENABLED; } +bool vgic_can_inject_lpi(struct vcpu *vcpu, uint32_t vlpi) +{ + if ( vlpi >= vcpu->domain->arch.vgic.nr_lpis ) + return false; + + if ( vgic_lpi_is_enabled(vcpu->domain, vlpi) ) + return true; + + set_bit(vlpi - LPI_OFFSET, vcpu->arch.vgic.pendtable); + return false; +} + static int __vgic_v3_rdistr_rd_mmio_write(struct vcpu *v, mmio_info_t *info, uint32_t gicr_reg, register_t r) diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index a882fe8..e71b18b 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -323,6 +323,7 @@ int vgic_v3_init(struct domain *d, int *mmio_count); #ifdef CONFIG_HAS_GICV3 extern int vgic_lpi_get_priority(struct domain *d, uint32_t vlpi); extern bool vgic_lpi_is_enabled(struct domain *d, uint32_t vlpi); +extern bool vgic_can_inject_lpi(struct vcpu *v, uint32_t vlpi); #else static inline int vgic_lpi_get_priority(struct domain *d, uint32_t vlpi) { @@ -333,6 +334,11 @@ static inline bool vgic_lpi_is_enabled(struct domain *d, uint32_t vlpi) { return false; } + +static inline bool vgic_can_inject_lpi(struct vcpu *v, uint32_t vlpi) +{ + return false; +} #endif extern int domain_vgic_register(struct domain *d, int *mmio_count);