From patchwork Wed Dec 13 10:45:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoffer Dall X-Patchwork-Id: 10109685 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 2A36760327 for ; Wed, 13 Dec 2017 10:47:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1B83828E70 for ; Wed, 13 Dec 2017 10:47:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 105AA28F09; Wed, 13 Dec 2017 10:47:02 +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=ham 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 C263E28E74 for ; Wed, 13 Dec 2017 10:47:00 +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=v+tcbZ6LZ+8QvcWoYAJAGCGQwNwLe6KQIbpPozsaOfo=; b=gPVdC+5KiKEfApIZeuAWqk6s4p 5FaD6+WgUfZttwtC88+ncm3jc2F2TVs40hFgOKocPxIEdbNzCvXXOf9C8zVf1AicYc2ZLb467jqv4 co/G+GXxF5Ud+mt5pKOgdTIs49/AFa88ESQswzx68APNNYF6qjJUL6s6AX5NdTUF5uaTkkDuTIVj8 eYQQoxKeUfEdd8rM+B9jfeGAqSrf7BMoxd2dr+wHPoiB3Cos/rf8fTKjLowznEZOu2H1lx5BWCBxy zI5KyoXhcQEsTr++ysOaSTYk1G1wnokfnPbivL0fvvskX266aN6mYvQBQfPp6CTIZ03K6GJ4ETBJV HaJilpog==; 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 1eP4Z2-0000qS-7W; Wed, 13 Dec 2017 10:47:00 +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 1eP4Yy-0000nE-7v for linux-arm-kernel@lists.infradead.org; Wed, 13 Dec 2017 10:46:58 +0000 Received: by mail-wm0-x242.google.com with SMTP id f206so4085374wmf.5 for ; Wed, 13 Dec 2017 02:46:40 -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=f4/+CGNKF2zJ9jFBrM9M5rkwuvsY9KHB4qpHEQ2CX10=; b=ei1yHDCL+AYxnj1JDfUYHzOQSei68G6FQ9MSGKGKgo7k6rTcvqK6jzg/vdmxr2iErx 2rf+6VP36n9Gl7mQDHYfnJF5iXCOVre5sDobw0HcWmuaZVxYU/r3gjUgoVqcT+RAlcUO F0q6LvjogLq0Q6n1bnKWG0IhVMh/tWkNcmn7E= 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=f4/+CGNKF2zJ9jFBrM9M5rkwuvsY9KHB4qpHEQ2CX10=; b=sRKXQjRh5/2gMlnCBBQk6RFLu9YpW5Y+p8iiBjYbHif/ih6q6Fwfw/d72T+htfloKH liC/Z7mLRbfwrsAqlf381pEYh0gMg9tRJ5kgYat9SuxftqgfxOgtUM48Y92jBIvX4DXf P2PFp+e0XGRJTuG2fhyrBhTf2F1HmYUfSYlKHvJZiyMhTKhoqdNsIKIq1XeKc+wa/Jm5 JiZJ2GIwpg7Zf4b2lllJAKivBFZMPQHkhpKtkwdXJ3aB1+j77179EuDgNf4+/JV6JFed rPLvLeOwBFCa/3YAGTQaotIfbGCqxG6XCTpJzEsde0phn4irrINBdpWqu4hcOZhtR8a9 UFGA== X-Gm-Message-State: AKGB3mJfN1e41w0pf1b69NiPLzB3KOU7njAPhnIke7mykyugsnFJ0zcE C84Z7TilvC1uSIS4JFd5ECs2TA== X-Google-Smtp-Source: ACJfBoubELPdMMswxrXVZWR2ruthSOO8tVDTRRXGYtNa8P9kHMBbHPfuL3CfTBMFoxwAlheXZWu8Ug== X-Received: by 10.80.225.204 with SMTP id m12mr7087085edl.216.1513161999234; Wed, 13 Dec 2017 02:46:39 -0800 (PST) Received: from localhost.localdomain (x50d2404e.cust.hiper.dk. [80.210.64.78]) by smtp.gmail.com with ESMTPSA id d92sm1079682edd.21.2017.12.13.02.46.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 13 Dec 2017 02:46:38 -0800 (PST) From: Christoffer Dall To: kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org Subject: [PATCH v8 3/9] KVM: arm/arm64: Don't cache the timer IRQ level Date: Wed, 13 Dec 2017 11:45:56 +0100 Message-Id: <20171213104602.16383-4-christoffer.dall@linaro.org> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20171213104602.16383-1-christoffer.dall@linaro.org> References: <20171213104602.16383-1-christoffer.dall@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171213_024656_443183_0355744C X-CRM114-Status: GOOD ( 18.69 ) 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: Marc Zyngier , Andre Przywara , Christoffer Dall , kvm@vger.kernel.org, Eric Auger 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 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 Reviewed-by: Marc Zyngier Reviewed-by: Julien Thierry --- 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);