From nobody Wed Dec 17 10:48:43 2025 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012014.outbound.protection.outlook.com [52.101.48.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 77B7633E377; Tue, 4 Nov 2025 17:07:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762276077; cv=fail; b=SldlAkNW6B/gKrB8RZaLFLDnKkKHbF/4YQfstPPAKKZrDfAg/LH5F7hRRah1Xb/xljsySkwJvesuxv07YSB1wSte61lDMiFUalXzXP9u18X/I7/rT0vLUZdhzaUfZkCTLqvXFC1KEV1aeh6745y1bnrYigG/vaMmFAyj2KRRxcI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762276077; c=relaxed/simple; bh=HRwPiP9x2NTGozOQ102FKDbBWNN50Z/sayCBvuTw/Ww=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=P1SOR8U/636zZuiwccosbeXQGNzgntc9ATjVZlcAkJdm4CIlS/2VdLWkzt+5jszgA9D2+owWDNzabNRIOxpjf40dKqEdxHmQY79O0DaIUtkJwlSLANQqUZ41VLo15QRc9Z07q7R54988vrDWidDSlTWJ+/YClo6ni2pMILZtpHw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=4pkeap4m; arc=fail smtp.client-ip=52.101.48.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="4pkeap4m" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QeafSruzCBhMiYEG6n1ZgOJl9kpEoAXJ5/qRC9gZBJ5JLDfLbW2pbtgMgdQG/jCSEXC6BJqXR5s+sfMuDYixTZBZZtl/CGHyxoEg0Is3d0ZSzzr61SA6+B30ld1p7TD3eHyezJCVbR5ThHaWp12d2pQQ4LYszc+yCKifPhWmbHbHy+FymwG2F4kBVSfhxEAlL/NWqYB5psXb4anV9+ARVCjJWAwDwBnEMEZl2/dqRQoCN7zZCukRQkKKiMip7Qi+msxP/8oTSVFzTCvqK9Wfyf7yJt682C+0HlS9BYwv0HCcith0BSLCN8bzmwRgvb0n6BtnIWGB4OTjtPx33NWGEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=c6LmVebsgT4Y6EDCUmLUIUAbb0b77qwZs90gM4F976A=; b=WacFUH11lNpoLnmSzyYiBUur+sSlb87PBMRHAUrncywvLZLthURvqCx2wpW8LUFyJoP64NT+7hPnPgbVR5+x26AcqE4pDS6WogRm7m8F+mwK6AlvVwfKnqWhoOjwQTySlvIFb/5CH4evr6X+gX2r+po89RcYRMzsHQgKqTr1qNTj3MMZyl+6uzlodHm57akqngR3QJ6rzkQZVAbtTRc8+DlPriaQ7lb4UGWOEM43cNx0TFgVdbIB3gk5KYxoaums4Rc4xhUbEgRPkKNMu8Q/31Mwz/rO3k31dz3T09Ou+Htsn7BK19KMG53dRWhjoFg3DzxhbN5cnYjEoeaBpkYxSA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=stgolabs.net smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=c6LmVebsgT4Y6EDCUmLUIUAbb0b77qwZs90gM4F976A=; b=4pkeap4mYLKsxefQOm7/DVSZ+eAnCr4Ec49FrcHum9oJIyf2MNlernKnw/nheSCN7Q7xk6KwkRuZPlKOJgzy6hsaazlccqDsDvyHaU3QQcB+GRWP58W5+ty/EI02wfSbmZ13waU7LaFuQsk88pZumc8goSs4Zbxkgk+CVGcGJ9s= Received: from SJ0PR05CA0054.namprd05.prod.outlook.com (2603:10b6:a03:33f::29) by LV8PR12MB9230.namprd12.prod.outlook.com (2603:10b6:408:186::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9275.16; Tue, 4 Nov 2025 17:07:52 +0000 Received: from SJ1PEPF00002319.namprd03.prod.outlook.com (2603:10b6:a03:33f:cafe::bd) by SJ0PR05CA0054.outlook.office365.com (2603:10b6:a03:33f::29) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9298.7 via Frontend Transport; Tue, 4 Nov 2025 17:07:42 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF00002319.mail.protection.outlook.com (10.167.242.229) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9298.6 via Frontend Transport; Tue, 4 Nov 2025 17:07:49 +0000 Received: from ethanolx7ea3host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Tue, 4 Nov 2025 09:07:48 -0800 From: Terry Bowman To: , , , , , , , , , , , , , , , , , CC: , , Subject: [RESEND v13 25/25] CXL/PCI: Disable CXL protocol error interrupts during CXL Port cleanup Date: Tue, 4 Nov 2025 11:03:05 -0600 Message-ID: <20251104170305.4163840-26-terry.bowman@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251104170305.4163840-1-terry.bowman@amd.com> References: <20251104170305.4163840-1-terry.bowman@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00002319:EE_|LV8PR12MB9230:EE_ X-MS-Office365-Filtering-Correlation-Id: 56549393-698c-46ef-3b51-08de1bc4af06 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|7416014|376014|82310400026|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?gv2c8pkyozlW3SY8v8fea92VIm2qFfDA7GwJILXz9bhfNiOlcumbxK0zmWEe?= =?us-ascii?Q?pcPY/8cQhZwNtqRtrcLT7GuMsCFV1sWvCX/RS3sQtjyb+ITsNToSizS7LgrY?= =?us-ascii?Q?i7/faCq7Dp9LiiZn+68YgirA/7AKw53Z1DNxqbsDJw2M2//Mo33EPiLMh4jR?= =?us-ascii?Q?t2rYstTr4yeiYtWlHkuTXmO/LeBRLyiPNQK8cnzQyQUaMmGBcv+5738A1EB5?= =?us-ascii?Q?UisrfzeBpSN51Y7GowUVO1qBTgvZFrViKYLX4Hi8em/kwUh00Jw1yWNlhxuM?= =?us-ascii?Q?rUtWZWEgeN9CUu/SRdkBnS0KhDDRC7jDVCv/zgn1H8r7yAvSweHyU983hLgd?= =?us-ascii?Q?zx2ivFeYbccZMHfP6atNvyCFb+KmFn5+xxeVlKytrlX8Latq9vMTNRNjJ8or?= =?us-ascii?Q?ic1kfGm1eJRlhZ5+574AN9gM8Hqid9EghBY/NR39vI1NwpsNcWQcoouYJvNW?= =?us-ascii?Q?VbOIEkKO8VR+zyx9u292nqEV0XAmKytzHXXo69zAjGoP91YMGU3TJAYkTw9a?= =?us-ascii?Q?0BxLaSkW2zUZCOGA3iJF3NP0J7qbuymPXkpsDe1vPMGLpJgT0sMV8C3zJ3YY?= =?us-ascii?Q?60xAlkoM40iuOPi6ZiiLhaM+peBn36UxwrK1IqzAwBtlbHLQSqp7I5reiJ/i?= =?us-ascii?Q?W/q9v8f8YSjYdBPRv626yV9NskMj47GLca5eh6ZvGQvP1xmiKjhK/0ACZ0bb?= =?us-ascii?Q?glCYWjNhSzdfJFdTIvHiD+G9oLfmYzBMx/HOvKupLnAAbyEdFLsdH+ddYBpt?= =?us-ascii?Q?tq4Fy6Wv8/bwp7ZLNczxGnXQFjlc2d/SMuud5387yvxCa1t/lcVqQCtXeHtI?= =?us-ascii?Q?zBOUbmcNSguF2S0sHHTabXh2XoP2XSezugmd8TxzHjanBhghLRfZH8INvmLS?= =?us-ascii?Q?bQ8/NHPUTYDFKt+IExT3atwhdMn3UCai7TXu4iwp8umKh5DTMHIKuspfZKG0?= =?us-ascii?Q?ACb2uhyw5wjE69zpwq2CAzDm5DBQqD8Q7TvFRmighQuEcxba4AXVxel7xpUl?= =?us-ascii?Q?PivQxPJwLh0RZmmJqOZWJKt8cCW7hBjVtS9KgDgKlV2mf7yOBeO3HvhxzKaL?= =?us-ascii?Q?oLRDeFOOHQEWqmBWMiwxnUzcyrNyAkTot+Xg9u+z/PbisJwFnsdNTxScsjlV?= =?us-ascii?Q?cRjBlDT0lcdhbEGjoUfkNCNJYuItfuMYhWb6gaLQLqVA8x2Sgi1t8aroE/BE?= =?us-ascii?Q?/G5C4pA1qT2P1e0lY+45nrNDR7Te4c7mYZq/GMOMNEgzK94TA3+4mpnQjj39?= =?us-ascii?Q?4ygwTLlolGTHyIkXOMoZ90gL2SZc34n4yD42NxP1gZqejP7MxaaDbgLngTz6?= =?us-ascii?Q?lCS9xdK33/4ibDnvx7uYINoZi/Q8ytxaDuCTrjAok/9r+cpSF3fhY4qSnCGe?= =?us-ascii?Q?HtYxTzHqaXTqgTz5Svs/ZDQBhe/sD17WSTg+xTalODBzvZ/XpU2D4lovo7ge?= =?us-ascii?Q?zAomn79gY8zeEmQqQR4XAAbSpV4pwY+adRYZ1GDHPlqTmUpG69wdeag/7NDD?= =?us-ascii?Q?/xXVtMoTmvuXQAPwa0FtrNHVk2BCinrKbk6F8vHc/ue1dfS/leg14l/sPbdf?= =?us-ascii?Q?2TSFc9DpMGGpT7WJLHuV5jHKZeBcnIR9j94QB76L?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(7416014)(376014)(82310400026)(1800799024)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Nov 2025 17:07:49.5809 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 56549393-698c-46ef-3b51-08de1bc4af06 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00002319.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV8PR12MB9230 Content-Type: text/plain; charset="utf-8" During CXL device cleanup the CXL PCIe Port device interrupts remain enabled. This potentially allows unnecessary interrupt processing on behalf of the CXL errors while the device is destroyed. Disable CXL protocol errors by setting the CXL devices' AER mask register. Introduce pci_aer_mask_internal_errors() similar to pci_aer_unmask_internal= _errors(). Add to the AER service driver allowing other subsystems to use. Introduce cxl_mask_proto_interrupts() to call pci_aer_mask_internal_errors(= ). Add calls to cxl_mask_proto_interrupts() within CXL Port teardown for CXL Root Ports, CXL Downstream Switch Ports, CXL Upstream Switch Ports, and CXL Endpoints. Follow the same "bottom-up" approach used during CXL Port teardown. Signed-off-by: Terry Bowman Reviewed-by: Dave Jiang Reviewed-by: Jonathan Cameron --- Changes in v12->v13: - Added dev and dev_is_pci() checks in cxl_mask_proto_interrupts() (Terry) Changes in v11->v12: - Keep pci_aer_mask_internal_errors() in driver/pci/pcie/aer.c (Lukas) - Update commit description for pci_aer_mask_internal_errors() - Add check `if (port->parent_dport)` in delete_switch_port() (Terry) Changes in v10->v11: - Removed guard() cxl_mask_proto_interrupts(). RP was blocking during testing. (Terry) --- drivers/cxl/core/port.c | 10 +++++++++- drivers/cxl/core/ras.c | 10 ++++++++++ drivers/pci/pcie/aer.c | 21 +++++++++++++++++++++ include/linux/aer.h | 2 ++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index a23c742eb670..d19ebf052d76 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -1437,6 +1437,10 @@ EXPORT_SYMBOL_NS_GPL(cxl_endpoint_autoremove, "CXL"); */ static void delete_switch_port(struct cxl_port *port) { + cxl_mask_proto_interrupts(port->uport_dev); + if (port->parent_dport) + cxl_mask_proto_interrupts(port->parent_dport->dport_dev); + devm_release_action(port->dev.parent, cxl_unlink_parent_dport, port); devm_release_action(port->dev.parent, cxl_unlink_uport, port); devm_release_action(port->dev.parent, unregister_port, port); @@ -1458,8 +1462,10 @@ static void del_dports(struct cxl_port *port) =20 device_lock_assert(&port->dev); =20 - xa_for_each(&port->dports, index, dport) + xa_for_each(&port->dports, index, dport) { + cxl_mask_proto_interrupts(dport->dport_dev); del_dport(dport); + } } =20 struct detach_ctx { @@ -1486,6 +1492,8 @@ static void cxl_detach_ep(void *data) { struct cxl_memdev *cxlmd =3D data; =20 + cxl_mask_proto_interrupts(cxlmd->cxlds->dev); + for (int i =3D cxlmd->depth - 1; i >=3D 1; i--) { struct cxl_port *port, *parent_port; struct detach_ctx ctx =3D { diff --git a/drivers/cxl/core/ras.c b/drivers/cxl/core/ras.c index 101e55723785..6dccbe66c9ac 100644 --- a/drivers/cxl/core/ras.c +++ b/drivers/cxl/core/ras.c @@ -139,6 +139,16 @@ void cxl_unmask_proto_interrupts(struct device *dev) pci_aer_unmask_internal_errors(pdev); } =20 +void cxl_mask_proto_interrupts(struct device *dev) +{ + if (!dev || !dev_is_pci(dev)) + return; + + struct pci_dev *pdev __free(pci_dev_put) =3D pci_dev_get(to_pci_dev(dev)); + + pci_aer_mask_internal_errors(pdev); +} + static void cxl_dport_map_ras(struct cxl_dport *dport) { struct cxl_register_map *map =3D &dport->reg_map; diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c index 4cf44297bb24..fcc2f43c3383 100644 --- a/drivers/pci/pcie/aer.c +++ b/drivers/pci/pcie/aer.c @@ -1149,6 +1149,27 @@ void pci_aer_unmask_internal_errors(struct pci_dev *= dev) } EXPORT_SYMBOL_GPL(pci_aer_unmask_internal_errors); =20 +/** + * pci_aer_mask_internal_errors - mask internal errors + * @dev: pointer to the pcie_dev data structure + * + * Masks internal errors in the Uncorrectable and Correctable Error + * Mask registers. + * + * Note: AER must be enabled and supported by the device which must be + * checked in advance, e.g. with pcie_aer_is_native(). + */ +void pci_aer_mask_internal_errors(struct pci_dev *dev) +{ + int aer =3D dev->aer_cap; + + pci_clear_and_set_config_dword(dev, aer + PCI_ERR_UNCOR_MASK, + 0, PCI_ERR_UNC_INTN); + pci_clear_and_set_config_dword(dev, aer + PCI_ERR_COR_MASK, + 0, PCI_ERR_COR_INTERNAL); +} +EXPORT_SYMBOL_GPL(pci_aer_mask_internal_errors); + /** * pci_aer_handle_error - handle logging error into an event log * @dev: pointer to pci_dev data structure of error source device diff --git a/include/linux/aer.h b/include/linux/aer.h index 64aef69fb546..2b89bd940ac1 100644 --- a/include/linux/aer.h +++ b/include/linux/aer.h @@ -69,6 +69,7 @@ int pci_aer_clear_nonfatal_status(struct pci_dev *dev); void pci_aer_clear_fatal_status(struct pci_dev *dev); int pcie_aer_is_native(struct pci_dev *dev); void pci_aer_unmask_internal_errors(struct pci_dev *dev); +void pci_aer_mask_internal_errors(struct pci_dev *dev); #else static inline int pci_aer_clear_nonfatal_status(struct pci_dev *dev) { @@ -77,6 +78,7 @@ static inline int pci_aer_clear_nonfatal_status(struct pc= i_dev *dev) static inline void pci_aer_clear_fatal_status(struct pci_dev *dev) { } static inline int pcie_aer_is_native(struct pci_dev *dev) { return 0; } static inline void pci_aer_unmask_internal_errors(struct pci_dev *dev) { } +static inline void pci_aer_mask_internal_errors(struct pci_dev *dev) { } #endif =20 #ifdef CONFIG_CXL_RAS --=20 2.34.1