Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752209AbdGGHlw (ORCPT ); Fri, 7 Jul 2017 03:41:52 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36972 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751659AbdGGHlu (ORCPT ); Fri, 7 Jul 2017 03:41:50 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 26900C0587F2 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eric.auger@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 26900C0587F2 Subject: Re: [PATCH v2 5/8] KVM: arm/arm64: vgic: Handle mapped level sensitive SPIs To: Marc Zyngier , eric.auger.pro@gmail.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, alex.williamson@redhat.com, b.reynal@virtualopensystems.com, pbonzini@redhat.com, christoffer.dall@linaro.org References: <1497531160-29162-1-git-send-email-eric.auger@redhat.com> <1497531160-29162-6-git-send-email-eric.auger@redhat.com> Cc: drjones@redhat.com, wei@redhat.com From: Auger Eric Message-ID: <6a177b08-1871-c5b1-6ece-404017dfd23c@redhat.com> Date: Fri, 7 Jul 2017 09:41:42 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 07 Jul 2017 07:41:50 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3622 Lines: 109 Hi Marc, On 04/07/2017 14:15, Marc Zyngier wrote: > Hi Eric, > > On 15/06/17 13:52, Eric Auger wrote: >> Currently, the line level of unmapped level sensitive SPIs is >> toggled down by the maintenance IRQ handler/resamplefd mechanism. >> >> As mapped SPI completion is not trapped, we cannot rely on this >> mechanism and the line level needs to be observed at distributor >> level instead. >> >> This patch handles the physical IRQ case in vgic_validate_injection >> and get the line level of a mapped SPI at distributor level. >> >> Signed-off-by: Eric Auger >> >> --- >> >> v1 -> v2: >> - renamed is_unshared_mapped into is_mapped_spi >> - changes to kvm_vgic_map_phys_irq moved in the previous patch >> - make vgic_validate_injection more readable >> - reword the commit message >> --- >> virt/kvm/arm/vgic/vgic.c | 16 ++++++++++++++-- >> virt/kvm/arm/vgic/vgic.h | 7 ++++++- >> 2 files changed, 20 insertions(+), 3 deletions(-) >> >> diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c >> index 075f073..2e35ac7 100644 >> --- a/virt/kvm/arm/vgic/vgic.c >> +++ b/virt/kvm/arm/vgic/vgic.c >> @@ -139,6 +139,17 @@ void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq) >> kfree(irq); >> } >> >> +bool irq_line_level(struct vgic_irq *irq) >> +{ >> + bool line_level = irq->line_level; >> + >> + if (unlikely(is_mapped_spi(irq))) >> + WARN_ON(irq_get_irqchip_state(irq->host_irq, >> + IRQCHIP_STATE_PENDING, >> + &line_level)); >> + return line_level; >> +} >> + >> /** >> * kvm_vgic_target_oracle - compute the target vcpu for an irq >> * >> @@ -236,13 +247,14 @@ static void vgic_sort_ap_list(struct kvm_vcpu *vcpu) >> >> /* >> * Only valid injection if changing level for level-triggered IRQs or for a >> - * rising edge. >> + * rising edge. Injection of virtual interrupts associated to physical >> + * interrupts always is valid. >> */ >> static bool vgic_validate_injection(struct vgic_irq *irq, bool level) >> { >> switch (irq->config) { >> case VGIC_CONFIG_LEVEL: >> - return irq->line_level != level; >> + return (irq->line_level != level || unlikely(is_mapped_spi(irq))); >> case VGIC_CONFIG_EDGE: >> return level; >> } >> diff --git a/virt/kvm/arm/vgic/vgic.h b/virt/kvm/arm/vgic/vgic.h >> index bba7fa2..da254ae 100644 >> --- a/virt/kvm/arm/vgic/vgic.h >> +++ b/virt/kvm/arm/vgic/vgic.h >> @@ -96,14 +96,19 @@ >> /* we only support 64 kB translation table page size */ >> #define KVM_ITS_L1E_ADDR_MASK GENMASK_ULL(51, 16) >> >> +bool irq_line_level(struct vgic_irq *irq); >> + >> static inline bool irq_is_pending(struct vgic_irq *irq) >> { >> if (irq->config == VGIC_CONFIG_EDGE) >> return irq->pending_latch; >> else >> - return irq->pending_latch || irq->line_level; >> + return irq->pending_latch || irq_line_level(irq); > > I'm a bit concerned that an edge interrupt doesn't take the distributor > state into account here. Why is that so? Once an SPI is forwarded to a > guest, a large part of the edge vs level differences move into the HW, > and are not that different anymore from a SW PoV. As pointed out by Christoffer in https://lkml.org/lkml/2017/6/8/322, isn't it a bit risky in general to poke the physical state instead of the virtual state. For level sensitive, to me we don't really have many other alternatives. For edge, we are not obliged to. Don't we have situations, due to the lazy disable approach, where the physical IRQ hits, enters the genirq handler and the actual handler is not called, ie. the virtual IRQ is not injected? Thanks Eric > > Thanks, > > M. >