Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp448572ybl; Tue, 28 Jan 2020 06:09:45 -0800 (PST) X-Google-Smtp-Source: APXvYqwYhQA449Ib7Y7r0/C1IevALwXi0kjyLtTIbbxZHC/Q0zQydCN1GTD6HKBG77/Q42bs/GBq X-Received: by 2002:aca:d6d2:: with SMTP id n201mr2994248oig.112.1580220585153; Tue, 28 Jan 2020 06:09:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580220585; cv=none; d=google.com; s=arc-20160816; b=t98U6zxwKrl0F541sFR05p0hHyvwvug/c1MCAraEt2KBuZ7ubj9hc57a4EZAB/yZvO QzvPR2V4M5Jglk9JYigiaWBnuWyipXkoeYF1VNC3RzjSGi0KCs8f8zoFFatVfGw8Lwef lBkX2+qzdoPsBUmI3R6Cnh6Eh4JczrUwKFeRncIRrysT3w/6LHXiMR3RYrd6xye/SKcL PnAdXUEtXAByEPZEsrRy/6TqQoOrnJDbdJvWPMRyWkfrPtqpYg15EbjW27m2EbiOyRYC RrWqWB9aZyGF6mKoMv5W/2IUQx49bVzRSuTiRYNqBlRKBJP3NiqfZ3DQdiQ+IlL1PoPi Lnag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=bdqbGpOCRjkyMHqpzAY00kv7ZyS2/NUcFw4mWBUJqc4=; b=xExdE1mqAJHaWq8fL8R7lF2XonA1cyFcQOt7RDFl4IPMFBQG79EgHimnNjDhff5S1p AtONkk9gKDpstQftppfA8/ZOvpl6DrjKPhHyveuUgin+5l3+E9b/2eE6Y5bdnRtZaLhM K4za4XQqq/SACi27iCvZ4ramLNUC9LD2qXL4nh7OffLCA/zWv+U9d3vmOmZFQh5ZuCGk qZv/Xqg1a6+QzaXkQKsfZ5//qyxNjCMLuqdrmMWjOYz1pYcQAKCK1Jfpqix2WlHPnWx8 TsgJr2e8SKsGg7VN33stqaZdiVPcixscpaa3z+B8aXT6B/ImhwiXJNlqwB4GslJA/ofc iO9A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=BiwU0K+V; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t82si4712056oif.45.2020.01.28.06.09.21; Tue, 28 Jan 2020 06:09:45 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=BiwU0K+V; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728119AbgA1OEf (ORCPT + 99 others); Tue, 28 Jan 2020 09:04:35 -0500 Received: from mail.kernel.org ([198.145.29.99]:51754 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728087AbgA1OEa (ORCPT ); Tue, 28 Jan 2020 09:04:30 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 63BAB24694; Tue, 28 Jan 2020 14:04:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1580220269; bh=iPd/z60B6zp/AWzCXYB+uhw1cWKMiDj4+ysvjc7Ci74=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BiwU0K+VfEM2uThHJjNuAZTHuw0TeuCnSmTzToL9cmYSxEvH1M7DwgoLbMPyfviTQ 922HGDb5wmwd2b1UXA8GYctcZDfUZ5SFiCdAH5gsKcU8aKMuYJ60577AYYZ6kFXSc/ vjtBko880jYSLRUCSjn3G5t7yNp68uGVZ26X1G9w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Frederic Barrat , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Michael Ellerman Subject: [PATCH 5.4 047/104] powerpc/xive: Discard ESB load value when interrupt is invalid Date: Tue, 28 Jan 2020 15:00:08 +0100 Message-Id: <20200128135824.216683362@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200128135817.238524998@linuxfoundation.org> References: <20200128135817.238524998@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Frederic Barrat commit 17328f218fb760c9c6accc5b52494889243a6b98 upstream. A load on an ESB page returning all 1's means that the underlying device has invalidated the access to the PQ state of the interrupt through mmio. It may happen, for example when querying a PHB interrupt while the PHB is in an error state. In that case, we should consider the interrupt to be invalid when checking its state in the irq_get_irqchip_state() handler. Fixes: da15c03b047d ("powerpc/xive: Implement get_irqchip_state method for XIVE to fix shutdown race") Cc: stable@vger.kernel.org # v5.4+ Signed-off-by: Frederic Barrat [clg: wrote a commit log, introduced XIVE_ESB_INVALID ] Signed-off-by: Cédric Le Goater Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20200113130118.27969-1-clg@kaod.org Signed-off-by: Greg Kroah-Hartman --- arch/powerpc/include/asm/xive-regs.h | 1 + arch/powerpc/sysdev/xive/common.c | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) --- a/arch/powerpc/include/asm/xive-regs.h +++ b/arch/powerpc/include/asm/xive-regs.h @@ -39,6 +39,7 @@ #define XIVE_ESB_VAL_P 0x2 #define XIVE_ESB_VAL_Q 0x1 +#define XIVE_ESB_INVALID 0xFF /* * Thread Management (aka "TM") registers --- a/arch/powerpc/sysdev/xive/common.c +++ b/arch/powerpc/sysdev/xive/common.c @@ -972,12 +972,21 @@ static int xive_get_irqchip_state(struct enum irqchip_irq_state which, bool *state) { struct xive_irq_data *xd = irq_data_get_irq_handler_data(data); + u8 pq; switch (which) { case IRQCHIP_STATE_ACTIVE: - *state = !xd->stale_p && - (xd->saved_p || - !!(xive_esb_read(xd, XIVE_ESB_GET) & XIVE_ESB_VAL_P)); + pq = xive_esb_read(xd, XIVE_ESB_GET); + + /* + * The esb value being all 1's means we couldn't get + * the PQ state of the interrupt through mmio. It may + * happen, for example when querying a PHB interrupt + * while the PHB is in an error state. We consider the + * interrupt to be inactive in that case. + */ + *state = (pq != XIVE_ESB_INVALID) && !xd->stale_p && + (xd->saved_p || !!(pq & XIVE_ESB_VAL_P)); return 0; default: return -EINVAL;