Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp2916492pxb; Tue, 24 Aug 2021 10:31:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKsn163lBjoIpWaU4LRQTR/1nOi7UAQ67Y0CDxIK6BJAJbJo7C9D8I4fgNF0uKH/3Ogiu/ X-Received: by 2002:a05:6e02:805:: with SMTP id u5mr26714508ilm.223.1629826304507; Tue, 24 Aug 2021 10:31:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629826304; cv=none; d=google.com; s=arc-20160816; b=mSNtrPQRtHRMqKsEoauIG35oyIqOk0N/sIW7v+RQPw63CyUs++YEwHx5Evs8+3QzGT kZ1mY5B16MDGL6Q2ex9fUfw4BD6y/lWsqhuVRFHjjsyxYR7F/OvXl1+VuzePAA4VHEDc 5Pm05c1mCBrs1tU6RcUf/FNkqIEbssnvsqZ6nGCE9vJPg9bFlOpQ7gKgSFojQK/0CC/b r9wrsPnBFehMnjJ+zAtV6c42Wf+6jXwE1/wLnHE4GyDIuOifqtYXkEIXf2MsYsqsxyyR 9sfqtRjM7MvhIfBDhr2QJK1Y8OxOUJLIfsYDtRfWsByGbbK1WQv1804CXcBK+Nt4qABa KOOg== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=E1kaH5ERgwavrzk83uoa2dvx5bxD+9n2y84f5fDX500=; b=isyRn7v8PIZZbCaz5RsKG2OzHC60MgO7CvZwABdaT1cleXjdI8FFva6Wa1qZHGs0gU HIksqUFZJoMEMAsVewQm3CGPttCxBAtg1hFlnpQtgJXFJsO1v/ofQKoSJu4ZTqxkQYDB bn4N+KsGgJw4ZcNUn6WII8nobABmKTj/HG5sB7fwv1tYww5gnzbjtkqzGjNGNRwSQJtR hJSo+eDJ5abytHTS+D7KmL20MA7nkVL4ioIhbFUjjgszzMgHJcOvT5ffqckJqXcNzlQL fDnMZasDSRpxrzjtMsafu039WkQtcwQXh9gY06eCwfD6efKuoiosGWHw6FrCKID4vmf6 G9gQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=JHq5sq6j; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j14si19162818iok.53.2021.08.24.10.31.32; Tue, 24 Aug 2021 10:31:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=JHq5sq6j; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240729AbhHXRb0 (ORCPT + 99 others); Tue, 24 Aug 2021 13:31:26 -0400 Received: from mail.kernel.org ([198.145.29.99]:35803 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233517AbhHXR3D (ORCPT ); Tue, 24 Aug 2021 13:29:03 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 18C5261B6F; Tue, 24 Aug 2021 17:05:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1629824724; bh=lwB07amvDPHQkiF+WgMNg0OjpyQerKQKetQHC/nwZ88=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JHq5sq6jOcqgTJgnJJwJ+kGaEAnwAslPpjxw+0jmEL5lLkBQH7znONd2NMmNUgwUZ yk6vKMyneWRgcVCkiAKPcUmsRxBYLzSb9+d+9SixL9n6tCwIwIhwY5SPdto2pcB9qK 0EzOGnnU6uos2bgQTOvzFYZ650D7RV76crH5j7i0ziloUNy+zjWQnorwzR+YuGxTuS 0z2xqjC0mDBCU5q/KLJPp1ld0b52JdpDAvB2AJIVgi844GvogEd1NUmTMInX3lIxmE 6yKdOy0qBBqIRwkz0mM4TtD5doaU1roMJRihCQjyMEIX5aLCVqYvnyBoDaesChrBh8 UGk2NdaSHj0RA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Thomas Gleixner , Kevin Tian , Marc Zyngier , Bjorn Helgaas , Greg Kroah-Hartman Subject: [PATCH 4.14 27/64] PCI/MSI: Enforce that MSI-X table entry is masked for update Date: Tue, 24 Aug 2021 13:04:20 -0400 Message-Id: <20210824170457.710623-28-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210824170457.710623-1-sashal@kernel.org> References: <20210824170457.710623-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.14.245-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-4.14.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 4.14.245-rc1 X-KernelTest-Deadline: 2021-08-26T17:04+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Thomas Gleixner commit da181dc974ad667579baece33c2c8d2d1e4558d5 upstream. The specification (PCIe r5.0, sec 6.1.4.5) states: For MSI-X, a function is permitted to cache Address and Data values from unmasked MSI-X Table entries. However, anytime software unmasks a currently masked MSI-X Table entry either by clearing its Mask bit or by clearing the Function Mask bit, the function must update any Address or Data values that it cached from that entry. If software changes the Address or Data value of an entry while the entry is unmasked, the result is undefined. The Linux kernel's MSI-X support never enforced that the entry is masked before the entry is modified hence the Fixes tag refers to a commit in: git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git Enforce the entry to be masked across the update. There is no point in enforcing this to be handled at all possible call sites as this is just pointless code duplication and the common update function is the obvious place to enforce this. Fixes: f036d4ea5fa7 ("[PATCH] ia32 Message Signalled Interrupt support") Reported-by: Kevin Tian Signed-off-by: Thomas Gleixner Tested-by: Marc Zyngier Reviewed-by: Marc Zyngier Acked-by: Bjorn Helgaas Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20210729222542.462096385@linutronix.de Signed-off-by: Greg Kroah-Hartman --- drivers/pci/msi.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 8a0c28906d8f..82c061269677 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -303,10 +303,25 @@ void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg) /* Don't touch the hardware now */ } else if (entry->msi_attrib.is_msix) { void __iomem *base = pci_msix_desc_addr(entry); + bool unmasked = !(entry->masked & PCI_MSIX_ENTRY_CTRL_MASKBIT); + + /* + * The specification mandates that the entry is masked + * when the message is modified: + * + * "If software changes the Address or Data value of an + * entry while the entry is unmasked, the result is + * undefined." + */ + if (unmasked) + __pci_msix_desc_mask_irq(entry, PCI_MSIX_ENTRY_CTRL_MASKBIT); writel(msg->address_lo, base + PCI_MSIX_ENTRY_LOWER_ADDR); writel(msg->address_hi, base + PCI_MSIX_ENTRY_UPPER_ADDR); writel(msg->data, base + PCI_MSIX_ENTRY_DATA); + + if (unmasked) + __pci_msix_desc_mask_irq(entry, 0); } else { int pos = dev->msi_cap; u16 msgctl; -- 2.30.2