From patchwork Mon Sep 4 10:24:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoffer Dall X-Patchwork-Id: 9936973 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 7FDE160237 for ; Mon, 4 Sep 2017 10:27:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E763287B8 for ; Mon, 4 Sep 2017 10:27:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 61E0E287BA; Mon, 4 Sep 2017 10:27:28 +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 0EBA5287B8 for ; Mon, 4 Sep 2017 10:27:28 +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=EGzSAXupjSmNZBmzZkaMYxYKul8dtlv2cOZpTyfWGWk=; b=K3z2MTOAeYUc6Exhp8JNOugsOu FV3RYszzDd0xFfUGkWpTBoVGt9lrogBrY1KQBIVAneqg5sjuu93p/GgQ7RVwgJ5niXY3kPbFJlvkJ aqaW39Gi39ZPZwft+oCc/VHX+dTjYQ0DQmN0CUPPB45/14BeTrUSX2Oa2ATStCb58VVqNmUF3HKen Nu71PotN1y5OO1Kg+kjxo8NstbZZo0B/N2zROzJ3FDxzXOqhMk5VCEkXRXhYpaRX3cxxwNXK9KBVR 4RHdDsHodai3WzczsxLl1enlAsaE2CslZSZl4+87iAhvlcjH5O/2ffPqwrc2++JvEqphbtvmH6ldD Ot64ihsw==; 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 1doobD-0003vC-2m; Mon, 04 Sep 2017 10:27:23 +0000 Received: from mail-wm0-x230.google.com ([2a00:1450:400c:c09::230]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dooZS-0001nF-PR for linux-arm-kernel@lists.infradead.org; Mon, 04 Sep 2017 10:25:45 +0000 Received: by mail-wm0-x230.google.com with SMTP id v2so2226285wmf.0 for ; Mon, 04 Sep 2017 03:25:08 -0700 (PDT) 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=lqafpuMGG1uLdP0yI1kXtklV1aWB62cc8H7kMTyoVHg=; b=KiKM+vtxa3xcVPR/Srm1Zw2/ptB8/ioTLdOVMhCURYoTz5qj86vCJA32Xr+lIzq2Ry 7iXB4w92J1ojBeTXiPMEj/t1I1lKPemwjMZWs3RlOlA+BpAyfa5IyYjUWhUmMHFlJHiq 1kTxpiO+Y1PL5MkeQGcDAHG/VWT/mq+hNjBtg= 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=lqafpuMGG1uLdP0yI1kXtklV1aWB62cc8H7kMTyoVHg=; b=jDzvtsLXbo/oVomQlv0MdVQqKiNGyxpmkM4b7tO0r8rz2fZjMqtJ4xq677ZpxdXCAu DZQTs+8PUo7iuQvqbKuklbx2aU6iN8rxdvKdsTBvvZFH41YSD3+SchGNiZHjgKOghNcq NFRJ7dtNOTuTKhC5Ouc42wIk5MbtdlMR4i3VbBPlf09VUTW3ARldcBi52Qm0ht1km0Bt KgUZM2pO4Vl+CNwRjkTj23EIvesLNNT1YA24/8YeJznTl5jrfrw274/ianze5qU6eNNb WO30tGupk/46ua+t9f0SwIaruINOcyrp1sRB3JJSAcppkjKYHm4xV1zz4mJyZaQz7ac2 PyzQ== X-Gm-Message-State: AHPjjUggRYzCH3hP2MXU/KO8dFg7GICd2Y+ovAPoKtwo63ZEYEAgcAQI mXDuERmmGgj09eRx X-Google-Smtp-Source: ADKCNb6JW196HOtk39lrxvzhrH1LDB3qTHWKQU2zZG53elBfD9rJ0FIuDY4T0zJ+7qcaSJl2rlkruw== X-Received: by 10.80.183.5 with SMTP id g5mr108160ede.121.1504520706672; Mon, 04 Sep 2017 03:25:06 -0700 (PDT) Received: from localhost.localdomain (xd93ddc2d.cust.hiper.dk. [217.61.220.45]) by smtp.gmail.com with ESMTPSA id h64sm3406924edc.67.2017.09.04.03.25.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 04 Sep 2017 03:25:06 -0700 (PDT) From: Christoffer Dall To: kvmarm@lists.cs.columbia.edu, Eric Auger , Marc Zyngier Subject: [PATCH v2 1/6] KVM: arm/arm64: Don't cache the timer IRQ level Date: Mon, 4 Sep 2017 12:24:51 +0200 Message-Id: <20170904102456.9025-2-cdall@linaro.org> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20170904102456.9025-1-cdall@linaro.org> References: <20170904102456.9025-1-cdall@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170904_032535_161230_144CC64E X-CRM114-Status: GOOD ( 15.94 ) 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: Andre Przywara , kvm@vger.kernel.org, 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 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 on every entry to the guest, and the VGIC can ignore notifications using its validate mechanism. Signed-off-by: Christoffer Dall --- virt/kvm/arm/arch_timer.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c index 8e89d63..2a5f877 100644 --- a/virt/kvm/arm/arch_timer.c +++ b/virt/kvm/arm/arch_timer.c @@ -219,9 +219,10 @@ static void kvm_timer_update_irq(struct kvm_vcpu *vcpu, bool new_level, int ret; timer_ctx->active_cleared_last = false; + if (timer_ctx->irq.level != new_level) + trace_kvm_timer_update_irq(vcpu->vcpu_id, timer_ctx->irq.irq, + new_level); timer_ctx->irq.level = new_level; - trace_kvm_timer_update_irq(vcpu->vcpu_id, timer_ctx->irq.irq, - timer_ctx->irq.level); if (likely(irqchip_in_kernel(vcpu->kvm))) { ret = kvm_vgic_inject_irq(vcpu->kvm, vcpu->vcpu_id, @@ -241,6 +242,7 @@ 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 userspace modified the timer registers via SET_ONE_REG before @@ -251,11 +253,11 @@ static void kvm_timer_update_state(struct kvm_vcpu *vcpu) if (unlikely(!timer->enabled)) return; - if (kvm_timer_should_fire(vtimer) != vtimer->irq.level) - kvm_timer_update_irq(vcpu, !vtimer->irq.level, vtimer); + 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); + level = kvm_timer_should_fire(ptimer); + kvm_timer_update_irq(vcpu, level, ptimer); } /* Schedule the background timer for the emulated timer. */