From patchwork Mon Dec 4 20:05:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoffer Dall X-Patchwork-Id: 10091443 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 066266035E for ; Mon, 4 Dec 2017 20:07:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EC6E228AB2 for ; Mon, 4 Dec 2017 20:07:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E036A28F60; Mon, 4 Dec 2017 20:07:04 +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,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6CB0F28AB2 for ; Mon, 4 Dec 2017 20:07:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=J2vcOrb4rC8CGR2HJkVs3JiWeJUwkmFI46kpEGBBfNg=; b=gi+DG/1YLzmKOMhpszcomJrHgS 68enxLzf3Q1dowXkx2H0upz8dk8aL8DSWrKi4YHV8GrK6soPmOeZdGpI21IcJcAXN43l66pDE4xC3 KvbLHlsPS9MBiGSkRRMdRz78jsNoCDmIlzY+IbUghr3AKsYsjf2wflHavNnRAOOt4OXWVkSGrnBlw TVpNT4XKHCb5LWohZCWRRwXqyPSNz9S6XUVvC1dnXUl7IFv4S6c1z+Ol67DMsDYMVZlyAfBQ/5DQh z/Md7HlUISDhWj3HQirBnjN59Z0qdv6JmrjHoyXgyVqRkNVr9BJirA0cbYnkZZxUL/sEDy4Tvs6/5 zkzpyFuw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1eLx15-0003xb-C5; Mon, 04 Dec 2017 20:07:03 +0000 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1eLwzd-0002RD-Pm for linux-arm-kernel@lists.infradead.org; Mon, 04 Dec 2017 20:05:35 +0000 Received: by mail-wm0-x242.google.com with SMTP id 64so16445501wme.3 for ; Mon, 04 Dec 2017 12:05:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=christofferdall-dk.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZTTRBQ4EW5KX4vRw0MCmsatDV74bwFJnWH27O3yom+w=; b=FbpI+/TyA5gNBwCnSAYCSbFxJXLmNY06Ag7eCCEDAPBYtx9h0r6K6LWVgcpXScgfTn EBrpXL+6YNokMfdsfZbBn9wSSEtZPmF/MGpYAdYmrqp05rBYxlKVrxz9pVtXcKlq4TUe 45FLTmL4qVkXgTJI/AbsfZPpdiPYwvgFAGnTWhxXBvYlk1KSgv14c9ifmaU/Pju4o5x9 qLt//mkiRzVJj3mXF8n5li01JHct73aLC/1LM8BuJ817c32wG4aZP5FCEtd1DDZzqWZ/ ehkU1bo26LnkjCElHN6TM8FdnOuAJwzoqox6uu9GF/Lcbjb1BWCA+ElIxmLMgFClufEu ClUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=ZTTRBQ4EW5KX4vRw0MCmsatDV74bwFJnWH27O3yom+w=; b=r4jSkVdFTOWA4eAp9G1F82ENLnW3QauO+lPMaQhAnkf/h/+Cg8CEv5QoK1NLGQdYyC ykF91mZcLxiQMz0zX8+NZ5wfix2MBBS6E2Rm2cYED6/LAUPtRbQC+D7yfJz/YdbOn8TT dm/SyhT1SqIxHu9g5YEjk96sndC2ZsgatgoY6WhhXnqs2Lo6EwgAHnotUgJ+4g4R34ZD zV9MDyMwTsbQnFYfUhD4fDSZpz/3mb+LMwvrfB8tclbFp/2rUqWSXWrEjq1Tl7CSFDAp FJvAuHVbC3RFJ8Kuel1ABAeGHCGaa2b5AK0ZZCRGQjYuVQMD7BwxxO5mFzjoSyOkl9vx +pFg== X-Gm-Message-State: AJaThX4tz6Y5JYPsxqBXbYTBUhj214EqL8WM43FjGSKGK7B3U/X56H2N f4q5mv/nb4JonHGZV7AoZ8JM5g== X-Google-Smtp-Source: AGs4zMbKjBzZyk0UjZuD0baMISFLIJ7y1qgxZsOnyJIEB1bQLHYaD0plZWraSQj4u5n7paw9DBVrXA== X-Received: by 10.80.220.132 with SMTP id r4mr33167316edk.180.1512417912167; Mon, 04 Dec 2017 12:05:12 -0800 (PST) Received: from localhost.localdomain (x50d2404e.cust.hiper.dk. [80.210.64.78]) by smtp.gmail.com with ESMTPSA id 26sm8374578eds.67.2017.12.04.12.05.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 04 Dec 2017 12:05:11 -0800 (PST) From: Christoffer Dall To: kvmarm@lists.cs.columbia.edu Subject: [PATCH v6 3/8] KVM: arm/arm64: Don't cache the timer IRQ level Date: Mon, 4 Dec 2017 21:05:01 +0100 Message-Id: <20171204200506.3224-4-cdall@kernel.org> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20171204200506.3224-1-cdall@kernel.org> References: <20171204200506.3224-1-cdall@kernel.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171204_120534_075690_C53EDAF0 X-CRM114-Status: GOOD ( 18.42 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kvm@vger.kernel.org, Marc Zyngier , Andre Przywara , Eric Auger , linux-arm-kernel@lists.infradead.org, Christoffer Dall MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Christoffer Dall The timer was modeled after a strict idea of modelling an interrupt line level in software, meaning that only transitions in the level needed to be reported to the VGIC. This works well for the timer, because the arch timer code is in complete control of the device and can track the transitions of the line. However, as we are about to support using the HW bit in the VGIC not just for the timer, but also for VFIO which cannot track transitions of the interrupt line, we have to decide on an interface for level triggered mapped interrupts to the GIC, which both the timer and VFIO can use. VFIO only sees an asserting transition of the physical interrupt line, and tells the VGIC when that happens. That means that part of the interrupt flow is offloaded to the hardware. To use the same interface for VFIO devices and the timer, we therefore have to change the timer (we cannot change VFIO because it doesn't know the details of the device it is assigning to a VM). Luckily, changing the timer is simple, we just need to stop 'caching' the line level, but instead let the VGIC know the state of the timer every time there is a potential change in the line level, and when the line level should be asserted from the timer ISR. The VGIC can ignore extra notifications using its validate mechanism. Reviewed-by: Andre Przywara Signed-off-by: Christoffer Dall --- virt/kvm/arm/arch_timer.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c index 4151250ce8da..dd5aca05c500 100644 --- a/virt/kvm/arm/arch_timer.c +++ b/virt/kvm/arm/arch_timer.c @@ -99,11 +99,9 @@ static irqreturn_t kvm_arch_timer_handler(int irq, void *dev_id) } vtimer = vcpu_vtimer(vcpu); - if (!vtimer->irq.level) { - vtimer->cnt_ctl = read_sysreg_el0(cntv_ctl); - if (kvm_timer_irq_can_fire(vtimer)) - kvm_timer_update_irq(vcpu, true, vtimer); - } + vtimer->cnt_ctl = read_sysreg_el0(cntv_ctl); + if (kvm_timer_irq_can_fire(vtimer)) + kvm_timer_update_irq(vcpu, true, vtimer); if (unlikely(!irqchip_in_kernel(vcpu->kvm))) kvm_vtimer_update_mask_user(vcpu); @@ -324,12 +322,20 @@ static void kvm_timer_update_state(struct kvm_vcpu *vcpu) struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu; struct arch_timer_context *vtimer = vcpu_vtimer(vcpu); struct arch_timer_context *ptimer = vcpu_ptimer(vcpu); + bool level; if (unlikely(!timer->enabled)) return; - if (kvm_timer_should_fire(vtimer) != vtimer->irq.level) - kvm_timer_update_irq(vcpu, !vtimer->irq.level, vtimer); + /* + * The vtimer virtual interrupt is a 'mapped' interrupt, meaning part + * of its lifecycle is offloaded to the hardware, and we therefore may + * not have lowered the irq.level value before having to signal a new + * interrupt, but have to signal an interrupt every time the level is + * asserted. + */ + level = kvm_timer_should_fire(vtimer); + kvm_timer_update_irq(vcpu, level, vtimer); if (kvm_timer_should_fire(ptimer) != ptimer->irq.level) kvm_timer_update_irq(vcpu, !ptimer->irq.level, ptimer);