Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp2666686pxp; Mon, 7 Mar 2022 22:12:39 -0800 (PST) X-Google-Smtp-Source: ABdhPJy6e4u01LDVcStowkgZUHO+734f8QHIhHvjRockklWu1FbP4cp1Q1WWXgsukrYpj0Tb754H X-Received: by 2002:a17:906:3cb1:b0:6ce:2a97:5ade with SMTP id b17-20020a1709063cb100b006ce2a975ademr11580326ejh.728.1646719959124; Mon, 07 Mar 2022 22:12:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646719959; cv=none; d=google.com; s=arc-20160816; b=sWRFNw7yjrhhWsQdGhoZSxE2ZlNRGLgSV7H930osDb9K6WrjBmGjng2MIummZcPHVO bZg5AooutwrkgQFkZNHJg1EQ9uZ3IR25Up9pj+3xv5KPrTJ9s8B7X0vW8bi/lllTcJlM FqDfa40yluHqUTZAK6ygJTRyjhTOckMUSWO52GU2TSF5kVT6eKhkkgRqScikoCvlnLlq 1HE1W9CKV576b+u1GfJZqzkG3030zyRN6dE2+0KpvDBuDtCEUAMR9fmJP2rMqU1vNF3p fCApFLYP72zG8ByvmJkxaYWIp2I90oktCqVWohwvtGptlM/kpFgw8Hr2DYCxvL1gNxb3 6GAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=y+b4TS0H3h2O8sZCTzN2D9UaPGs3EM/0+8GUBFrog8g=; b=eGwGXs6EeheKk686U6yVHbTTe0DEsulMJY91GNZ9p9YSbF9ERbMEdSKmk/0V9z7ewv 3UG9RsWWztW1q7QyTGf6xt/bCGo+zOW9LGDUHLcIDlLsgjluOhc485DqSmve+KR/jQ6u skFVD8g8IuDB8ykn2Y6Fp4zqiSNBsx4xkhCzBohWYwpz3faPyEoKXUnwvRYVRgoQMwMc l4ppjJO0rLGsgPjuC+/i3WrnJ5MlfTDCORW6OK4t2W8YT7nUKlyTEuivmNojugNBY9Ep ugvXj5XPZMNZpRTKoUljTkS4BKj0ryU7NBC+bNTt1gcPMGjuSk2JSlwnwb2FBf0kmIAY 3sLA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="nNd7K/QR"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id dp22-20020a170906c15600b006db1ce8221esi4046512ejc.498.2022.03.07.22.12.16; Mon, 07 Mar 2022 22:12:39 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="nNd7K/QR"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240232AbiCGKSR (ORCPT + 99 others); Mon, 7 Mar 2022 05:18:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40112 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240475AbiCGKBD (ORCPT ); Mon, 7 Mar 2022 05:01:03 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1CDD29FE4; Mon, 7 Mar 2022 01:48:51 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id CD8E7B80F9F; Mon, 7 Mar 2022 09:48:49 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1658CC340F3; Mon, 7 Mar 2022 09:48:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1646646528; bh=pJlFBvjxuJ7foblMFzRm/Bg/OJGdmZY6qGEQYa19W1U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nNd7K/QR5u/qMkTUzMdbY3sqq+ikjewVWMgPI5ezctnSCpUMlp1xiYgfsWw+PrW5h ORXlO8t791+7CQOxgryd1Ie103sddUEYbZhyeqn3oMzODoLs+gXpCXWRy571aZLHvr HfiEHRkDEhHVA6+k18KXxoTNf42wFP7vMF0SB93g= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ricardo Koller , Marc Zyngier , Sasha Levin Subject: [PATCH 5.16 010/186] KVM: arm64: vgic: Read HW interrupt pending state from the HW Date: Mon, 7 Mar 2022 10:17:28 +0100 Message-Id: <20220307091654.384776840@linuxfoundation.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220307091654.092878898@linuxfoundation.org> References: <20220307091654.092878898@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Marc Zyngier [ Upstream commit 5bfa685e62e9ba93c303a9a8db646c7228b9b570 ] It appears that a read access to GIC[DR]_I[CS]PENDRn doesn't always result in the pending interrupts being accurately reported if they are mapped to a HW interrupt. This is particularily visible when acking the timer interrupt and reading the GICR_ISPENDR1 register immediately after, for example (the interrupt appears as not-pending while it really is...). This is because a HW interrupt has its 'active and pending state' kept in the *physical* distributor, and not in the virtual one, as mandated by the spec (this is what allows the direct deactivation). The virtual distributor only caries the pending and active *states* (note the plural, as these are two independent and non-overlapping states). Fix it by reading the HW state back, either from the timer itself or from the distributor if necessary. Reported-by: Ricardo Koller Tested-by: Ricardo Koller Reviewed-by: Ricardo Koller Signed-off-by: Marc Zyngier Link: https://lore.kernel.org/r/20220208123726.3604198-1-maz@kernel.org Signed-off-by: Sasha Levin --- arch/arm64/kvm/vgic/vgic-mmio.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/kvm/vgic/vgic-mmio.c b/arch/arm64/kvm/vgic/vgic-mmio.c index 48c6067fc5ecb..f972992682746 100644 --- a/arch/arm64/kvm/vgic/vgic-mmio.c +++ b/arch/arm64/kvm/vgic/vgic-mmio.c @@ -248,6 +248,8 @@ unsigned long vgic_mmio_read_pending(struct kvm_vcpu *vcpu, IRQCHIP_STATE_PENDING, &val); WARN_RATELIMIT(err, "IRQ %d", irq->host_irq); + } else if (vgic_irq_is_mapped_level(irq)) { + val = vgic_get_phys_line_level(irq); } else { val = irq_is_pending(irq); } -- 2.34.1