From patchwork Wed Jan 24 18:10:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 125691 Delivered-To: patch@linaro.org Received: by 10.46.66.141 with SMTP id h13csp580968ljf; Wed, 24 Jan 2018 10:13:35 -0800 (PST) X-Google-Smtp-Source: AH8x226iYjp2YlqPAk0ylRparMyae6zFLQd1q9lTBrdYtpNeobjH0GuPCMcLXFMI2jtG/lI1NC3V X-Received: by 10.107.158.211 with SMTP id h202mr9283024ioe.129.1516817615335; Wed, 24 Jan 2018 10:13:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516817615; cv=none; d=google.com; s=arc-20160816; b=rR2z8efvIFChu18qQRqyAPJ+fBqLaZz/0fD6fnFM8/XZsIr9tmj2+sMnfuN1hukWwM v1X2J8dbDhbGvEyWhY1mTmBcyMkIfFhcGRO7hg+8FEED4+Ze++9sKOLPZX+VgbDLaAuf wzDU54Pan099SERaMeQr67dm4n5n5EWo/c1gFPFKv5xF58nViQ7z7mFTE96oWdOV9qGJ tT+4nQqNFxVWm0ZJrLKjBsz9k50jtgWdkMEocnCRBZxne42v7K8MNa6AuJlshgmsBuKI hb1QkL+s9dOxnu4IyPyEAR1s42PMv3dO/9NUKRcqVMlZrKYcMeZ/HjGmvRLY+wmPs1v8 PB6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:cc:references:in-reply-to:message-id:date:to :from:dkim-signature:arc-authentication-results; bh=y5ktjJOtWPYWWuE5kkDxIRcwaIzR764pgG3fZeHlgKg=; b=ZFYJ3SOlBmnK6sq0tBCXjQpaCRJ1628uA/N7q6Abc28Uy7oJG2SVMDGXG4QTCZ7t+U DmzzcWt3r/MNEAktjwzP7cHk8sJsMONWnvaVLwZF+fN31r9g2TPgFsFXNzp4Gj4msvF6 agwY0McQDgMSErRBkI6PvwghuxaVZM9C5GIL1ct9sSnxtEDgXVInURHrd901OXanc8sl QnQSKED9tjNi6QFqdifrT8tAfx8vIN+brE44n5XcB5xphECU8Tsz8w83W/q3GiBxoE5C Qm5XsCW88zcMPihrh+b8tdoJQydoUrIv6zD7W5CiZy9HTd8DIMIx8s0is+jNmSrb5RR1 uGkw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=ObyiaqhW; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id o197si614324itb.90.2018.01.24.10.13.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Jan 2018 10:13:35 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=ObyiaqhW; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eePVm-00078J-FI; Wed, 24 Jan 2018 18:11:02 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eePVl-00077q-BE for xen-devel@lists.xenproject.org; Wed, 24 Jan 2018 18:11:01 +0000 X-Inumbo-ID: eae8dc5b-0131-11e8-ba59-bc764e045a96 Received: from mail-wr0-x241.google.com (unknown [2a00:1450:400c:c0c::241]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id eae8dc5b-0131-11e8-ba59-bc764e045a96; Wed, 24 Jan 2018 19:10:54 +0100 (CET) Received: by mail-wr0-x241.google.com with SMTP id d9so4999314wre.3 for ; Wed, 24 Jan 2018 10:10:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=y2XBjnEYIfuZ5jl1LOVuPCnbzrc4ymsXrUWOdhKwxEc=; b=ObyiaqhW0AXnR6xkAfqRLmHy2qenkiL5d882RQwLBuNqEJTJQvcARg8FhY4dZ61Iu/ Ixpj0rfn4DVnZZdroJxxd2F3eGGpfZPmOFxpyGlVM9H5yIpgP1/I+/+Y2qVQd6SGn953 eGwWPWtrVzxrQcmqXmHXGPaCOS7EVzB2Z6tPY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=y2XBjnEYIfuZ5jl1LOVuPCnbzrc4ymsXrUWOdhKwxEc=; b=HNYDvd7ca29sIwB08aOpwK1cKJ4vVfXfGmpSrgWji5INJT69iaTWN0VNKEDakSt/ch tO2s624QcGx05atnzjdW+9+ypOiuY+4Yc6kbwvcXtZ1QFdjoeRu0xZYgVZdlGFIAlu8p StXqLBUrFg0UQ6wKAot6+fmk+mjBEr3j5Ss94ovUKOodT0PeTte4iJJ+qVqXXjDJ+Qjb hIhaX1QRmlGLp0dUqaJPfhXvGJhzbgsL4/XhsneEw4TsRQTCovuBX5Ck4NZyyRSYwKOz 6pt+YhR8o5o7ibYGmp4cdLzDFzXY4uL6PeFgH9Tzu1gcbO8xpc9V0rqsBEaBfPN5FeTR gX9Q== X-Gm-Message-State: AKwxytdBdpGv2IdWpkhE0mWTXmsTZi4Dct45yEUrx7/pTyTg9/bCz1Qi hTKrKUWMFTf7v4mRItIJWdJzJQ== X-Received: by 10.223.148.162 with SMTP id 31mr6847848wrr.232.1516817457515; Wed, 24 Jan 2018 10:10:57 -0800 (PST) Received: from e104803-lin.lan (mail.andrep.de. [217.160.17.100]) by smtp.gmail.com with ESMTPSA id r68sm899379wmd.47.2018.01.24.10.10.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 24 Jan 2018 10:10:57 -0800 (PST) From: Andre Przywara To: Julien Grall , Stefano Stabellini Date: Wed, 24 Jan 2018 18:10:54 +0000 Message-Id: <20180124181058.6157-5-andre.przywara@linaro.org> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180124181058.6157-1-andre.przywara@linaro.org> References: <20180124181058.6157-1-andre.przywara@linaro.org> Cc: xen-devel@lists.xenproject.org Subject: [Xen-devel] [PATCH v3 4/8] ARM: VGIC: rework events_need_delivery() X-BeenThere: xen-devel@lists.xenproject.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.xenproject.org Sender: "Xen-devel" In event.h we very deeply dive into the VGIC to learn if an event for a guest is pending. Rework that function to abstract the VGIC specific part out. Also reorder the queries there, as we only actually need to check for the event channel if there are no other pending IRQs. Signed-off-by: Andre Przywara Reviewed-by: Stefano Stabellini --- xen/arch/arm/vgic.c | 11 +++++++++++ xen/include/asm-arm/event.h | 13 +++---------- xen/include/asm-arm/vgic.h | 2 ++ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 6e933a86d3..9921769b15 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -593,6 +593,17 @@ void arch_evtchn_inject(struct vcpu *v) vgic_vcpu_inject_irq(v, v->domain->arch.evtchn_irq); } +bool vgic_evtchn_irq_pending(struct vcpu *v) +{ + struct pending_irq *p; + + p = irq_to_pending(v, v->domain->arch.evtchn_irq); + /* Does not work for LPIs. */ + ASSERT(!is_lpi(v->domain->arch.evtchn_irq)); + + return list_empty(&p->inflight); +} + bool vgic_emulate(struct cpu_user_regs *regs, union hsr hsr) { struct vcpu *v = current; diff --git a/xen/include/asm-arm/event.h b/xen/include/asm-arm/event.h index caefa506a9..67684e9763 100644 --- a/xen/include/asm-arm/event.h +++ b/xen/include/asm-arm/event.h @@ -16,12 +16,6 @@ static inline int vcpu_event_delivery_is_enabled(struct vcpu *v) static inline int local_events_need_delivery_nomask(void) { - struct pending_irq *p = irq_to_pending(current, - current->domain->arch.evtchn_irq); - - /* Does not work for LPIs. */ - ASSERT(!is_lpi(current->domain->arch.evtchn_irq)); - /* XXX: if the first interrupt has already been delivered, we should * check whether any other interrupts with priority higher than the * one in GICV_IAR are in the lr_pending queue or in the LR @@ -33,11 +27,10 @@ static inline int local_events_need_delivery_nomask(void) if ( gic_events_need_delivery() ) return 1; - if ( vcpu_info(current, evtchn_upcall_pending) && - list_empty(&p->inflight) ) - return 1; + if ( !vcpu_info(current, evtchn_upcall_pending) ) + return 0; - return 0; + return vgic_evtchn_irq_pending(current); } static inline int local_events_need_delivery(void) diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index 2a93a7bef9..22c8502c95 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -218,6 +218,8 @@ extern void register_vgic_ops(struct domain *d, const struct vgic_ops *ops); int vgic_v2_init(struct domain *d, int *mmio_count); int vgic_v3_init(struct domain *d, int *mmio_count); +bool vgic_evtchn_irq_pending(struct vcpu *v); + extern int domain_vgic_register(struct domain *d, int *mmio_count); extern int vcpu_vgic_free(struct vcpu *v); extern bool vgic_to_sgi(struct vcpu *v, register_t sgir,