From patchwork Thu Mar 16 11:20:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 9627931 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 1DACE6048C for ; Thu, 16 Mar 2017 11:20:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 118D2285B5 for ; Thu, 16 Mar 2017 11:20:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 067DB28628; Thu, 16 Mar 2017 11:20:43 +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 A54CB285B5 for ; Thu, 16 Mar 2017 11:20:42 +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 1coTR0-0007vK-8s; Thu, 16 Mar 2017 11:19:10 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1coTQy-0007hQ-8L for xen-devel@lists.xenproject.org; Thu, 16 Mar 2017 11:19:08 +0000 Received: from [193.109.254.147] by server-9.bemta-6.messagelabs.com id C2/B8-13095-CA47AC85; Thu, 16 Mar 2017 11:19:08 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrGLMWRWlGSWpSXmKPExsVysyfVTXdVyak Ig/9XZCy+b5nM5MDocfjDFZYAxijWzLyk/IoE1oy2rWUF50QrDryawdrAuEuwi5GLQ0hgM6NE w4Kn7BDOckaJNVNOsHYxcnKwCehK7Lj5mhnEFhEIlZjz8xGYzSxQKXHxw342EFtYwFri/7f3Y PUsAqoSW94vYwGxeQVsJFafOwZWLyEgJ9Fw/j6YzQkU7zi5B6xXCKj389HP7BMYuRcwMqxi1C hOLSpLLdI1MtNLKspMzyjJTczM0TU0MNPLTS0uTkxPzUlMKtZLzs/dxAj0LwMQ7GA8syDwEKM kB5OSKO/vL4cihPiS8lMqMxKLM+KLSnNSiw8xynBwKEnw/uM+HCEkWJSanlqRlpkDDDSYtAQH j5II70uQNG9xQWJucWY6ROoUo6KUOK8dD1BCACSRUZoH1wYL7kuMslLCvIxAhwjxFKQW5WaWo Mq/YhTnYFQS5mUDmcKTmVcCN/0V0GImoMXT+A6CLC5JREhJNTCKsna7ukgKat8o0UtXXlye0C 6me+vNo5jiR2J/7ba3/A2cOlfjJNfj80wJi9leMl9xvaf05vGCac4ia5vaD62+5+0UMPNVUO2 JFQft7WdeEzySd/b7q0zP4LyID5t2tCZvKvG5NUXs8yPvtQ+firDZWfupzvAR/sid81do8ntp Y86PLN/EnXcpsRRnJBpqMRcVJwIAw6wgw2kCAAA= X-Env-Sender: andre.przywara@arm.com X-Msg-Ref: server-8.tower-27.messagelabs.com!1489663146!81798639!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.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 19552 invoked from network); 16 Mar 2017 11:19:06 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-8.tower-27.messagelabs.com with SMTP; 16 Mar 2017 11:19:06 -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 BB1E113D5; Thu, 16 Mar 2017 04:19:05 -0700 (PDT) Received: from e104803-lin.lan (unknown [10.1.207.46]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B54A23F5C9; Thu, 16 Mar 2017 04:19:04 -0700 (PDT) From: Andre Przywara To: Stefano Stabellini , Julien Grall Date: Thu, 16 Mar 2017 11:20:16 +0000 Message-Id: <20170316112030.20419-14-andre.przywara@arm.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20170316112030.20419-1-andre.przywara@arm.com> References: <20170316112030.20419-1-andre.przywara@arm.com> Cc: xen-devel@lists.xenproject.org, Shanker Donthineni , Vijay Kilari Subject: [Xen-devel] [PATCH v2 13/27] 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 0579976..994698e 100644 --- a/xen/arch/arm/gic-v3-lpi.c +++ b/xen/arch/arm/gic-v3-lpi.c @@ -142,6 +142,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 f8bccfa..302702e 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);