From nobody Thu Oct 9 08:12:59 2025 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 CC730241103; Thu, 19 Jun 2025 05:04:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309480; cv=fail; b=DCiwLfydH6h+598zDl2tFX7SbtW0wMtKC4TaAMzajNDUctiiMusQMUcUlH8X28NdpICy1htPTfK9eEqVv52o9vu61pJBxzcav8295JL4m7i0fGmXZSBg4C04o/+IkNbKKFScnl4vTY+EGCgwM+cINy5EG1EH/Bt2NubzTMVpMEA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309480; c=relaxed/simple; bh=lGx23sa4dgcbEFJU3dNS6asTd+F3QdIdHgVDwVZLaWE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=iOXtofULiytpk5R+J7JjDIkNtMqzPkktGLdipEHD+NYMv7jPq3Cqal+L0YJ4tf+yuGk8s3mG+n3570QGpODoXB/8Id3tEV2irfIb5tEy8y/6SYMU41E0BII+6lSORZ+//BMFM7CS87yK67fAdTGuV4IaWt4bdgbYVBfwmqWNVRI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Yk+E2YKZ; arc=fail smtp.client-ip=192.198.163.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Yk+E2YKZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1750309479; x=1781845479; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=lGx23sa4dgcbEFJU3dNS6asTd+F3QdIdHgVDwVZLaWE=; b=Yk+E2YKZZUEDCwhm7gpyEpMrlSp2pO6iwu1U8UVLVd+cZRDOFtIQJXjm hvbGisbOy7L9kvDsD0tx2w/bKK5tWFq7MQJpaTjALxAa7aO2g7qvIK3f6 Ad4v6UH1fX5DUgUF+gQ8JNAm9/I/zgvOJzlTkbjrO/g3N/RYaUfPUmMc+ 4BCG+lPIdaDOAngshY7HXHJJUsH8KRYKOy4Q3B09GBDhv2xotbFsR/9Iy FOegDF4UniMW1tt5yZXTTeDyb1GDlr7lIr8TAQoYHX2p/MOdh+zxaO9J0 r+dByIMxy5iWb9fwlxYXcPSRLC6G9rBaC8/Hx1MHmhtqwxotrUj6jB41m Q==; X-CSE-ConnectionGUID: gQ4BGfrUQBe7ApddO8r2/g== X-CSE-MsgGUID: MS2jvy01SqSEsdxXtBrXTg== X-IronPort-AV: E=McAfee;i="6800,10657,11468"; a="52702174" X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="52702174" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:33 -0700 X-CSE-ConnectionGUID: yJh9MACsQwSCvD6gv7OakA== X-CSE-MsgGUID: Ld4czjJfQUCfkgWMv0dfbA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="154413081" Received: from orsmsx901.amr.corp.intel.com ([10.22.229.23]) by fmviesa003.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:31 -0700 Received: from ORSMSX902.amr.corp.intel.com (10.22.229.24) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:30 -0700 Received: from ORSEDG903.ED.cps.intel.com (10.7.248.13) by ORSMSX902.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25 via Frontend Transport; Wed, 18 Jun 2025 22:04:30 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (40.107.223.42) by edgegateway.intel.com (134.134.137.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:30 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=P72D9iox+lsi4dbOdASdDK0GHg+oNJJcIZZcpj8tTbl54nj4iCsabygxRoNmydm5qT688awv7gc6SlaaJfjyD/MwoY1iXq4o8zLtzJNNooyWrjb2xHM415VFZOQh2fz3WSO4FxrJo5XApVqvXcsaLDErWkJjZPh6cBZ9Bq2PoJuZU7Ay0tu8yBoZlcD4yGgGUdehhtdQLXAV1GmGeGoj+8UIIFNJ7/Tb+BsVMRMSxR0XxwbtXCKL3T62CRsptskwQ4jLIwdwg7vGQu+smTcvy7ii/1LqSGN9gNPfgkQI2XFaS+QQaTbRj0yr5xNGkU/ksO6D9Tmm1YIJUWNR1Hg4dw== 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=7DsQ0+ZAlz19dLGpyg44jSj5AjV3lshEy3BWhPAi3K8=; b=CJHTeix6aPfV+JkSPJB+wzZepJ6CiJFL8DXcrH2Z3H3e+XHazU4gLv/ffSYY1IZgWD32FjN2KMqQDO4YVfRsjoA9hAsQLJrdo1EwPOHb+Gzl4araNP4LvRy6XoHVjAIKZt1LG4243VdW9fyHyea73ITiEXLIoyE/Po7jqBVM85f2gvRYEsotZCkAB474aeQwy18twBevG8aNbaCILgo29D6jd7BPI+uVd9mfJssCAbQAUcUrI7aMFrOV/n3vTm+SH0fcMRsN2LGFKx78vAoFaCNJpfdetP3xY7DOzaVebgC6inI/e28x2cYJTuKkbPQLH6qE+rKZGkgVZwW8NJB5pA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) by CY8PR11MB6819.namprd11.prod.outlook.com (2603:10b6:930:61::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.27; Thu, 19 Jun 2025 05:04:21 +0000 Received: from PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8]) by PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8%6]) with mapi id 15.20.8835.027; Thu, 19 Jun 2025 05:04:21 +0000 From: Dan Williams To: CC: , Peter Zijlstra , Ingo Molnar , Linus Torvalds , David Lechner , "Fabio M. De Francesco" Subject: [PATCH v2 1/8] cleanup: Introduce ACQUIRE() and ACQUIRE_ERR() for conditional locks Date: Wed, 18 Jun 2025 22:04:09 -0700 Message-ID: <20250619050416.782871-2-dan.j.williams@intel.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250619050416.782871-1-dan.j.williams@intel.com> References: <20250619050416.782871-1-dan.j.williams@intel.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0151.namprd03.prod.outlook.com (2603:10b6:a03:338::6) To PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH8PR11MB8107:EE_|CY8PR11MB6819:EE_ X-MS-Office365-Filtering-Correlation-Id: 9b4fa96e-f41e-4c57-e68d-08ddaeeec040 X-LD-Processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?tac7vZtefFy4kG2pH6E0e1lQSOrUFfKTv8V51xSCI9NVTexBi7e4eu6cD2k4?= =?us-ascii?Q?T1yRKT30PYRamKwE49lU2QSkS5HZTlF3zHECPaCONVlN5Kf/shSpFZ9U2rsh?= =?us-ascii?Q?nRRlFMZPxRUvap4yEMYnVys4ZgSsW+4xiPOlp/yhO9//G6qquuh7WfLlkVgc?= =?us-ascii?Q?a+4cc7LMFgAwIJdH6s7168iB9ReAVOIwUCKD5GYw4HMt/k5jtsXpdtJP+kOE?= =?us-ascii?Q?so5V4NC0se7q5ES00wbTKqJnNGj0kyXyHTCOf7ogleVMm1e4XpCPKeIaaIzi?= =?us-ascii?Q?7opCLDLyVWFDk3apUHK/y+OERWhEoKM1+4j8sfzUjCy70KPDSgbLon3gbLuP?= =?us-ascii?Q?CgncFMS6v0rlfKbxADYRR1uo+ylJriXqICDdWiAj7sWw03YtcwQFnrzA6ZaF?= =?us-ascii?Q?DuFJ+wgNa5LhbRQQES9xtfltPCNGBNaH6z/4gQKUCHkD+BT0wcsLQ9KMFZFq?= =?us-ascii?Q?2+1hj8CEgpLScpi/LaGgCo2oZsssNaSdQZLf1A2UEHRGWZIoS+3EstTGuETa?= =?us-ascii?Q?7U/dsa9VhN9aLpR5butpR+s96j5P8b71ECj5zryyyVgDTnNhuhKhSIPJMrj6?= =?us-ascii?Q?VvL3Kt+iqHLVhvkhvVe3IvmkkXACyhtR2rOnAt0IwqIx8qKebJS9e0342mnR?= =?us-ascii?Q?sAgSNALfrisxT5LmzCrk1VKvJ6TZpxvebMhDaUGBS0Dr8U+yAH5honm0KhLt?= =?us-ascii?Q?wxWb84ufYnlr2lijaSaNlKPq4PUAHpP3pE8Gx9vVA0ybBWsPchn5JRzvuuRp?= =?us-ascii?Q?xgNGj5s9Bq6oGzyfecLbnH0vHWpnJ76mJbSnAPpjEpnWsKgDgLBd9/q+T8p7?= =?us-ascii?Q?lOUQ30GXEtNV+ffSUUrMokIudFx4BZK+j7nXTAnT90v7kD/5YG5MyAdAQlSt?= =?us-ascii?Q?wDPaDnH3oGPyWssE4rAbHEGg5XJaR/2Ych0w1HXcjqFoikEHEjtZlDZTxGb+?= =?us-ascii?Q?Wl2tek/wxQ7EhZKpmrSSQDVkjccfGweLzu7dv9bJwKMu0vclv4HNFh/5Lcot?= =?us-ascii?Q?2bdLgvYtWjTGNmheaZIfaC0aQ0tml4FEZ75lZU2kPUF0S/S78Q47c0FJwoWL?= =?us-ascii?Q?n8Qq8+Gu8se2iNRVbPoIK3DmshCSw3ZmdLeSo3CGieU/aF92akE+NIM/jEYT?= =?us-ascii?Q?rocHKFQ4yK6vxTNQfK1Yhj0knuysbfngISREZ3DPiFBOefxuI/+i5HQfVltu?= =?us-ascii?Q?2ld/xX0yUoTsU0S63va7fO3CUcmtfQJYX7NpUi5JtDSW6BRQSVDs0ZzuztSs?= =?us-ascii?Q?XDYewfoE7gb3rY3KCIxQqmpYUSBUWCQ5qEFuZyMmNiOg/meNeo9mdbxrBfWt?= =?us-ascii?Q?wnUdubtTfnHKSQnKg3+42j4e16xD74tERMEgg9yZziRZjsrYU7G/fb8fFSPM?= =?us-ascii?Q?AZMkPGMF26UV6h/gI8uQ5eOOAV1F?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR11MB8107.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?GlN7Hp9t5kXzvZRSezghbJURrNJXBgoweVcT0HM2FwnqrGIgwGEv/TlbB1iq?= =?us-ascii?Q?pkQ/k6iqIXh2zf86/nt36vGBhJFdCr2ncrHSwg8JXNVAnTpfeP0X+dJaeIye?= =?us-ascii?Q?+dR/2A2WCjCSB5QCEyEpUHj6JpJQe3+GbLJMPraTMPlSU9Kjsg1rS/BlXUom?= =?us-ascii?Q?OzGN9WkHytgShuGSRNMXwJHZd5ntdrlQCzuh0iik3otuKHlosF/7IycPxSJV?= =?us-ascii?Q?0Fb1Ct4AC+u+w4CNlUJVLzXVM8iuGxWadkSipYjUXZtZzq4rbxrKV4zwp7fh?= =?us-ascii?Q?i+uJo0uGbdLi0XQdTa07M9X+KZ0eZRCi+00QVTGhSjyB7fvRNQMP29HLL51b?= =?us-ascii?Q?KC/aBLkvEnuF1/5gkpeL59ezGlTky7keCvnXRy9fmjWG3XQByOJ9Lj8cv6+M?= =?us-ascii?Q?R53RA8SeLniiqGteeKftaLQpN1LKq//nmXViu2pjcY7p9/VtX79JQQeqvsRf?= =?us-ascii?Q?5FDHgOfN1e0+bjoQu3Sk56KsQ+DPEHwt4JZbWRCpQSTfCtCBTf8PMFdxyMzJ?= =?us-ascii?Q?fHb1gx/o82Y8pfbi1MyWQbmOrFlgig/rFPfkya4hVlvZsxx1pmcB6B3EbgYu?= =?us-ascii?Q?VrVQf3tioL3adMWvW5Jd4RIb6uMdpWg50KxA2ELuuvgyID4IzkGh4HRfSWac?= =?us-ascii?Q?6LwAmYyhD/lUUZ1bM0kQzd2jEl1f9EYuTFDTafbyKY+HnmSK31H1oHuyEkj4?= =?us-ascii?Q?D34OaCNSwqm1AVk17lzdqnobEtCmO6LCSI/k7RzU8LTfIgIu+Sx0xWtG1q/6?= =?us-ascii?Q?1eviiyCHOfmNeimZHhN05WPU5BRYdFBzBvNBxFj2HaU8c2lt6lca7dA9yBPD?= =?us-ascii?Q?khqbRkMr7IGc2hiKnw0lynvvaVquT52ra/zeZaeUatcsKah5vSfnO4oO7lba?= =?us-ascii?Q?J9Qt5rOdpNDonfkKKzQCSNCr0hOcDo3Jmk+K/1yEbTGd0aQoR/VGc6bsMJEW?= =?us-ascii?Q?jKy+v8VOXS8yFIzbiqsFeBExWq8zFMqkFNOiiwxVrfmczQYVd+PAjuUqG7eP?= =?us-ascii?Q?41LuAr7+Ez07mSyDRXq3iHynCUXhtpBtWWc9qJv6QQ/kKswmiy8jgzmXXAL2?= =?us-ascii?Q?XF1WpG0eykE5k75BF0MDIXST6DMuH0bE+W25AGK5jveuKKSbq5+Bb/YC7/BU?= =?us-ascii?Q?SP7t+/+2F6TkhOqnD83TaRmp4OtBwKw8jegugL89ZIOe07mERLvbAkpmWV83?= =?us-ascii?Q?b9RDBqtIfdWZcSUM2BIDKbGPBNObZtqvFS7o1+aVLVsjdoheuYbjguGAjvqC?= =?us-ascii?Q?JbjWNjIA3IVeoMYz941b4d38a3diYpMv3fQQx+jPBoP0xj3DvB3fFDHWzJGw?= =?us-ascii?Q?SbarCN5H0U8DKYVQ97URv/M0xB23M/W7VV8KxhMd8hCSkBGT793CquyOE23e?= =?us-ascii?Q?uQxl1y7zdcnRgEJFhrJMEBer6a7x5JsylINbeEnb/QXp8wE9BCawytHt+YXA?= =?us-ascii?Q?/xlZMJJHqkFVOgQVvJtxFc1ETZMJRW0psZW4xQkN7ZxS/uVJ2jTGL1bUuLPY?= =?us-ascii?Q?ZdFhkUHA+2VhBWLMt9JXMoUqU7i+sWJLiO2NMh6lGqZfphLfoRRYUqazYHiS?= =?us-ascii?Q?kSzKOuAgFEJrHmZ/39lTke7Ba7iNafm8gz8j6F3HSF8fcZvwOca43XFo/cY7?= =?us-ascii?Q?9A=3D=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: 9b4fa96e-f41e-4c57-e68d-08ddaeeec040 X-MS-Exchange-CrossTenant-AuthSource: PH8PR11MB8107.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 05:04:20.9583 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: phqyNyasMpm5DgpWqlqCLkbvCkWvuhMvqyHxp6sH1fRbsKD/1kj2IoPGxINmUGSYY4/A7O6G78GAgc/I1yhe3euzpS60Brkq1EEd5Ha3yuI= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR11MB6819 X-OriginatorOrg: intel.com Content-Type: text/plain; charset="utf-8" From: Peter Zijlstra scoped_cond_guard(), automatic cleanup for conditional locks, has a couple pain points: * It causes existing straight-line code to be re-indented into a new bracketed scope. While this can be mitigated by a new helper function to contain the scope, that is not always a comfortable conversion. * The return code from the conditional lock is tossed in favor of a scheme to pass a 'return err;' statement to the macro. Other attempts to clean this up, to behave more like guard() [1], got hung up trying to both establish and evaluate the conditional lock in one statement. ACQUIRE() solves this by reflecting the result of the condition in the automatic variable established by the lock CLASS(). The result is separately retrieved with the ACQUIRE_ERR() helper, effectively a PTR_ERR() operation. Link: http://lore.kernel.org/all/Z1LBnX9TpZLR5Dkf@gmail.com [1] Link: http://patch.msgid.link/20250512105026.GP4439@noisy.programming.kicks= -ass.net Link: http://patch.msgid.link/20250512185817.GA1808@noisy.programming.kicks= -ass.net Cc: Ingo Molnar Cc: Linus Torvalds Cc: David Lechner Cc: Fabio M. De Francesco Not-yet-signed-off-by: Peter Zijlstra [djbw: wrap Peter's proposal with changelog and comments] Co-developed-by: Dan Williams Signed-off-by: Dan Williams Acked-by: Peter Zijlstra (Intel) --- include/linux/cleanup.h | 77 ++++++++++++++++++++++++++++++++++------- include/linux/mutex.h | 2 +- include/linux/rwsem.h | 2 +- 3 files changed, 67 insertions(+), 14 deletions(-) diff --git a/include/linux/cleanup.h b/include/linux/cleanup.h index 7093e1d08af0..1e1eb35cc225 100644 --- a/include/linux/cleanup.h +++ b/include/linux/cleanup.h @@ -3,6 +3,8 @@ #define _LINUX_CLEANUP_H =20 #include +#include +#include =20 /** * DOC: scope-based cleanup helpers @@ -61,9 +63,21 @@ * Observe the lock is held for the remainder of the "if ()" block not * the remainder of "func()". * - * Now, when a function uses both __free() and guard(), or multiple - * instances of __free(), the LIFO order of variable definition order - * matters. GCC documentation says: + * The ACQUIRE() macro can be used in all places that guard() can be + * used and additionally support conditional locks + * + * + * DEFINE_GUARD_COND(pci_dev, _try, pci_dev_trylock(_T)) + * ... + * ACQUIRE(pci_dev_try, lock)(dev); + * rc =3D ACQUIRE_ERR(pci_dev_try, &lock); + * if (rc) + * return rc; + * // @lock is held + * + * Now, when a function uses both __free() and guard()/ACQUIRE(), or + * multiple instances of __free(), the LIFO order of variable definition + * order matters. GCC documentation says: * * "When multiple variables in the same scope have cleanup attributes, * at exit from the scope their associated cleanup functions are run in @@ -305,14 +319,32 @@ static inline class_##_name##_t class_##_name##ext##_= constructor(_init_args) \ * acquire fails. * * Only for conditional locks. + * + * ACQUIRE(name, var): + * a named instance of the (guard) class, suitable for conditional + * locks when paired with ACQUIRE_ERR(). + * + * ACQUIRE_ERR(name, &var): + * a helper that is effectively a PTR_ERR() conversion of the guard + * pointer. Returns 0 when the lock was acquired and a negative + * error code otherwise. */ =20 #define __DEFINE_CLASS_IS_CONDITIONAL(_name, _is_cond) \ static __maybe_unused const bool class_##_name##_is_conditional =3D _is_co= nd =20 +#define __GUARD_IS_ERR(_ptr) \ + ({ unsigned long _rc =3D (__force unsigned long)(_ptr); \ + unlikely((_rc-1) >=3D -MAX_ERRNO-1); }) + #define __DEFINE_GUARD_LOCK_PTR(_name, _exp) \ static inline void * class_##_name##_lock_ptr(class_##_name##_t *_T) \ - { return (void *)(__force unsigned long)*(_exp); } + { void *_ptr =3D (void *)(__force unsigned long)*(_exp); \ + if (IS_ERR(_ptr)) { _ptr =3D NULL; } return _ptr; } \ + static inline int class_##_name##_lock_err(class_##_name##_t *_T) \ + { long _rc =3D (__force unsigned long)*(_exp); \ + if (!_rc) { _rc =3D -EBUSY; } if (!IS_ERR_VALUE(_rc)) { _rc =3D 0; } \ + return _rc; } =20 #define DEFINE_CLASS_IS_GUARD(_name) \ __DEFINE_CLASS_IS_CONDITIONAL(_name, false); \ @@ -323,23 +355,37 @@ static __maybe_unused const bool class_##_name##_is_c= onditional =3D _is_cond __DEFINE_GUARD_LOCK_PTR(_name, _T) =20 #define DEFINE_GUARD(_name, _type, _lock, _unlock) \ - DEFINE_CLASS(_name, _type, if (_T) { _unlock; }, ({ _lock; _T; }), _type = _T); \ + DEFINE_CLASS(_name, _type, if (!__GUARD_IS_ERR(_T)) { _unlock; }, ({ _loc= k; _T; }), _type _T); \ DEFINE_CLASS_IS_GUARD(_name) =20 -#define DEFINE_GUARD_COND(_name, _ext, _condlock) \ +#define DEFINE_GUARD_COND_4(_name, _ext, _lock, _cond) \ __DEFINE_CLASS_IS_CONDITIONAL(_name##_ext, true); \ EXTEND_CLASS(_name, _ext, \ - ({ void *_t =3D _T; if (_T && !(_condlock)) _t =3D NULL; _t; }), \ + ({ void *_t =3D _T; int _RET =3D (_lock); if (_T && !(_cond)) _t = =3D ERR_PTR(_RET); _t; }), \ class_##_name##_t _T) \ static inline void * class_##_name##_ext##_lock_ptr(class_##_name##_t *_T= ) \ - { return class_##_name##_lock_ptr(_T); } + { return class_##_name##_lock_ptr(_T); } \ + static inline int class_##_name##_ext##_lock_err(class_##_name##_t *_T) \ + { return class_##_name##_lock_err(_T); } + +/* + * Default binary condition; success on 'true'. + */ +#define DEFINE_GUARD_COND_3(_name, _ext, _lock) \ + DEFINE_GUARD_COND_4(_name, _ext, _lock, _RET) + +#define DEFINE_GUARD_COND(X...) CONCATENATE(DEFINE_GUARD_COND_, COUNT_ARGS= (X))(X) =20 #define guard(_name) \ CLASS(_name, __UNIQUE_ID(guard)) =20 #define __guard_ptr(_name) class_##_name##_lock_ptr +#define __guard_err(_name) class_##_name##_lock_err #define __is_cond_ptr(_name) class_##_name##_is_conditional =20 +#define ACQUIRE(_name, _var) CLASS(_name, _var) +#define ACQUIRE_ERR(_name, _var) __guard_err(_name)(_var) + /* * Helper macro for scoped_guard(). * @@ -401,7 +447,7 @@ typedef struct { \ \ static inline void class_##_name##_destructor(class_##_name##_t *_T) \ { \ - if (_T->lock) { _unlock; } \ + if (!__GUARD_IS_ERR(_T->lock)) { _unlock; } \ } \ \ __DEFINE_GUARD_LOCK_PTR(_name, &_T->lock) @@ -433,15 +479,22 @@ __DEFINE_CLASS_IS_CONDITIONAL(_name, false); \ __DEFINE_UNLOCK_GUARD(_name, void, _unlock, __VA_ARGS__) \ __DEFINE_LOCK_GUARD_0(_name, _lock) =20 -#define DEFINE_LOCK_GUARD_1_COND(_name, _ext, _condlock) \ +#define DEFINE_LOCK_GUARD_1_COND_4(_name, _ext, _lock, _cond) \ __DEFINE_CLASS_IS_CONDITIONAL(_name##_ext, true); \ EXTEND_CLASS(_name, _ext, \ ({ class_##_name##_t _t =3D { .lock =3D l }, *_T =3D &_t;\ - if (_T->lock && !(_condlock)) _T->lock =3D NULL; \ + int _RET =3D (_lock); \ + if (_T->lock && !(_cond)) _T->lock =3D ERR_PTR(_RET);\ _t; }), \ typeof_member(class_##_name##_t, lock) l) \ static inline void * class_##_name##_ext##_lock_ptr(class_##_name##_t *_T= ) \ - { return class_##_name##_lock_ptr(_T); } + { return class_##_name##_lock_ptr(_T); } \ + static inline int class_##_name##_ext##_lock_err(class_##_name##_t *_T) \ + { return class_##_name##_lock_err(_T); } + +#define DEFINE_LOCK_GUARD_1_COND_3(_name, _ext, _lock) \ + DEFINE_LOCK_GUARD_1_COND_4(_name, _ext, _lock, _RET) =20 +#define DEFINE_LOCK_GUARD_1_COND(X...) CONCATENATE(DEFINE_LOCK_GUARD_1_CON= D_, COUNT_ARGS(X))(X) =20 #endif /* _LINUX_CLEANUP_H */ diff --git a/include/linux/mutex.h b/include/linux/mutex.h index a039fa8c1780..9d5d7ed5c101 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h @@ -224,7 +224,7 @@ extern int atomic_dec_and_mutex_lock(atomic_t *cnt, str= uct mutex *lock); =20 DEFINE_GUARD(mutex, struct mutex *, mutex_lock(_T), mutex_unlock(_T)) DEFINE_GUARD_COND(mutex, _try, mutex_trylock(_T)) -DEFINE_GUARD_COND(mutex, _intr, mutex_lock_interruptible(_T) =3D=3D 0) +DEFINE_GUARD_COND(mutex, _intr, mutex_lock_interruptible(_T), _RET =3D=3D = 0) =20 extern unsigned long mutex_get_owner(struct mutex *lock); =20 diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index c8b543d428b0..c810deb88d13 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h @@ -240,7 +240,7 @@ extern void up_write(struct rw_semaphore *sem); =20 DEFINE_GUARD(rwsem_read, struct rw_semaphore *, down_read(_T), up_read(_T)) DEFINE_GUARD_COND(rwsem_read, _try, down_read_trylock(_T)) -DEFINE_GUARD_COND(rwsem_read, _intr, down_read_interruptible(_T) =3D=3D 0) +DEFINE_GUARD_COND(rwsem_read, _intr, down_read_interruptible(_T), _RET =3D= =3D 0) =20 DEFINE_GUARD(rwsem_write, struct rw_semaphore *, down_write(_T), up_write(= _T)) DEFINE_GUARD_COND(rwsem_write, _try, down_write_trylock(_T)) --=20 2.49.0 From nobody Thu Oct 9 08:12:59 2025 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 C8B6B241679; Thu, 19 Jun 2025 05:04:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309482; cv=fail; b=Pn75w48l/pD9ArSEhnqPxFhSD7UdFOedP8dx6o3kBXSP8dIl+rg8hpUDhbdbQ7e/+0wlRXJhDDMNoE6MIbe3SeU3Xn1z94BICALNZ2/Nkifue1HNObjVK6OHlV913H+hRvWokRStmwIFdEu77boOKuHEDP+UStU/qC2oJPYk2AI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309482; c=relaxed/simple; bh=LDvsV0DGcRDAdp3JtbYKbuQbEZnLb09suAJaoor8vwA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=BQhfXIg65gISNojtpCrWDYUXLBSf+1WH6cZhnaDJFWTgrTS8CxqcM+WNg0z+bd3M5Lb8ja4C4g6iFG1zdI6IE3WH7ORy86VFxwkHyB6fGJnfbR3DeXrZVJ+kZeNlnSk/HbISQwRLVxvp7zeMNfu3wOHcH6hLVWQfEwak5boMEQc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=mk1dAVg5; arc=fail smtp.client-ip=192.198.163.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="mk1dAVg5" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1750309481; x=1781845481; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=LDvsV0DGcRDAdp3JtbYKbuQbEZnLb09suAJaoor8vwA=; b=mk1dAVg5DIaCprqxsECLTptkcyU4/AMsofhh3oZU8uZDEX4SGijmuu7O 9840+XJCN76pWXxZAe27CLoRbVsNwDwp4jaSewtGNLw+3EBkR/b/+AHQp rEzkkGCfhOnqW2AafbbkQT9i3N/2lQxt0835xsY3QUkL1z5tuaSJL/dbj akKuWisYAgMhzp+ahp+48c6HrU1cLkTSMsnZYnrOPiVrjv24D9kTimfQ0 sma7ZtC2Ekn+u8b1oAcT+LPWZOAp36cvIbJylyc0PSb/qFHPpYS+7ZbS6 L60kb9efZkyxoU1zjEkghG98geNElsp+ASq0LHssKgUbwEwQttSKxrzWn A==; X-CSE-ConnectionGUID: hne7M+zmSliXL4JHUWK/uQ== X-CSE-MsgGUID: 52Vrr3lrTNqiO4jUSgImAw== X-IronPort-AV: E=McAfee;i="6800,10657,11468"; a="52702189" X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="52702189" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:33 -0700 X-CSE-ConnectionGUID: 8uytarNPRYG8dvs04bNXLg== X-CSE-MsgGUID: cgYIiE1UTtic1qjGFsujlQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="154413090" Received: from orsmsx901.amr.corp.intel.com ([10.22.229.23]) by fmviesa003.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:32 -0700 Received: from ORSMSX902.amr.corp.intel.com (10.22.229.24) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:31 -0700 Received: from ORSEDG903.ED.cps.intel.com (10.7.248.13) by ORSMSX902.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25 via Frontend Transport; Wed, 18 Jun 2025 22:04:31 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (40.107.223.42) by edgegateway.intel.com (134.134.137.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:31 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=a/fnt9/1iEDZ24DMe9tShwCVZXW4hqSnRAaaQcDUZcXMhd6hAmwN04MMd7vSwn7Kgki19Ghiqhbcu3xWFt0v9kG6j+aBCscCEKGqo+05foPxwBWQvubum/kubCNRIpbkntW4f3a35kTUtS6BeQ7GW/ObPzZjD/9U9LSZqdisLMn8vZ8Jx+CnrQIkYOxP9jXJp+54jyjs26i+cwjn/K/UhLWOlUb9pxpNjipYCu1LT9Pa9Z0P5KHvGuvQrUajkPKKaO11eD/kqh4bWAgKjyhRRvXSNtCLR2qNcSo79eisG6kA1JZRb4BXoIhAc1YNiQp7Rm2fpiqRAIPTICj2twWinw== 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=JhKcjLIdZ1mz9Pq4aWSe64rXB5Z8OmgL0uNNmDF+kI8=; b=NE+V9i0QGejkbisJD+ZHXYp374lxW2Zk6MisS6RmTh35ZZNxPu1zgfXKcDKNXyb0kHeT7YAdP6xELTkhD3x2OxzBK8It5iyhAsSqYpteDNYxcKbp70qEQhDjJthSLt0gLLUDjlihiPV3vRDNBKcJwWLzR1Xy2SK2ZjDv9f4LpnV7RJ3AX1dmdDHyLlB4Xdm3vHwb/0LZw6dfrNUxC/wiGwwgGwAjrIYHG8RPxUpS0BnpuBG3Dxqd9K0wU0ep/NnqSdwrDqCJq33G0q34UJYel++pIYiZXI+p266nDa6Jcb1HXMRwG/WCTSJRWvWNLqLI+MK/SxRRmaXf8Pzc4IDSVw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) by CY8PR11MB6819.namprd11.prod.outlook.com (2603:10b6:930:61::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.27; Thu, 19 Jun 2025 05:04:22 +0000 Received: from PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8]) by PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8%6]) with mapi id 15.20.8835.027; Thu, 19 Jun 2025 05:04:22 +0000 From: Dan Williams To: CC: , Linus Torvalds , Peter Zijlstra , Davidlohr Bueso , Jonathan Cameron , Dave Jiang , "Alison Schofield" , Vishal Verma , Ira Weiny Subject: [PATCH v2 2/8] cxl/mbox: Convert poison list mutex to ACQUIRE() Date: Wed, 18 Jun 2025 22:04:10 -0700 Message-ID: <20250619050416.782871-3-dan.j.williams@intel.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250619050416.782871-1-dan.j.williams@intel.com> References: <20250619050416.782871-1-dan.j.williams@intel.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0151.namprd03.prod.outlook.com (2603:10b6:a03:338::6) To PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH8PR11MB8107:EE_|CY8PR11MB6819:EE_ X-MS-Office365-Filtering-Correlation-Id: 5bea30a4-265e-43b2-7882-08ddaeeec0e1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?SsaLRP1oWRivzZyts+QMdyEBXMRvaPa1qdOvE1Tuh5FT0OS8T90K4G1HjgFY?= =?us-ascii?Q?d4uqqK6sPoDwnmd8ZE2Og10AA5QpQqxUEdnjfg9XbCUVzxyqG8qM2lEqPsr1?= =?us-ascii?Q?vyzomzht0hU36Vh3XEPseAPbhhlfaJSgqjrGvhAHruFehVl5clfOf7QNkA/v?= =?us-ascii?Q?xVpYGacKce6sN5r6G7i726MIVotREwctfHoZ+weCKHkxQhFmckxBnTb3ZJDx?= =?us-ascii?Q?9Xh0dazX2fEhdw0LcNswEQkDs9sWOgVcU0LkQ+1DUQv6xSuJay84Ue8FyQUo?= =?us-ascii?Q?Ip0W2SL4+5TqQWypIAOJSlDAtQ6wldacfAhXS5vrisCwAZtBFWRGSW2ypY2x?= =?us-ascii?Q?FQ6B8a7m4puLPhDlDC/3zRlJhpTlupi19MTXL122vGKFzyU3+ECCTu2CLVqP?= =?us-ascii?Q?lgAbM9RxHehvXTEpdw4/awxv4cqN222jKh21J6a/1Xg5ZqaFurd7q7Z9QzI2?= =?us-ascii?Q?Ti11jKWdPRDz8JN2UHxtb8t7O+nwQ+nFWHrMg3t6y4Gx64x7FSRC122AYtuy?= =?us-ascii?Q?NfOauaeTlW7FBqPVD3pPzVuOy/LjvNcOdgsSliZdhR4x5BLBXpCGsxLhlMjT?= =?us-ascii?Q?owthuDk1gFT+Kaz+Oxn2tME5I/wDKEnOCM+3sPnYyRFz825tBZrPmYK6fZyy?= =?us-ascii?Q?EKrwR1MY2ZgRVnasEbsPT1tcNGbk5X8fR3Og1Z5V9yQ1X3Yu8cjdjh6+kP+s?= =?us-ascii?Q?doMPnVJoG6Ho1UyNmRHgNEqnk9NuDi8KattKjlKtAIOBG8B9HjiNkOfWUZuK?= =?us-ascii?Q?tVLq9+8TqrX0A/jdUiTGBFm1QId2ac7MrJAir+7FcXA6MY9QciUpXSSFcMzZ?= =?us-ascii?Q?q6vAki5K/npF4P6mgiU0ED2+k/rAyWZr3ws/gVoT5BEK/HWtlW2htlxKnjaV?= =?us-ascii?Q?JgwtyM9ftJjRWehiOwUuIoZBaZN/vSjAvHVCEpTh/KJ7pGoFIPVtol0ndlct?= =?us-ascii?Q?9+6o5TOfvMztGPiHvtmUOsCSr1qAGvRRIC1QLQ9cTD02fcMPzrfm4mPLylBa?= =?us-ascii?Q?cbQ0lMzD0K9uC+/LEwLHMN1Xc4A5vPL76Z2PExLLT1IU78kqnUUA1gGAb3P+?= =?us-ascii?Q?ZwUDu5N6iGIS8yHjcBftLFWbApyBbR6sUFOAcdcGPaTWHPeqkvb+5F/wfmj4?= =?us-ascii?Q?jKrS/7vuC18jPMSS6aaxbXOQCisjHTsFlqONCTgxD74k9z6NPc0Jc8sTYJ6m?= =?us-ascii?Q?ISKS8jI2f0IJrozgujYsMMHo7decJEkIMovplVGUfkVMpIXUQY9rJ9hlAhDN?= =?us-ascii?Q?beVtLNdvLKCRJ8P7Cf62PDbh0EptB7isGyoluE43pAVJOPHslfazKGOZv7tq?= =?us-ascii?Q?sREz7+3IsGSu+smQ/l71jbFXqX2o84a6r6KVgH0mq0O1bS6XaJHVrLVHO0aG?= =?us-ascii?Q?VHb0P5Fo3PGDhytGl5NdA4NlkJAR530oiEmoXqW+hf++6fqgK2FmO23Y7KCs?= =?us-ascii?Q?oxriHugCLQw=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR11MB8107.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ARtz3eHXJYbF723yn/kEiIsrjc66h2NMaFrgutG5xTU+1uBPAi4hQBXeiDQO?= =?us-ascii?Q?p4M5LUkeKBqsyuu1JyMPaIJMkbnOIkwdFEKeML91kTUa3BOeEkVZOLG8cVa1?= =?us-ascii?Q?nhWPRnuu+brOSw1JQmPSogEt08oYOLqH4j6kviA6kw9m5BxAkXzL6Oop40Go?= =?us-ascii?Q?nGKBU2Uaj2upwFPaSnpOCbwER+q4blekmkemyUeAIHGZt8EHbbi2Qa4yFhxe?= =?us-ascii?Q?fofufkhsH9njvqjCMXb5xBVe0OaeC+PZSCv6UaDrcotUvn3sqnmDXR8mke4P?= =?us-ascii?Q?T+PBXcquajVIhxVYJEL7JPFS7MTm/cESC3BetLWJ0IjsK/n6H3SYeZaCNLok?= =?us-ascii?Q?mBYvVdG8iUUkhGKet//hinuFv1yoHnufbz2pw41s42f3/+L8T1N7HwDGyMFE?= =?us-ascii?Q?EBNpSFDtpY7eiEHr730pHn/QT6tTBHEUxyH6JdY99LQclHDabWvZveGCe2mD?= =?us-ascii?Q?AHp7VfGOK+53BLfWVwJtP5R32gkz9ZxyYMEUNIhnuG7yg4p4KNz3wQTNQNFR?= =?us-ascii?Q?ktsvzch31BXNf3uyC2YF9WUo/hueqd+utJHFeZFgETLZ2e2HAnRfYs+WuZPk?= =?us-ascii?Q?FPQMgN5fA/T9SYFgeS16HkBofdIV2OTmiJIoWbEnrHAgoZux79byHOGnpM+T?= =?us-ascii?Q?dvO/E4DzOBXI/hBrpHNbEZ36lCqwSfRNDie+neayMT3LoIktKM1nq/nBvPgz?= =?us-ascii?Q?UsPtZZ32zn00BNc3oo7afEYvGOSM0jNDD/KXbxTd9ppMYVklB2HaFVnaX2B/?= =?us-ascii?Q?JE3zU5btGT9USn3uZifADI/Z4BRAF2B00KKnghyxkJdQE3gAv4hnXXPueTSa?= =?us-ascii?Q?Js5/WczyFIcoW8rB1Eb+H/Lqa3RLDlcUkpgTZsUzRYs1HDa0jS6Py4+rKZ2m?= =?us-ascii?Q?x2ktbHK3nx2DMuAPOB8wRpw+F2s9dP4Q5Wu2BLKQmooqjHuQ22WNyUd09/Sz?= =?us-ascii?Q?ZoYySRQ06poP7qfScNDQlt4v/rx7H4xxMzeTfMd6m6FpNWInDcK6W8tpLTXB?= =?us-ascii?Q?F+zW047FK767gR/uYxfl9NVDvNkhs3NMGxHEG0BT9RyxB9r6rCw7uvjNZ0+P?= =?us-ascii?Q?1OvsTOZyr89tyWCmXeefr1UOlgq0d1tIwEbxYcqxZx5LvkSW4CoiSoO5JiLw?= =?us-ascii?Q?kGtf2A4MAy5RSnkPmZ2wyt2vW5AjgRyZPigqTkECLfESPrs27i8D2rMeKMZQ?= =?us-ascii?Q?rzZODbNzsDDEI3exD9XnfrPY9HLDlknri8xX5OzkCW4Jm8t4DDx6nLgCgBTU?= =?us-ascii?Q?mu5iHNJFtNCWmv7WukpqNamdyjeSDOkmL8+jr+mNdQ7942wPCIXF+r60lQmy?= =?us-ascii?Q?06v7XONtjGe5epJmLlV3fMM0g9cGIcymauzMomLtnHr8Mx9d+FDn+KoubUZI?= =?us-ascii?Q?IkD8gBZ9/B8ZAIkOT+JDvUjTwJOwu8HGeS1HLxCFUVqVj18iHi6SRCLltLho?= =?us-ascii?Q?WY3BHLqxBi2pPvY2soblJD4Xb2i/gN65KrXkNSLx5110i4OXQ8rxIrQm1+oY?= =?us-ascii?Q?9or8pLsUjruWWeUN9mdeEr4/13HUUPWF+newqLVy+Y8RVsTmw0MiOoD4aMXE?= =?us-ascii?Q?z+6h8BvALyCf3QOsxTDMEzkmq+D0WhAvXt4ba3C/DNl1/HnbaK4pkQre9UXH?= =?us-ascii?Q?zg=3D=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: 5bea30a4-265e-43b2-7882-08ddaeeec0e1 X-MS-Exchange-CrossTenant-AuthSource: PH8PR11MB8107.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 05:04:22.1417 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Pv8f/4XKF/3oYhJ6LrQed5gXCgHoJt0JUqYb7jh/ZOhdLubDffhmeEk8LsFm7UK63JebdWMPT6PC28yjAGwLV7b0X2CihOO+/tKDAclxOjc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR11MB6819 X-OriginatorOrg: intel.com Content-Type: text/plain; charset="utf-8" Towards removing all explicit unlock calls in the CXL subsystem, convert the conditional poison list mutex to use a conditional lock guard. Rename the lock to have the compiler validate that all existing call sites are converted. Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Davidlohr Bueso Cc: Jonathan Cameron Cc: Dave Jiang Cc: Alison Schofield Cc: Vishal Verma Cc: Ira Weiny Signed-off-by: Dan Williams Acked-by: Peter Zijlstra (Intel) Reviewed-by: Alison Schofield Reviewed-by: Dave Jiang Reviewed-by: Jonathan Cameron --- drivers/cxl/core/mbox.c | 7 +++---- drivers/cxl/cxlmem.h | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 2689e6453c5a..81b21effe8cf 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -1401,8 +1401,8 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 = offset, u64 len, int nr_records =3D 0; int rc; =20 - rc =3D mutex_lock_interruptible(&mds->poison.lock); - if (rc) + ACQUIRE(mutex_intr, lock)(&mds->poison.mutex); + if ((rc =3D ACQUIRE_ERR(mutex_intr, &lock))) return rc; =20 po =3D mds->poison.list_out; @@ -1437,7 +1437,6 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 = offset, u64 len, } } while (po->flags & CXL_POISON_FLAG_MORE); =20 - mutex_unlock(&mds->poison.lock); return rc; } EXPORT_SYMBOL_NS_GPL(cxl_mem_get_poison, "CXL"); @@ -1473,7 +1472,7 @@ int cxl_poison_state_init(struct cxl_memdev_state *md= s) return rc; } =20 - mutex_init(&mds->poison.lock); + mutex_init(&mds->poison.mutex); return 0; } EXPORT_SYMBOL_NS_GPL(cxl_poison_state_init, "CXL"); diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h index 551b0ba2caa1..f5b20641e57c 100644 --- a/drivers/cxl/cxlmem.h +++ b/drivers/cxl/cxlmem.h @@ -254,7 +254,7 @@ enum security_cmd_enabled_bits { * @max_errors: Maximum media error records held in device cache * @enabled_cmds: All poison commands enabled in the CEL * @list_out: The poison list payload returned by device - * @lock: Protect reads of the poison list + * @mutex: Protect reads of the poison list * * Reads of the poison list are synchronized to ensure that a reader * does not get an incomplete list because their request overlapped @@ -265,7 +265,7 @@ struct cxl_poison_state { u32 max_errors; DECLARE_BITMAP(enabled_cmds, CXL_POISON_ENABLED_MAX); struct cxl_mbox_poison_out *list_out; - struct mutex lock; /* Protect reads of poison list */ + struct mutex mutex; /* Protect reads of poison list */ }; =20 /* --=20 2.49.0 From nobody Thu Oct 9 08:12:59 2025 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 4367424169E; Thu, 19 Jun 2025 05:04:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309483; cv=fail; b=Ui65phHIfScoktSW3YBvUSPbedWvuMXiy3duQEFR9FI+ymzv7lWVvjPXlIT4QJcTTq0l68dhVfMg3W2eWpwEshasyeGLxFSGP8xA03/skswhJItWRugl+HfeaWpH8+hfQBqlAjgN2NEzqklzcQ0uufp9U506Sh3CopqHQNAObtk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309483; c=relaxed/simple; bh=HW/MG0raKPsFrd0M7A4J/+A3eZkrc0D15fSxP5inygA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=iN6X0iqhk/ACXkso4eZMfV1tyi1qFqAOD7GwD+NTh86jzkPSo5ZD+Rn5qb7wO7W5GYdm/xDUBT8JLyisqDzr4Ii8ZF8Bl+46k44ePmgqPozAq7V4494usK93tu69+nP6P/Q8ewdA4EM1LAout6RaEzvBEC+QIiVWWjvD2hY9rFE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=aqIeFJ4E; arc=fail smtp.client-ip=192.198.163.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="aqIeFJ4E" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1750309481; x=1781845481; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=HW/MG0raKPsFrd0M7A4J/+A3eZkrc0D15fSxP5inygA=; b=aqIeFJ4EKIe/aQ+S6yr+4W5yDZPBiMTS8SpBg9d+oUIr+qtbPKNVpLKn RYN6Qe3FajS16Qcc0vY7gt36QmURcLu/lVYvEFqKe/chiC71oroNqGFL0 lnP9tmBBg6oeVmFIdwNG4+m+JXeox+/1xAtvSJdnGjbkqT5cQ6l0Ty4L/ XVfO2+Z1MeMIw0eg5npPi4fhsQHsLhr37iAYOkAwpFMZBoy9ODLkNqdmT 1xDJHBM/qQH/1qFHtzhx//CItkcpNOqITMuKXA3MFm3jLFTPOkeKkzuc3 K8CvNT84rMDJ/LKU60dbT4krvDHbdA5Nb3kW45THvnl+mswRq9MMpDEks g==; X-CSE-ConnectionGUID: foKntaYHQPGcH3As2vWFHQ== X-CSE-MsgGUID: ejHWxIfYSuGqedUlwHi3pQ== X-IronPort-AV: E=McAfee;i="6800,10657,11468"; a="52702195" X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="52702195" Received: from fmviesa001.fm.intel.com ([10.60.135.141]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:34 -0700 X-CSE-ConnectionGUID: VaddhshTSSG0SaTwOfDXjQ== X-CSE-MsgGUID: xzDO6vI+TtyrZSAyktxWnQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="181373553" Received: from orsmsx903.amr.corp.intel.com ([10.22.229.25]) by fmviesa001.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:33 -0700 Received: from ORSMSX903.amr.corp.intel.com (10.22.229.25) by ORSMSX903.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:32 -0700 Received: from ORSEDG903.ED.cps.intel.com (10.7.248.13) by ORSMSX903.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25 via Frontend Transport; Wed, 18 Jun 2025 22:04:32 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (40.107.223.42) by edgegateway.intel.com (134.134.137.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:32 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BRSyJeEO97uv9BPiUMmZ/VDHLOnm8pKWJiwvIl+TId5MNAEzdj07YVCfLlN/TZ6Lhyst8GFJT8AypKmNWlHl+3N+QLe7Iy6A/IS+RBpViQM7SeAJsach2UAvupavPkVBP8yGrojLA4rI1YxgR/4Y1L6JPYb0bMLU1FXRz8IDcKfrvDGCiRa7Hv9ZFoKt/uDnZhU05GlRrTYDbdIMgXVU8eVaUBKi3cIEVsFYqgK0EpRyZEvQY2hIkiyxcj1APPtGOKfvjCQ01DdOo8y13EnZRJlFeiMxTGtwP9f2pdzoFtJNtrOFynvF2QRL9AfsybsWis1ifXLv65QVgGaN75DKoA== 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=LVsAcbC8xBB1mDBu/bGESO+3nCdprI3TV0D56evqbZ8=; b=TsjnPD4/iyPJULw9NtjGL1WWvPTDoiQg4fGbx64tVHbXSZQGJdNMBXtp7yabxfAuHn6nDzAVMDWZNnBhW4F+xf6Z2s8kwXHxe6rtddr9GahTn/kjytNZC+2w/a7xN/do1H1IL4wLwCmleUOFVl0F3n8YsLOzDEVVbA0GDyI+Mo+M9+G5qLcPYR/enXpnOGalwM8KVZkA9DhcUpKtd+OdnfP/XBRh6kl4ezvcaCInom571ocCGFju2Lyvrl+LIZiXnLHQdI5RzcMt3lGXJ2gLjDJI7SZTDj6cio9qZBnEtsd1NBG78giVed9QXJLvEVY1/m39LPvJAMA7Jr+/TW++Fw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) by CY8PR11MB6819.namprd11.prod.outlook.com (2603:10b6:930:61::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.27; Thu, 19 Jun 2025 05:04:23 +0000 Received: from PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8]) by PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8%6]) with mapi id 15.20.8835.027; Thu, 19 Jun 2025 05:04:23 +0000 From: Dan Williams To: CC: , Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , "Vishal Verma" , Ira Weiny Subject: [PATCH v2 3/8] cxl/decoder: Move decoder register programming to a helper Date: Wed, 18 Jun 2025 22:04:11 -0700 Message-ID: <20250619050416.782871-4-dan.j.williams@intel.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250619050416.782871-1-dan.j.williams@intel.com> References: <20250619050416.782871-1-dan.j.williams@intel.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0151.namprd03.prod.outlook.com (2603:10b6:a03:338::6) To PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH8PR11MB8107:EE_|CY8PR11MB6819:EE_ X-MS-Office365-Filtering-Correlation-Id: 0f89187b-a4d6-47ee-c142-08ddaeeec188 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?yX48kTV3Ywz6+RLOcNQnwDS8DJu/rx4W6JQvbbspWy7MGZ7ZltTa9YRDDGQP?= =?us-ascii?Q?mHpRpDk0I4AoSu1d8v9zNCDJPUiURa3d6vjhrsc+nlJxA6BLXUaxdkZX6OVE?= =?us-ascii?Q?9blWRwO9kt2K08pAjaV545GD4SoW6Y3JN/ZZKHgel0vvuO6X5iTARjUIBueg?= =?us-ascii?Q?liazDPutnXv9L9p3Hp+HP3TltcWNUeqqQ53TGlBZBb6ooC3JwAP4Ndc8UEtv?= =?us-ascii?Q?wf5pZxxbLO8PQXz4tpAEfUBUUOi2F6wAY4w40DS1G97j6jaVnCQhMZmY2xOT?= =?us-ascii?Q?4GiZ/EmVgw+secB3cRd332oLgUP/ANzL41mvgJeyhTCbRJTsifAYW9OH0Akk?= =?us-ascii?Q?6giLxUPiKVo5ndgYJuVOxpdJyarcwcERYMMGBwsUDsYAy7weT6sAqncOZhFQ?= =?us-ascii?Q?/jKeGcr9YTzp7ohEgazTbK8ndo2KMp7KzicZQ3YGLd5u2kESB8kgKDK9cKrF?= =?us-ascii?Q?BU64a39IFISFPS14eakjIOcOrpeoDnkrvKAlKhR/pgbvqNsaqVboio85lrDi?= =?us-ascii?Q?h7C4V6t3G6lmzoBA4yONE4gb6+A66qfCzBHR/O+KXeN4at+/mhnnrS9ixELi?= =?us-ascii?Q?HK/J26xlY7Fd57+jHubjX6w5GG1hFOkc/l/f9mHgw0qGF6qXm6uk/HEz/WzO?= =?us-ascii?Q?L2elwpHOH5Soa0MaWrwXENCoR0NeiB7XSsvDk3MAJbP2PQVWVqHn44yk79SI?= =?us-ascii?Q?MTLbdQ191aJDkM0uibIS06hIzJ0Dq3Gx321DQsOdjZNDsCArtOW5D4RCmmiD?= =?us-ascii?Q?8rNRv1GXy8gKoHrTM6IetvfHbKp/9LhkHE7zUAG/CcQD00fR8ZrUOulkVKP8?= =?us-ascii?Q?Qxw3xCYm+fKep5FJds/fREUzJe+0Nb/sBvOP8LBhIwTT1PSYav+VE/CjG5Tb?= =?us-ascii?Q?DKDI9EwhLLfbcWlUkqc3mIw8nni8JHXNeBU5uBpMUoxmvy9Ta/nYjN5DciPQ?= =?us-ascii?Q?mIeCgY4zJnOq0DATNHk2Lm+Lw2T6Nvn1UiBUhURYyu6ebe1E2NUiIHwVlS2q?= =?us-ascii?Q?FvS605X9LaQcVG6x4OGqsc+rCvLIAF6bqxW1xjszgGLnFjm0iWfK7TobbPsE?= =?us-ascii?Q?r6uIuIKHc+pngoXvl6iGm73CgBjfpQfhd+aM46wXeutz/Y96kEfoW8ylMQHY?= =?us-ascii?Q?rskn/GtTKLP/zKy70ACFXBTmqDvALqky+UqtdWuZBj3Y9znVXXppId7yqW1z?= =?us-ascii?Q?o95hsGyah9Wem0h+yImKTzwku3rl/jKPJ5FyVQO0kvofP0XdOxYZ52rYX+tC?= =?us-ascii?Q?Xuhjx7oGtmcUx/AHCJ5p5m/CH4wz4qhHeNvDGHZo2HKcJb0uhsSm7O2b68pi?= =?us-ascii?Q?YglCoD5rEE+tuDMECt2FoRVkk2i4uQ0xaHp1zSz3qLVM/dXRHr5tlqxosSgf?= =?us-ascii?Q?VIwiV95xp5l8qnVc2vdROo0cerGqXbI/59Vxa2O7VqjPxLt1wJ67ZF0NbJ9V?= =?us-ascii?Q?kF+WKGO2kO4=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR11MB8107.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vZNPBQ7HPUOeO5r972sZ7mbDUj0xrXgy4Qzu7Cl7CSNvzwKP5B5fY7mo++bz?= =?us-ascii?Q?edpRIHL5zOsfvz07yhRxQZv31kBnZ9FhB6VBa9CG/3lJTZt7MxoKjzYcEKvX?= =?us-ascii?Q?pYUpk9C/wCL5FWXllJfX86pzmHLawxrP5bkLvAoYovlsKCcPX67iBffhlhr6?= =?us-ascii?Q?/49uBWNveBhOp75iLA5QERjQJUg0UWhMrpnjxNJNwxg+fNyqLskl7TL6qSve?= =?us-ascii?Q?X3IUW/nqxCrgVfz4/jIpJnYYo5Y2u4yU5Gr2Lil3LQHJBNPq//o6sKmlH/Lu?= =?us-ascii?Q?BtiEEXbPbXT2BEu6/5rjWiTEatjb7wcCx7sjdko4Y1x4C54vS5Sg5h5E481z?= =?us-ascii?Q?kAkHRC/7Lx0omx1c1mK33Jo0WHhcVxbH2064AZ5DkFPOvde8qP6StoHRN8ee?= =?us-ascii?Q?Ec46+47Ue10Tj4mmfLg9b9cJiMy6+/7IxoL7q/shFPRo1DBDzIrax072tWpC?= =?us-ascii?Q?q0LrRr/xjutjjmi+iklnOTekrKJ4SUZHiIlptverQh2Pzi5Gm7WUxVNNfL7X?= =?us-ascii?Q?L/UWn8NUl/+uRlMOuXzuKx9uHn9hErfIdk4lxs2KhDr81P0RY9APyFlcndbe?= =?us-ascii?Q?a/jxacA3C9UIGnpJfPYIxXl0Seos8cVFb1/Wbwxd8NpFUwlhb76QILkSanjo?= =?us-ascii?Q?nnVvXXg20FWQH1NKQ6DBfu/Lf4yEacF9byWQYjZuvAuzwDonrOPhtEflgd08?= =?us-ascii?Q?e7PSCbUkpbohemCD412uJwphmuCRzbIjGX+TewhItc6w9mCcuuC87RD7Jy6M?= =?us-ascii?Q?dsRTkI01elYoC7NkBmoQe6TvYkArSmC8mY0Bvdj+52nYojk7AfyMcREtw2OJ?= =?us-ascii?Q?s7p/paT258pMox7OpkDjn+yk8yTqLeVa1AAV+O277bz3/whpq+P8rEKiIkI4?= =?us-ascii?Q?tXG0oqkB+JCOYyhdbmJn/flF8mNBDSO/Onl9aNSVj+UPeXkuRSzG5pFDkkjT?= =?us-ascii?Q?VrbH23zbRH08Q5v+aNjfSE7a/VWJqIJyHgmGHqNit01gX4zHqRqs6lTbKWvz?= =?us-ascii?Q?DgA8jHHFO4/EjGOmX9YrK6kTHhGns38Dw3c6W4InSlC95kAadB9hq0dXoqIZ?= =?us-ascii?Q?t0395/HgjmGsk/tXjZrlf0Kd2y4gFcmJr/yu71hanM1PeVkCG9+/9goSMgq9?= =?us-ascii?Q?xRZt6nt6c4X+dPFMQ4dpHfEEf5YlfYe/ZSlr08Xf5oGCzdzDWxME0TOLP15v?= =?us-ascii?Q?Exdy3dDVb6jQuLJVd5Do9QyyccwjDkC95tHKACnnPO5vRTK0HRxp9IsBIv5/?= =?us-ascii?Q?Aycp4Fvil3DTPlTdiiiQXeY+Uu6gv7p87d+tvyxXMsTVbrdYU0DhE9EOZeEL?= =?us-ascii?Q?OWUMn3VM2S/6qwMxfB/Iz5pq3tFQLqch9Qaw9+wzUSEjetBGScb8Mko2tps4?= =?us-ascii?Q?HXvdffF3S/8RQSLuALspja+bExqnH70u5e0NnK7Meqlvat7G4JtO554CM881?= =?us-ascii?Q?G2DkeEN6kL5cAxaSs4cPUyNBPIrRbb/j9a2lnVpU4LSfmrChKNBhtiOWi2Tx?= =?us-ascii?Q?DaWPbdEp2wfedVBx+kTX7j4nYnV6dOZ6qVKjD9UP10oNvtxU6yMZMxWIIbfE?= =?us-ascii?Q?z3QSGLXa384qwL5HBCjXzf2dkXl1g/hztH8YM53+0fvPAH3D3nWRtJQVEiyX?= =?us-ascii?Q?hg=3D=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: 0f89187b-a4d6-47ee-c142-08ddaeeec188 X-MS-Exchange-CrossTenant-AuthSource: PH8PR11MB8107.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 05:04:23.1242 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 9Zs6OfOVjHmlR/BMIJwA5R3QC2Thk05uWl4/X6Hl5vnszLuMtEJXHB9bAVhoVfZQNJCfYqdb1AjXGloJSwrml6TM9iqJEdmGcfTITKonnro= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR11MB6819 X-OriginatorOrg: intel.com Content-Type: text/plain; charset="utf-8" In preparation for converting to rw_semaphore_acquire semantics move the contents of an open-coded {down,up}_read(&cxl_dpa_rwsem) section to a helper function. Cc: Davidlohr Bueso Cc: Jonathan Cameron Cc: Dave Jiang Cc: Alison Schofield Cc: Vishal Verma Cc: Ira Weiny Signed-off-by: Dan Williams Acked-by: Peter Zijlstra (Intel) Reviewed-by: Alison Schofield Reviewed-by: Dave Jiang Reviewed-by: Jonathan Cameron --- drivers/cxl/core/hdm.c | 77 +++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/drivers/cxl/core/hdm.c b/drivers/cxl/core/hdm.c index ab1007495f6b..81556d12e9b8 100644 --- a/drivers/cxl/core/hdm.c +++ b/drivers/cxl/core/hdm.c @@ -764,14 +764,53 @@ static int cxld_await_commit(void __iomem *hdm, int i= d) return -ETIMEDOUT; } =20 +static void setup_hw_decoder(struct cxl_decoder *cxld, void __iomem *hdm) +{ + int id =3D cxld->id; + u64 base, size; + u32 ctrl; + + /* common decoder settings */ + ctrl =3D readl(hdm + CXL_HDM_DECODER0_CTRL_OFFSET(cxld->id)); + cxld_set_interleave(cxld, &ctrl); + cxld_set_type(cxld, &ctrl); + base =3D cxld->hpa_range.start; + size =3D range_len(&cxld->hpa_range); + + writel(upper_32_bits(base), hdm + CXL_HDM_DECODER0_BASE_HIGH_OFFSET(id)); + writel(lower_32_bits(base), hdm + CXL_HDM_DECODER0_BASE_LOW_OFFSET(id)); + writel(upper_32_bits(size), hdm + CXL_HDM_DECODER0_SIZE_HIGH_OFFSET(id)); + writel(lower_32_bits(size), hdm + CXL_HDM_DECODER0_SIZE_LOW_OFFSET(id)); + + if (is_switch_decoder(&cxld->dev)) { + struct cxl_switch_decoder *cxlsd =3D + to_cxl_switch_decoder(&cxld->dev); + void __iomem *tl_hi =3D hdm + CXL_HDM_DECODER0_TL_HIGH(id); + void __iomem *tl_lo =3D hdm + CXL_HDM_DECODER0_TL_LOW(id); + u64 targets; + + cxlsd_set_targets(cxlsd, &targets); + writel(upper_32_bits(targets), tl_hi); + writel(lower_32_bits(targets), tl_lo); + } else { + struct cxl_endpoint_decoder *cxled =3D + to_cxl_endpoint_decoder(&cxld->dev); + void __iomem *sk_hi =3D hdm + CXL_HDM_DECODER0_SKIP_HIGH(id); + void __iomem *sk_lo =3D hdm + CXL_HDM_DECODER0_SKIP_LOW(id); + + writel(upper_32_bits(cxled->skip), sk_hi); + writel(lower_32_bits(cxled->skip), sk_lo); + } + + writel(ctrl, hdm + CXL_HDM_DECODER0_CTRL_OFFSET(id)); +} + static int cxl_decoder_commit(struct cxl_decoder *cxld) { struct cxl_port *port =3D to_cxl_port(cxld->dev.parent); struct cxl_hdm *cxlhdm =3D dev_get_drvdata(&port->dev); void __iomem *hdm =3D cxlhdm->regs.hdm_decoder; int id =3D cxld->id, rc; - u64 base, size; - u32 ctrl; =20 if (cxld->flags & CXL_DECODER_F_ENABLE) return 0; @@ -804,39 +843,7 @@ static int cxl_decoder_commit(struct cxl_decoder *cxld) } =20 down_read(&cxl_dpa_rwsem); - /* common decoder settings */ - ctrl =3D readl(hdm + CXL_HDM_DECODER0_CTRL_OFFSET(cxld->id)); - cxld_set_interleave(cxld, &ctrl); - cxld_set_type(cxld, &ctrl); - base =3D cxld->hpa_range.start; - size =3D range_len(&cxld->hpa_range); - - writel(upper_32_bits(base), hdm + CXL_HDM_DECODER0_BASE_HIGH_OFFSET(id)); - writel(lower_32_bits(base), hdm + CXL_HDM_DECODER0_BASE_LOW_OFFSET(id)); - writel(upper_32_bits(size), hdm + CXL_HDM_DECODER0_SIZE_HIGH_OFFSET(id)); - writel(lower_32_bits(size), hdm + CXL_HDM_DECODER0_SIZE_LOW_OFFSET(id)); - - if (is_switch_decoder(&cxld->dev)) { - struct cxl_switch_decoder *cxlsd =3D - to_cxl_switch_decoder(&cxld->dev); - void __iomem *tl_hi =3D hdm + CXL_HDM_DECODER0_TL_HIGH(id); - void __iomem *tl_lo =3D hdm + CXL_HDM_DECODER0_TL_LOW(id); - u64 targets; - - cxlsd_set_targets(cxlsd, &targets); - writel(upper_32_bits(targets), tl_hi); - writel(lower_32_bits(targets), tl_lo); - } else { - struct cxl_endpoint_decoder *cxled =3D - to_cxl_endpoint_decoder(&cxld->dev); - void __iomem *sk_hi =3D hdm + CXL_HDM_DECODER0_SKIP_HIGH(id); - void __iomem *sk_lo =3D hdm + CXL_HDM_DECODER0_SKIP_LOW(id); - - writel(upper_32_bits(cxled->skip), sk_hi); - writel(lower_32_bits(cxled->skip), sk_lo); - } - - writel(ctrl, hdm + CXL_HDM_DECODER0_CTRL_OFFSET(id)); + setup_hw_decoder(cxld, hdm); up_read(&cxl_dpa_rwsem); =20 port->commit_end++; --=20 2.49.0 From nobody Thu Oct 9 08:12:59 2025 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 42921241696; Thu, 19 Jun 2025 05:04:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309482; cv=fail; b=ilMEpR4yJKKs3CiWCJnXZDV2SyjzXGf5CnSp/RUYZpP2vx1RV8Qu4E7UfHJzFapI4a0cbpOiTakXWTWbVeTcgH4w7G3c2e84GhnWzJBDRoAPzalJbPXctg+Kcr2p9O37uDVZ5iIOvePioXVO9AiugWjcnAL7UB9/TmkJli2U+sk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309482; c=relaxed/simple; bh=RQwpJswR3W4YPV9mRDhvq434UlFUk1RMTW/cNuPzrZU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=HThgXyf2yeNYRn27JYxXqgh3SUB7xdRRkQsvMKJS3n1i7494XttVOvMbgydvt20q/i9Mlzf4+ZP5BO+/tQHbFakbZFGilPBpdVx8SdjWJJyh9HLEA2wKvO3Znd2RT0RHwMYcnwGwgCkK1EA6RRYnFh/+i58r8jCrqIndMGzBVpg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=AY4zKttu; arc=fail smtp.client-ip=192.198.163.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="AY4zKttu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1750309481; x=1781845481; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=RQwpJswR3W4YPV9mRDhvq434UlFUk1RMTW/cNuPzrZU=; b=AY4zKttulFiwrPHIXi0qgj4Jb+7QOzSDoEfDksa0rIx7HHe0BmwGM7P8 Pz+r2O2SkPeniqMxNax71rKAy7I70LFr4KG6PpKoUbhIOzduYuy4WSZtI lRnTUoWuJ9R6wdgtz+juRIKChIam8f0SHmgrP1yyeCLQ3GqCeBVCl5YjC 78NlOa3KuoRKFolfYEF0dyAxd62Ae+ztDIV2IawJKh/eq+0s7iqFof6bh EJio01MIvN+O6RJrr74DZbm5++PWp3ik9zq8ax/CPLO0yuMnU+Rdr09DX a7+Hun+EeNqva5u8GOs3q/H05secXGPusZTVVQFDICIUMB3jwyjwGKlWd A==; X-CSE-ConnectionGUID: HOvMtG59RACrxNjC9WQnsg== X-CSE-MsgGUID: /dRVZATrTg+lKt54hUjYUA== X-IronPort-AV: E=McAfee;i="6800,10657,11468"; a="52702200" X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="52702200" Received: from fmviesa001.fm.intel.com ([10.60.135.141]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:34 -0700 X-CSE-ConnectionGUID: LlS8CE+hSwmPu5EE47Ph/w== X-CSE-MsgGUID: 54LwvhaTRQSZQnp+Bi/t3w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="181373558" Received: from orsmsx903.amr.corp.intel.com ([10.22.229.25]) by fmviesa001.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:34 -0700 Received: from ORSMSX901.amr.corp.intel.com (10.22.229.23) by ORSMSX903.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:33 -0700 Received: from ORSEDG903.ED.cps.intel.com (10.7.248.13) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25 via Frontend Transport; Wed, 18 Jun 2025 22:04:33 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (40.107.223.42) by edgegateway.intel.com (134.134.137.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:33 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TORPH3CG+IKDYeTFp4QRJ7QqRW1UMV+MQG7/074P3NntFg9SWlvcx5YUumiPQgx3s8f6m7SGL6GMwUNtV+N8akdbZDbovcTh4D28lwCUBI/B9swVx19ZWQDnaATztja+gjP9IoFHRGpM2iQvBnva+79S+2fPO0da5hbw53FWGjCUrj3CQyKj0kma+NV9ldDTMSt6n2LTW+thR60vfeTOiPl0gMbyfsgqajaxBVJw85x16Lnmj21i5KInaW0XAoerojg1YSSBG9y6WLbIpziLOi467kSLxljQHZxlUFMASA7N6gBlGJfSRe1EUHCZg5tIkWEsxcXdgArOruaiNdmn6A== 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=R897TBI1/7eUvV3mdqm4x3pVyqXwgC4Sq7zDaH81WBk=; b=K8bwBuG1Jzf8Qu85zGKGDYCa3TpPPrRJ2zN7MyoqhMHiVhGHaDvjwMOaDqWNWjNUsi9FDOo+e7KuWsMNXuyEQu5+qHumuDDfnUTG7kjVs98PSpPs9YjWaE4bpTK/NCGjKNYfwMVI+btPxKK76WE9b71PqK5f8ypgp/V4VGqmfmPfVuu1bU6j3awUqXKuAM6IhTYwCyP6aEcIiueH5o/PueVNx0WZcpFaS08O3dAAgoGuyhlU3EaSIAQEtcI0PkQkZ+SgSFDbC0lHDxWXpDsWW0yo25LMB8sfUjzJ0sHwnxKXZq2U/4BaXlWPt7acJoHPgV+1HIOlSFXIzcaM9f22yg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) by CY8PR11MB6819.namprd11.prod.outlook.com (2603:10b6:930:61::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.27; Thu, 19 Jun 2025 05:04:24 +0000 Received: from PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8]) by PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8%6]) with mapi id 15.20.8835.027; Thu, 19 Jun 2025 05:04:24 +0000 From: Dan Williams To: CC: , Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , "Vishal Verma" , Ira Weiny Subject: [PATCH v2 4/8] cxl/decoder: Drop pointless locking Date: Wed, 18 Jun 2025 22:04:12 -0700 Message-ID: <20250619050416.782871-5-dan.j.williams@intel.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250619050416.782871-1-dan.j.williams@intel.com> References: <20250619050416.782871-1-dan.j.williams@intel.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0151.namprd03.prod.outlook.com (2603:10b6:a03:338::6) To PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH8PR11MB8107:EE_|CY8PR11MB6819:EE_ X-MS-Office365-Filtering-Correlation-Id: db782686-bca7-4474-fd55-08ddaeeec21b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?VfTq7JS+i/S53rsrDZU/I8WuJlCzJBdxR/A7wnSCGhwniIutaIEzLrEFWkei?= =?us-ascii?Q?l1LviEF/VNxQJUGprmkGClQgZrubPWVliCyHWO5mvf/J4DZOI0gGfcxTP4CE?= =?us-ascii?Q?/kWbT8gMTXYoG9FeLuUMWIwx1930SbzM/C6eBoecANmthlYio/UX2iIykmvx?= =?us-ascii?Q?TnYcKvlPyfRxzNaY+4WnPgiyBxCsO1QEGBDwJ3UyAOcnzCwhXabzLA0fRZox?= =?us-ascii?Q?PbWGEWE83zp5v9QAoEpH9LsImGni9tyr1khWBSoPt0vVP2mJLtaGpd1teTVW?= =?us-ascii?Q?YyBY9YgSjzgEhDIcWjz9hxzsoip12UagE4O7OeZGsgmGMO/WNB36y2iu5+Gx?= =?us-ascii?Q?mMGEIfk6BMeV6MlpL3BQo2MMD3bOUECTYVOPCNAWKEhks530J+C2gp/slT59?= =?us-ascii?Q?fk6nV8VHXz3MZRi6TvrbR9B/HR8B/G2q+tS/lSTA4fAdNLrIR+fNn7HMezas?= =?us-ascii?Q?yhekTNqJCR1YPQyCSbozFd1cZwQCF9UUsC4d3n+r0E3ZX5wKptoItM7PCbAN?= =?us-ascii?Q?7I5XaJ/cA+og8T/Pz6XFfRvs0zgAkvbxEzNqYLj6cJ30Cd2o5bRA/NzXyJLx?= =?us-ascii?Q?qOlhsF7deu13x5qtjZ70FVEjFoIFmTnb5GGEBT8JrCiqn9u7FdpQWiFiSjbd?= =?us-ascii?Q?0dtqHn2mAx8Y7d+iaiavdAOL8Cr1XsbhPhXXt3QtEtMB8rPPio2jA60XtqTW?= =?us-ascii?Q?MCiIVJYhH478XVZ7ABwN8LN4cL7XkiKNH/VS8iiaoL0uhrGrHU25TznvD63D?= =?us-ascii?Q?xWY2UaY3Aeyjxttn0Awli5KojdwBierruAEuTyTTBfYZJnzDr1kmSO5w4+9d?= =?us-ascii?Q?hGVcTyiW99rMrlcAj1KeSqaLk0+9aIqo74c3xpsvQ4V/I5ok5w3Rv+1rCMuH?= =?us-ascii?Q?U890bJC+V1kAutNRE728GVAEziAm/s5niSrAonHvuEqS3w/lZroz5OTMyISL?= =?us-ascii?Q?2txMRb5F3UzodhbuR1DqI3Ssw3xihaMmX+kNO6yrlLdv1aEYTLITb2sEDBUP?= =?us-ascii?Q?eViEpdVkGLYpi4bSAYogqwpfEyQBpX/JvYXFsxg59wn84ENswL7FV2Zhf5cw?= =?us-ascii?Q?ujgRBKFmH8SzZmMFGezmjsCtG+fURlLJpXWJ3dL0piXgDELvdFgwsojR+Yky?= =?us-ascii?Q?ICrxgSEyMZG3Ey13wlGHiZYRPoeuQKCpK7VfugMD/w+EQNqycoZpn9iDB9Sa?= =?us-ascii?Q?/Itb41pVfH5h2LvATZikyLXz4zBTlw3J0TKorchXI2RDJnH4SfI/y/J2ccGD?= =?us-ascii?Q?P/Z4xBv7axlfw8BQeXN2YDaaptkfAfy7YArdQ97X2N1NmBp8EE8aDzbd7lau?= =?us-ascii?Q?WviOKrqARdWebUSb5hnhsZnKQp4icrn9kboRjY8MdOsA5mcmxSMPTgas+qKj?= =?us-ascii?Q?FF5+1pNLe1KycDfL5FlLTRV/DUN2+bXaQ+fJakcuHERjrLmvq+LyfVkYGyhk?= =?us-ascii?Q?/aCNb5mIdos=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR11MB8107.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?clw3A/KHcRklvCtkSP731R4P9jypGYqclS9P/BR0gtpBswTVon4Xxm8yj9bP?= =?us-ascii?Q?daMtOs0Dsn1T2M+n6TcOskvUOCoIQKdKB4CytcNN54/ZgyFYpbj6UsZfqaPU?= =?us-ascii?Q?gd+U3M6L72dPg3ZmytDXpAox1q5URtSJU3ywM+EP7W/MVl2AdcBVIlW2xUXp?= =?us-ascii?Q?7MObaqBz8E/mwU8b+LSwX++Bx4vqW+8LliLc7M+mPBSogcoHIb9VlYTbEfg0?= =?us-ascii?Q?SFOg7QW9oejhhdaDThvv+PyK41XE9mmYzTNCCo1e9Z24QjM+jOcLSDNUO1ge?= =?us-ascii?Q?o6oHTnjxm/Gnc432C9V8xVY029Zyafs51Rjbz/zpNEWmc50FebSB4QtudAko?= =?us-ascii?Q?hyhyMB6VPV6wZuuAmqs7d7DgX4+GJGggjMRZXr3TAAtbFsFlxqgsDYmB9xnc?= =?us-ascii?Q?psvMPOEZwvHKJCyPmTGh28utfYkDadVACqQOT4+zcZQrg0XnOON8zJXWP1HE?= =?us-ascii?Q?Vj0L8R3kWtPpvTd46sUhzMPeV/pKpNsceWqzAYsBdi+qHh4la9GMVpA9Id71?= =?us-ascii?Q?jciO3h4BfwJLEV9KgRMHZz6ib8Va8e/7piHQcW8XPb+TUfZtLPu9nd4konfD?= =?us-ascii?Q?iKODfET5F8FY0rXgRNov5ES8C8BDHa2cblBIzgogC3IX4DjeaYHimsY3OhOE?= =?us-ascii?Q?W7F7Inbhral7IWIalEcx8NQlsnYK9Jz+mq2Atnbh1H0LFmWN0iSPIpZWUf3I?= =?us-ascii?Q?NSr9I6mIkPFGZapAKqsk0hCPJzLDMcF5hsPFqXIFjl3GluFoEgUwLV6wwmDf?= =?us-ascii?Q?HtjmVvUmM6N+ikn0vxDNLdWjZlGuEYAQYlvwymTyqHjzo1rN0YefreS9cyGH?= =?us-ascii?Q?Jdf4EccQFzFLnLpeg+Q1pADElmEhsz/ZAoizkou3A9GXOPpbPj1wrP8I4cJP?= =?us-ascii?Q?eqg5ir7ZEh8esQLwfCNzARqgB3J8dA3JvPzsQgF8BZUMzC9fBncqf0vHQWlH?= =?us-ascii?Q?cu2Dl5ZGBi68oHLITIJBwqqf5nAFPxgbEGKCvTnEvLomCD+VHoVTpA1G/vdV?= =?us-ascii?Q?Tz67i/maIKhT5VAHIRqVavaXbF6gQ8GpXwgsnwNn8U0t37OgFRAMLQLnYpFr?= =?us-ascii?Q?g6RVMTFfck8k8aTBgUv+yogzJ0SHT4EVo0Bl+iTHctYKDYF41ps+SD0i7C+H?= =?us-ascii?Q?9zwSQY7FBQuEOHvYgDg/X1zue3fUvIoRAKmsh81j2OCD9CXhFCtXq77LllGv?= =?us-ascii?Q?xHu5TBHuYBfbYQtR2x1UbVkcopFl3vgzwa3rkEnYyuqUKQULQuy8U2JENieV?= =?us-ascii?Q?Z6IY67tmkm/ZB2O0u+RQ/+ztqqeagyeKoL7rjXpgpmvSrB0WZjs+eqbS6GWb?= =?us-ascii?Q?BFN4aO+vrGkJhBDYnDtmVj7VG3rNVk9TeHx3ZVFLRVvQjZmd1JrYfvSuYInW?= =?us-ascii?Q?O0NkKPf2zmZNNlWZBXA1000JylB0ez1ltUoiAKGOuTESyhxXbx6c1i9Fiqzz?= =?us-ascii?Q?m7rACFteuGBTvaXPmtn0sfXLfSnPgBiDbYKwwX5nhuq3pKoiK4PX5mfEzjJk?= =?us-ascii?Q?46jMZ7j7Jq38nWbXM2by09wSpoUrCy7SqXX6dkv6k/pwDBM8mbIEfz/3A+Tq?= =?us-ascii?Q?ImsBi8Db1QIjyVRMbhdwSaC5rBZicDfJIUnVm/DbyhzYi7Z/hw48sd/Wno0J?= =?us-ascii?Q?PQ=3D=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: db782686-bca7-4474-fd55-08ddaeeec21b X-MS-Exchange-CrossTenant-AuthSource: PH8PR11MB8107.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 05:04:24.0824 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: P29yHO8a8vfRajowe7MwFTDDFTS4NLjI6RGFbg0RSkeWZUV3C9Yxh8AVsOildD3gwjHt4S9SJVpcKZvjquforumOZO+SnEgxaaiNHNN/K9U= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR11MB6819 X-OriginatorOrg: intel.com Content-Type: text/plain; charset="utf-8" cxl_dpa_rwsem coordinates changes to dpa allocation settings for a given decoder. cxl_decoder_reset() has no need for a consistent snapshot of the dpa settings since it is merely clearing out whatever was there previously. Otherwise, cxl_region_rwsem protects against 'reset' racing 'setup'. In preparationg for converting to rw_semaphore_acquire semantics, drop this locking. Cc: Davidlohr Bueso Cc: Jonathan Cameron Cc: Dave Jiang Cc: Alison Schofield Cc: Vishal Verma Cc: Ira Weiny Signed-off-by: Dan Williams Acked-by: Peter Zijlstra (Intel) Reviewed-by: Alison Schofield Reviewed-by: Dave Jiang Reviewed-by: Davidlohr Bueso Reviewed-by: Jonathan Cameron --- drivers/cxl/core/hdm.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/cxl/core/hdm.c b/drivers/cxl/core/hdm.c index 81556d12e9b8..e9cb34e30248 100644 --- a/drivers/cxl/core/hdm.c +++ b/drivers/cxl/core/hdm.c @@ -914,7 +914,6 @@ static void cxl_decoder_reset(struct cxl_decoder *cxld) "%s: out of order reset, expected decoder%d.%d\n", dev_name(&cxld->dev), port->id, port->commit_end); =20 - down_read(&cxl_dpa_rwsem); ctrl =3D readl(hdm + CXL_HDM_DECODER0_CTRL_OFFSET(id)); ctrl &=3D ~CXL_HDM_DECODER0_CTRL_COMMIT; writel(ctrl, hdm + CXL_HDM_DECODER0_CTRL_OFFSET(id)); @@ -923,7 +922,6 @@ static void cxl_decoder_reset(struct cxl_decoder *cxld) writel(0, hdm + CXL_HDM_DECODER0_SIZE_LOW_OFFSET(id)); writel(0, hdm + CXL_HDM_DECODER0_BASE_HIGH_OFFSET(id)); writel(0, hdm + CXL_HDM_DECODER0_BASE_LOW_OFFSET(id)); - up_read(&cxl_dpa_rwsem); =20 cxld->flags &=3D ~CXL_DECODER_F_ENABLE; =20 --=20 2.49.0 From nobody Thu Oct 9 08:12:59 2025 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.13]) (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 9F13623F41A; Thu, 19 Jun 2025 05:04:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.13 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309477; cv=fail; b=ml/pmp3Z0clpWU/R6LTctJ1B4MKhjlNh2ytCPnKXIiqIdL8WGfyL5ovPwqBqOUkv4qBADZmzqM0+rwfs2eWU19HJ+wH84ktj18M7P7w2bqiGNhFIWK7RsFOJfmsixieMeVv0QyKGEptbPjePNvjoLnRbkUKYL7X8L0YtiHc1Ma4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309477; c=relaxed/simple; bh=qqz99tpXxQ1FnaJimso3aN4G7/qT2fk17WTtawTwdZI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=bHZm3jLv8MYN+nTusfC/M0nWUFTULhGhEX6bgoB1JLGDj2WZzX/iiOKq07VTWaCH27HkCogwEmFRy+TdwbHAflRqjrPkpP8qsrX+o0Y1Zk/uzJz2evZcZQVbr2s7o1ZhoJ7u/273fQjs8gLodFrFuTsmEfM5Pq2xl1lJEJ2WlYI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=GbYMJf8z; arc=fail smtp.client-ip=192.198.163.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="GbYMJf8z" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1750309476; x=1781845476; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=qqz99tpXxQ1FnaJimso3aN4G7/qT2fk17WTtawTwdZI=; b=GbYMJf8zpgsr4v/6/NVUIFPh9VAYotw9aJHsBXi3BdiBrmbPgNeIDDHQ eZvhmP+gh5/TiLeXi56jBcOJz+Db6i9V+7mfm6Mi3N13EVdDDUO4ODZzi Kf7czXxYP2zT4ioRbZEZi2N6hjf6Dz257wexLRSkWan9IG78blyuuRqCe MYw9fMRn2fIwPishm/1chwa1kHX9+H7ujkdva6xw179ktnDcWBxOw3LlC 2+7XXjM+D1onuTQBylTl51OrxDEziSsdT4oOfhbAZg4lJpt1cnmlD3IRa 6IM5oByPw+tSDoJdFGaLXLDXJqdf/0Ij5oNY8nBKobHEHIflRfGSsRdtR Q==; X-CSE-ConnectionGUID: nBF9m1T5S62xVmhWsmXzfA== X-CSE-MsgGUID: fS9PDD2HR8a62Nec2/sRrg== X-IronPort-AV: E=McAfee;i="6800,10657,11468"; a="55181531" X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="55181531" Received: from orviesa001.jf.intel.com ([10.64.159.141]) by fmvoesa107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:35 -0700 X-CSE-ConnectionGUID: 02zHG8G7Ro+FjjVP2t06hQ== X-CSE-MsgGUID: tm6LYAICSjeXona6R7KDHQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="187666900" Received: from orsmsx902.amr.corp.intel.com ([10.22.229.24]) by orviesa001.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:35 -0700 Received: from ORSMSX902.amr.corp.intel.com (10.22.229.24) by ORSMSX902.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:34 -0700 Received: from ORSEDG903.ED.cps.intel.com (10.7.248.13) by ORSMSX902.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25 via Frontend Transport; Wed, 18 Jun 2025 22:04:34 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (40.107.223.42) by edgegateway.intel.com (134.134.137.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:34 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OlqGsgSKEHIRQFE15AVS80VVd50igFWbogqfGLmYVdA/TsGP1X4cKqJeugXprnJMUVOjeUUh6aMpGLx4NLQQNav9fWIeivHuQlAN1+x2VdejePeJTVa/Chax0hTq+EWiv2yFxOgDsnOQIppFlB+G/apvTToQQkDVrAVPJ6YoytyiGn/avzIPV6SH8yQoL/3WjlIY0baFK7LzKFmEbIiYOOeg2WQmNzD3Zx2Wbr/etN9yco186BVHLklHFc2WmOsPWJ6F/DLFhJVAUygQDt4Eh15qDXsC2cYXDjz6vJaYtrIJCZGcBE5gwHQ01VgZA2Y/qcipkewXqh6cbOd2Yp+G7w== 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=Z9xTOPKypWGU2HxVBxthpkxuNtnMXeObcTl34FnkjkM=; b=egGtq7lv5smF2EESiQgPUAK8zDfnRzWC5zUbppWbTEszFgw1JMwBGeYqNqXNIgZlO3erWIh4J3yi171m06uOCpa3MWt3v8bt/6C9emde1p1VaqVr8jEWnpTvZkR1cxdx3IrcDeHXw8XePhdA9EF8DgN1St/qoO/uyJx7pEcwRzzD8Xktwfd689Gskv0WSJfGDEQcgyACEeIoskLuqyeq3NjJp8Gev2Z0uE+iIAs3g7yEQ/Bdp5pTiC8bAicbFVLZMCTmlntLmhlQIeF75yxqZarZFmUIbFxrAs6uX8mM2B9VcqrivmZmJwlRh59HtBc8vz4TqvR8LeAMRW0foqteGw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) by CY8PR11MB6819.namprd11.prod.outlook.com (2603:10b6:930:61::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.27; Thu, 19 Jun 2025 05:04:25 +0000 Received: from PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8]) by PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8%6]) with mapi id 15.20.8835.027; Thu, 19 Jun 2025 05:04:25 +0000 From: Dan Williams To: CC: , Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , "Vishal Verma" , Ira Weiny Subject: [PATCH v2 5/8] cxl/region: Split commit_store() into __commit() and queue_reset() helpers Date: Wed, 18 Jun 2025 22:04:13 -0700 Message-ID: <20250619050416.782871-6-dan.j.williams@intel.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250619050416.782871-1-dan.j.williams@intel.com> References: <20250619050416.782871-1-dan.j.williams@intel.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0151.namprd03.prod.outlook.com (2603:10b6:a03:338::6) To PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH8PR11MB8107:EE_|CY8PR11MB6819:EE_ X-MS-Office365-Filtering-Correlation-Id: c27d6c30-46d6-42d8-7dae-08ddaeeec2b2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?VRyTXcYtT9EJYRkB8mA/gYqZK5b0l+v+3eNadoEK4lFWcGsQWCuOvPQr4d6d?= =?us-ascii?Q?m9L7EmQL7+QIblMeEjeZC0JV8KEZ3cMLjIjEHaz7RtTAhAo/2WEl0oxJWEuq?= =?us-ascii?Q?WKJED3mump8sbzpsSb4RSWyyHeAO36UB+G82g+nPuAmrF+V/De0x+CvMCZuR?= =?us-ascii?Q?F57Q+W1dKswd4XjNUcWrHWnoADYnYAloCMKnj6venf5tm+lrcWRpYwYgBE7M?= =?us-ascii?Q?j8upg2B1ZTsoHdyvFbfFnk0Yq/7wpiGsU/6OCGLz1wwwExS8U9BTBzVxGsYn?= =?us-ascii?Q?CWLQaj2oooGhLq20xrvf+g8KtUj/KXBJBX74GNL5By2WmEz88culJqqLglB6?= =?us-ascii?Q?WFGF839e9h99Sih+6a8gZGgUpbxnzKMBZAArSmx0VEumAoytgDsu1G7Y9mlA?= =?us-ascii?Q?kcMzFEVSUxikXV0irVWMUNx0LBVLw5cWAXJ9aiGqAr6FzmmbbCBlsD36sRsB?= =?us-ascii?Q?QfEuywNil4qQCpA6nWUKxZKnhsoNiU9OQ/i0FSbNx44WNoemSLIDrZx7U+9L?= =?us-ascii?Q?Jxp51KTkFMhMv1uGmP/t/dHOLwFqDyeWJQt7vWdfSougD+FjqrAmCHNu9y5A?= =?us-ascii?Q?sk3qWDgvaydBW0wpxMlgpJrFrFI/KWaOYtCZ/TA51fOjFslknoButE64sHjY?= =?us-ascii?Q?ClyVGS+mtZ2PuThqj2yMk0bOvZzew0rlWy50cNQEFkIU8kZKe6SZqdm5qnQq?= =?us-ascii?Q?GPeao1extfgWCZlQQqR6zKOXt728lN3d1/HxODKM7t0kCIPbatlljeQJ5euO?= =?us-ascii?Q?eUuQ39E4crY0li8D0DYGoWk5N2OOWzJJn1jFTHDtyYov3dS6Ws5h0MZe5A6A?= =?us-ascii?Q?8xWy1Bt31PoC30hlWe4Zrx4n9uq3B36uRUYlS+XS+s66cBV6CVjZRHHY++H8?= =?us-ascii?Q?SAYQe1KxcjqJTNIpcrnT9T3lhciizhgM7M2Otze3KFm9xnnFkGURBbe6zQUK?= =?us-ascii?Q?Mu3GlV72l+WcITUJaRPle4WCBPv08SnH4ggA7UHy+QcAob/plrKOLfrLCsyW?= =?us-ascii?Q?K9aOBJoaQ2VR/nO9G2WU+huKKJOLWziPe8pZnaC8XkmVcYbgHKE/iz/EWuS0?= =?us-ascii?Q?hIz/juVzzdLq3qPYBA15pyyKHDqQ0Mtw7ADjBgYZQbN9y+xnK9m2+PI9Yr68?= =?us-ascii?Q?n29HmeIh359W+BBpjKavftENl9+4Yad6rd81FCyzxZP9kFEkkN0OIQ8ChC6R?= =?us-ascii?Q?DXyc1KicoprShgMF+v2cL3Fsn1dxMoZRor5UngyZB/boBlKRsVvDquldLDQQ?= =?us-ascii?Q?oez3m864bdjAJhNUCB3XTeWkfusNNjwZIq5hHg+6YKaACdpul+a66/vdLSPo?= =?us-ascii?Q?6HXk7XE74LqkKP42BMHNTrec86r1Bl05gpz5nQG4n5yzirtSXhitwqLQ1LPo?= =?us-ascii?Q?kzU9osTuo5lCEshm2Ryz8RQaXT+1sIbuNy2Df/x7laGNheHBfQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR11MB8107.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?wq899Z6wLhiWgrHU9dzexnogQVeHlb3t3Fe6ffQzR9/vLIkT5y3tCYGmq8/M?= =?us-ascii?Q?GAGmtPY4toTZxyxgTcGF6CWkPjkm7WynR2PBQDzuIE11dNPmSJCOFc0M96//?= =?us-ascii?Q?JJLLHSpKS1ZbuHCtrWM5ObtZ+sabDHZszjy3RTXOGFXfu0GoxkFBGpe65oqz?= =?us-ascii?Q?1U05ZZOq8OCcloTp1H1NBztcSxtxTHKvOI7layIqoea4lYunQ11WIvlkeVXB?= =?us-ascii?Q?9Uybw2kG+nzscRrw3nNKFzflgrOK8sgTTTFSl+i/MJy3QMN1RVU1i5wMnQ0u?= =?us-ascii?Q?4J4JeyXF5Qnb7j3hdy+UXFUnsL4BgbQnoxrE4S+ROa7LpL7pz39dGWZOzExE?= =?us-ascii?Q?NsR/C/54BR6OJa5PVwXUd9/Ebe/8XHuCBFewKLXzY8yDLj4MAZYOVBCK/reo?= =?us-ascii?Q?7Wh+fRPpGziX7poLyR5iOr/EFO/ZUvcxW/ii8rDb9N69n7a8ihis2ADvb9EL?= =?us-ascii?Q?a9o84SqwkdMm+LBOP97afo0Mp1xWPQ1bum0ANAd+o2ictQL/ZV8kz9jyf94b?= =?us-ascii?Q?R9OgU5d//TDc5i7VuJKJBnNoSvwtmJfcnuJAV0yYOR1PjsbHtF03S4c8eHxP?= =?us-ascii?Q?NvlCB/LLy1nOqDGsCJfhauFX8gPeDm0eYBcOnVo59ckRhcLewPPGPizdQFHU?= =?us-ascii?Q?7SuZcg7EpBt4UUnwKxDPEaDOb7y6k+HKcI64uDe04IbzgXDtgddQUdp9+b0u?= =?us-ascii?Q?Dmrj8sH6tJ9WBIV0bNCtwr/ljd7Sql/MZrSwIP1vJL9hl6kpRPclm55PAaIO?= =?us-ascii?Q?pfLoy2piyflKKXkCgJ1SzUYp0mtFqHns0D1mEwoLIn+NXZcr8ELBHv1YGrhH?= =?us-ascii?Q?VB9Xl5s7NHi8x1lOF9b5JD+30D9E+guAEXaUnaJUsYUxx+Ly8vSDXwUJxhIi?= =?us-ascii?Q?KKQZrUR8Wb61HDrzj15RltFfqf8Qlo2yT4ZrqUy3V4EaKEjaBEHK6AnWjeg+?= =?us-ascii?Q?21DtSATGbsdIBMZHEnA7w48bCT0aXTFcJZlCF0ubnyHP6jfckE79A7whe4Fg?= =?us-ascii?Q?f8a6DkDunX0qGtV1g++dhtONheDQPHV7AI4xYhJOXnbzYwn/kJDoeY+QbNdt?= =?us-ascii?Q?7i2wXJasntLBk4WSzWcPjezUraMYY8Q04HKxLDs1RjrPW6A1vsW5aFR6tnSi?= =?us-ascii?Q?WIvDXePbO2gepWcEAMN5SV2Rw5ePOyTmzpxhYdsye5N54j22kRt+xRQ+qzVa?= =?us-ascii?Q?JadDdw9nVl3LfSeA4gUi7A9KLzB8w3zo0CtwwEAbVb0J7YbCl7x4vnQdPuxs?= =?us-ascii?Q?3E9wsblaKak5Z4I7sbxmAeBMC/D/GvBV85RwkddOQBOv3FNFQCPa6dHpz4pi?= =?us-ascii?Q?CuVkX6AWDPXrRAINzQUWh7pPyj7HD0dqXkiscJ6b55XeKVSgGTZY1bwa3txk?= =?us-ascii?Q?4oI4JDOL60exnPaebVpnxjAqlmup86fvBIpsH2WqfGhBG5jVZJiafaSO2ARr?= =?us-ascii?Q?2zu/yuxQOmiOU/U+zmQPq5VMRjk1F4x22tkn1ZTpYtMZyiOmILHxchcykkHF?= =?us-ascii?Q?6wTRbBccnv/aolS5z2LNBvr6ltvf9MNhqHG5Zj4K8SMXYZQLz38ac1ca5wI1?= =?us-ascii?Q?3+IjpipR4fIF8UmpHMkBTyUXANP4CU4ONe9Pp2c0fthPtCPBEwJoY9CNAdUW?= =?us-ascii?Q?4A=3D=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: c27d6c30-46d6-42d8-7dae-08ddaeeec2b2 X-MS-Exchange-CrossTenant-AuthSource: PH8PR11MB8107.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 05:04:25.0466 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: nz2BkbLbmFEdyIeglX+P2VMxO9VNcE9sAJxwpqSKgxWH9lwyHZRwasJThwfepYUXNWrPMjKPh6nZ2fp21Fbl4IG/BLA505g2INzDfoyBtjY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR11MB6819 X-OriginatorOrg: intel.com Content-Type: text/plain; charset="utf-8" The complexity of dropping the lock is removed in favor of splitting commit operations to a helper, and leaving all the complexities of "decommit" for commit_store() to coordinate the different locking contexts. The CPU cache-invalidation in the decommit path is solely handled now by cxl_region_decode_reset(). Previously the CPU caches were being needlessly flushed twice in the decommit path where the first flush had no guarantee that the memory would not be immediately re-dirtied. Cc: Davidlohr Bueso Cc: Jonathan Cameron Cc: Dave Jiang Cc: Alison Schofield Cc: Vishal Verma Cc: Ira Weiny Signed-off-by: Dan Williams Acked-by: Peter Zijlstra (Intel) Reviewed-by: Dave Jiang Reviewed-by: Jonathan Cameron --- drivers/cxl/core/region.c | 99 +++++++++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 29 deletions(-) diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 6e5e1460068d..3a77aec2c447 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -349,30 +349,42 @@ static int cxl_region_decode_commit(struct cxl_region= *cxlr) return rc; } =20 -static ssize_t commit_store(struct device *dev, struct device_attribute *a= ttr, - const char *buf, size_t len) +static int queue_reset(struct cxl_region *cxlr) { - struct cxl_region *cxlr =3D to_cxl_region(dev); struct cxl_region_params *p =3D &cxlr->params; - bool commit; - ssize_t rc; + int rc; =20 - rc =3D kstrtobool(buf, &commit); + rc =3D down_write_killable(&cxl_region_rwsem); if (rc) return rc; =20 + /* Already in the requested state? */ + if (p->state < CXL_CONFIG_COMMIT) + goto out; + + p->state =3D CXL_CONFIG_RESET_PENDING; + +out: + up_write(&cxl_region_rwsem); + + return rc; +} + +static int __commit(struct cxl_region *cxlr) +{ + struct cxl_region_params *p =3D &cxlr->params; + int rc; + rc =3D down_write_killable(&cxl_region_rwsem); if (rc) return rc; =20 /* Already in the requested state? */ - if (commit && p->state >=3D CXL_CONFIG_COMMIT) - goto out; - if (!commit && p->state < CXL_CONFIG_COMMIT) + if (p->state >=3D CXL_CONFIG_COMMIT) goto out; =20 /* Not ready to commit? */ - if (commit && p->state < CXL_CONFIG_ACTIVE) { + if (p->state < CXL_CONFIG_ACTIVE) { rc =3D -ENXIO; goto out; } @@ -385,31 +397,60 @@ static ssize_t commit_store(struct device *dev, struc= t device_attribute *attr, if (rc) goto out; =20 - if (commit) { - rc =3D cxl_region_decode_commit(cxlr); - if (rc =3D=3D 0) - p->state =3D CXL_CONFIG_COMMIT; - } else { - p->state =3D CXL_CONFIG_RESET_PENDING; - up_write(&cxl_region_rwsem); - device_release_driver(&cxlr->dev); - down_write(&cxl_region_rwsem); - - /* - * The lock was dropped, so need to revalidate that the reset is - * still pending. - */ - if (p->state =3D=3D CXL_CONFIG_RESET_PENDING) { - cxl_region_decode_reset(cxlr, p->interleave_ways); - p->state =3D CXL_CONFIG_ACTIVE; - } - } + rc =3D cxl_region_decode_commit(cxlr); + if (rc =3D=3D 0) + p->state =3D CXL_CONFIG_COMMIT; =20 out: up_write(&cxl_region_rwsem); =20 + return rc; +} + +static ssize_t commit_store(struct device *dev, struct device_attribute *a= ttr, + const char *buf, size_t len) +{ + struct cxl_region *cxlr =3D to_cxl_region(dev); + struct cxl_region_params *p =3D &cxlr->params; + bool commit; + ssize_t rc; + + rc =3D kstrtobool(buf, &commit); if (rc) return rc; + + if (commit) { + rc =3D __commit(cxlr); + if (rc) + return rc; + return len; + } + + rc =3D queue_reset(cxlr); + if (rc) + return rc; + + /* + * Unmap the region and depend the reset-pending state to ensure + * it does not go active again until post reset + */ + device_release_driver(&cxlr->dev); + + /* + * With the reset pending take cxl_region_rwsem unconditionally + * to ensure the reset gets handled before returning. + */ + guard(rwsem_write)(&cxl_region_rwsem); + + /* + * Revalidate that the reset is still pending in case another + * thread already handled this reset. + */ + if (p->state =3D=3D CXL_CONFIG_RESET_PENDING) { + cxl_region_decode_reset(cxlr, p->interleave_ways); + p->state =3D CXL_CONFIG_ACTIVE; + } + return len; } =20 --=20 2.49.0 From nobody Thu Oct 9 08:12:59 2025 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 A3456241CAF; Thu, 19 Jun 2025 05:04:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309484; cv=fail; b=llnZHBlm9CX9sN60ruX2bxhWB2VjaL2Hh9CnFEW54spg0c4d9xhaiAwSBReAhwfdNsvLKOPyzHsjGgJozRzmrkwvg/L/m27Vc0PEHxPSCWZXqquLNWr33kbLUGZ/3V+UWCc0sD0Z1yq6InfZw2V2vJGjJtuIdFZ/3il4y1Z+F8Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309484; c=relaxed/simple; bh=4DnHF9A1A21E9R797LyRWfdWr7Y7mTgWEwtPm5/lAlo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=E7TyH7B15YqSqf41jZGpVArr7otKHTDk57dj8iGTO8AGoJt6FCKki+z6qNHEIBMR1uUvVwlN3sYQeD3r2AmbHK+a/lmhHXkROMUxuPD4M3swgvK8P2xHmzqXTa20tpJnSW5m317vJXeWsczSzIBZZEzW43cNmI92KENavp7nZAM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=QiEEXAnv; arc=fail smtp.client-ip=192.198.163.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="QiEEXAnv" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1750309483; x=1781845483; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=4DnHF9A1A21E9R797LyRWfdWr7Y7mTgWEwtPm5/lAlo=; b=QiEEXAnvaBH/iZJ8ReTu08rjYf5y6B88axdb9zQTWsVqi9fmibrd4WtX 4tjileCOrKaekxVnAbkyNT/+8XnWAVriccx7YZK5jci0GHLnng0+HHjr3 qKsBo4In7wrj3EFGOcaBLaLOoWsUAsL1HFYg6m+votBdmdqSLJl/HWvmU mQxwnUo9ogOk9fxFcDzJPMLAVgGcvVXDvoNmnXNec5xwP2aYt/olomKhm gxHMg8diWmPikcJUdiGielChUiJ2tjDPLo8KrgYG1V/sE7jwCzQ0D4agf UHsAys6yGIUvWAA/o8aJqkV+gE1fhixlYmm3sycWWHzLCsVKvDzo4hzii Q==; X-CSE-ConnectionGUID: smN9DhWoRFqskIneO6zgLQ== X-CSE-MsgGUID: OFy6xqEMRW6Lcn9eDMSj0w== X-IronPort-AV: E=McAfee;i="6800,10657,11468"; a="52702213" X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="52702213" Received: from fmviesa001.fm.intel.com ([10.60.135.141]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:35 -0700 X-CSE-ConnectionGUID: DlMnD3qbRvqNLNjE3/bXNQ== X-CSE-MsgGUID: Qumzr6iPQTaQzJXt5c+duw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="181373565" Received: from orsmsx903.amr.corp.intel.com ([10.22.229.25]) by fmviesa001.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:35 -0700 Received: from ORSMSX903.amr.corp.intel.com (10.22.229.25) by ORSMSX903.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:34 -0700 Received: from ORSEDG903.ED.cps.intel.com (10.7.248.13) by ORSMSX903.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25 via Frontend Transport; Wed, 18 Jun 2025 22:04:34 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (40.107.223.42) by edgegateway.intel.com (134.134.137.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:34 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GzaZlKbvCa5M4cWNEJ/6EktEh/AZBVyVPCxlT8X9i0YTJVUjKdPhgiV3r3+F+fQp3oTGcn4tdWejNnaBXwJ7vsoku75yFK8ZH59Ncy2AojZO3tvAS+QEAEu4vTW2DNGuhLhzc5KiFLAPNfan0joVz3/GpLL8Ei5OQeAMHcZUEvt7BrhLf34cEC3XWMzjkSSRTdwe0+dfYmwhZwCqvE11GUIT+OfVZNDxY9aOximjY1ymbzk5DpHXkh2UV+NC3pKhh3bGnkiusJUADlzVzdO+hM3gbV0BQ98e89gMiJkEzUJjXrQnGXzy1z3c4aXjq8OMEd29yeuR5eoXz1NHoXaMMA== 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=FEgGnD9q0IkaLjzWWz87pka+kRKJlVvJFHmzQjKwD6U=; b=ySOs+cjgaWpUJlK5ar1FR5Tsp9jms3V0p5jbss5tABncQ7dQCWtIXDIt4JqauyB2Om70HNSB6AxeTcXqzCLzfKiCB3AGbiVMM4WCyIcsyiyooBmWs7IZg3XBkmJOuMCsWuXTtmnbZ3p6eBgvK0iCTaDZxDlja7Bw74oXkVv8V0qDEK281Eyd1Isut6k1bRyfmV528F4l1kYDG4HJLCYpLlqDLBhtJAYH4V1TVzgRy6tGOG9xLcSXF8XnRZN9Yq6hkxMsDlinJe+VmgpBlUQElLFR22QDBXd05Dy/X55kEU+AjMjUU4JawGcPNcLJsFNRBnrmnAWLIK7bjRv9EIn8zw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) by CY8PR11MB6819.namprd11.prod.outlook.com (2603:10b6:930:61::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.27; Thu, 19 Jun 2025 05:04:26 +0000 Received: from PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8]) by PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8%6]) with mapi id 15.20.8835.027; Thu, 19 Jun 2025 05:04:26 +0000 From: Dan Williams To: CC: , Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , "Vishal Verma" , Ira Weiny Subject: [PATCH v2 6/8] cxl/region: Move ready-to-probe state check to a helper Date: Wed, 18 Jun 2025 22:04:14 -0700 Message-ID: <20250619050416.782871-7-dan.j.williams@intel.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250619050416.782871-1-dan.j.williams@intel.com> References: <20250619050416.782871-1-dan.j.williams@intel.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0151.namprd03.prod.outlook.com (2603:10b6:a03:338::6) To PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH8PR11MB8107:EE_|CY8PR11MB6819:EE_ X-MS-Office365-Filtering-Correlation-Id: bfff6430-d117-456a-a5f8-08ddaeeec346 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?2d1chWbAVdyK2zzdp4H6zfeX/azLT8zUGowqy1EKKzQyOyOhVMghcFbZJnib?= =?us-ascii?Q?uDNuS46ImWttaCqL9rsSygMa1bYKJMM1V4MIAMV37e3QLevhpTBJQndbDBJo?= =?us-ascii?Q?uxULXEu+oIn3ujFEc452n6aqCyNu9xc02/ks01F65WMEptDYpJOGmPptUIwW?= =?us-ascii?Q?a3bI4sIO0o0JPGjprFPSKN3A1Faq92xot7khSoE0T0Q0w2ZEXJHd+Swkj3mF?= =?us-ascii?Q?NwKU+S1X/v9nVUj8ZLNrn7zRknBqriWGQ3z1wjoEQHbFtdS2nVzkMOFoP9Po?= =?us-ascii?Q?T/z6pm8OTnQFGBiyu8bzZnvIYAZURxsZ30XSoaJ7Ld8rSoXHrIlBWPMPn8TW?= =?us-ascii?Q?OR5m66lZwsg2d1CNiOgzuCGESDqpKXTKd0UFucw/GBN28CEmuJtUAn/vOT00?= =?us-ascii?Q?lHg1LIabjKmmF3N6Yx6GkjJJTzX/uvDFA/XAdbG2U5ioYDUp0gtqjpUs7xVi?= =?us-ascii?Q?yrhchsoo/rZVARqPqrNwFQoZcX30vrks9I+Dg89J24qYP5XF+M8v5KBBTJYT?= =?us-ascii?Q?ADVYt+lgM98zAOdwsji539MfQsvXf/WSyZ9oKXHsNR4vi68IBrHk7rckHTxH?= =?us-ascii?Q?7bG39lWDRyQyQDR9Esmwg7d9FkayyKk9qGq6NBxidMGfhtw3PNOar8Z2+vys?= =?us-ascii?Q?6UYlmWdgw2sOL/fqkd24CabGg5s33gv+sPd3a9wjgJHhxqD8Bshs/miD8iPX?= =?us-ascii?Q?wqsoJmsHt0iWY7fUdMXbPhZc+qjbO0Im5iDIp6YaVF/QkHv3Utq4cIpuj+r2?= =?us-ascii?Q?Hxc6ZJXpwJBXZxB26/CVPx4/kba5YLYcaZ+0PGQMCCcPREuPVyT8ObKggoMo?= =?us-ascii?Q?va5DaED1fHtb7GffSZFcb/kyxCxoY4vELB1XwQU6LT0gQIp50flZZWqYfmNd?= =?us-ascii?Q?WGI04F84sj5OwZznn7EG9pUDOm3riX7LxOfKSmNNsjPXAfhzRtIdtP6/ybc7?= =?us-ascii?Q?TuBNtZ/+akY5Qswzg42ejQs9p78MrTG8rPTj01Rp1g0/KixcJ+ZnyAjSb+sv?= =?us-ascii?Q?RRCUrMnGm78FR/L8Yg3O1dfkYDZTNF4oj+n/BwcbpDr4Tl/qjGf0vYamEtH8?= =?us-ascii?Q?6Sg0LiZofI2HvZFZ8Wo/sCibbvEHBclci95KsTEiyM2v1r61hC6OyTSMQO+e?= =?us-ascii?Q?n0i5Q3PxP/h9JxtqiFKDXKOuJ9bedR2Bwhkh+Jwr6Cq42OI9dFLgixbEXkbL?= =?us-ascii?Q?hjMYxBurmpb/G/mgSk9w/5mhxTHSgNXeEDlgE94jn1yBm0sIh0Q+/S0kNnvr?= =?us-ascii?Q?UzyrCTCZv59ce8i1/oaFbWcJt8cjTSWz3CZwuBLF7LXQes2OO5DYeF1nkiRc?= =?us-ascii?Q?wuwzwtZJEYaUdL+v0+QecqdwMuvRZQpC6dn3BDS5Hqap8CcbgDjXBO2fxgYK?= =?us-ascii?Q?SdEl/K5BvwaDVfOSTrj2mKz1OO/vGOnbHHhdsa6rxarSahYgaZvn8IOFca/5?= =?us-ascii?Q?WYvDVqZr5k4=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR11MB8107.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?jPWY4xV3BjRX1Hjw1/t7Bva1hXZFfpv0SIf713ao+WfOZsNVil671LFOBVeV?= =?us-ascii?Q?BEY41OBTawPJ7/Bz49FJFpTb8Fwunmzplqi40OA7PhZUcWKp7NXilaxCWGfx?= =?us-ascii?Q?ofGtEkDX7aokbhpntLq2cOuyKi0VzO4pI13rcuY8WmtV3PsXJfkh6gqHqH2q?= =?us-ascii?Q?FE0WU62D3ZjpWhe2EIVaaEFSqWRTxJW/0e6h3RkbIncRsQlQP6GdI1TL8U2y?= =?us-ascii?Q?c52i8kN8Lmfj/e78rpQohiY4mmmvIktCnTGoS5Cl+BOh7HcjnwUsjUmjItl2?= =?us-ascii?Q?N/jpv/dP/2+u/i2PFbR/oGRWLSGjDswZgbGuUrB7OasfsvSBvEtspaIIxy7O?= =?us-ascii?Q?Ch/Wtn44wfqZG8QWZkVfDs3dSyQXwtpupqug8323iX+5PaY3f54ahHJWUORn?= =?us-ascii?Q?KM7A0MRqMDYgyCxzxhZiHBpDk/VHzGIkj9TtZWjAZX+3J8jzTWPxzOcWVJuG?= =?us-ascii?Q?xHDsvT45uc6djv7NgBi4Ca6wLvOCHnKuaG2mWJ3uD97USleX7KYAAt8aPHNV?= =?us-ascii?Q?UN02EVDBhzwqi+Sdehtm08ghg0zusgJxCiQI3lAZHCu8u6GVhP3SOJ3p64x8?= =?us-ascii?Q?AEi7s2z1rc83pZhEeXnAq9SKc8SPARuPvLKS7KCZscqNbiX7COrHbyeufWr9?= =?us-ascii?Q?d0YdJYmh4sLciKCB3GzVXwW+3FmLy+ByrrO/WdiLx6HLZSuT+QC8W0fQqj8z?= =?us-ascii?Q?DiYMykVjkbVZ4PNYlPjZS+uL/bqplkD2crol2vglOxbuxGAHjVFEpxclG/M/?= =?us-ascii?Q?RP7hncFm+0x1cPehiSyUG4hK14uznS5gxwhmivhLGMxPXmPlE8NL+83P8/b5?= =?us-ascii?Q?H8sPn0sH3dM+AB5XXVza/nqeNPLI6GSODj1UjFW1lEkaQHa/bbD9L0TpvrtK?= =?us-ascii?Q?nsB6+2sT2W/mRZtURjvtt7OItyKDQpNLnt41kdxE/5XQ6yPzjhogpRdLZ3hF?= =?us-ascii?Q?sHVQl0FvnOa94s8HgYJT6epXCaQwGBKGLvoeZVm/UbmDGhY7dm2ublxro6x2?= =?us-ascii?Q?YB2KBbSzqXau2WmsJVumBGLp2xWd07BvAD8aBU9GDRqB4V8yV0/m7wIvVWxd?= =?us-ascii?Q?BRL+hpNdPIiIhOG5WrRG2ukeuSWQRrJzxQ+eKSfGJni3nq6w9w6P66dnuRUO?= =?us-ascii?Q?zTpPLuhgtXyjN3nxcqk8VfCRg7h9gszt93cyFgirvaX3bzDw0m/H/hZYNuun?= =?us-ascii?Q?DXDHwPB8tZZJ6j4oJWBBLsY3cwszz9OY00eW30Xe0vEI89fPOlpA25s/x49z?= =?us-ascii?Q?gJYuLTXMNfyq/VngvpdSvapPK4IHzydZOh4ODsz+ldFDDGqmeDSnBQ6eNN0X?= =?us-ascii?Q?RBkia/F1sxZ7CiXl2u8PrvW2+PvsfIbMVb3pm9TOrqj5Xu7nu6RJgqG3Kuqg?= =?us-ascii?Q?1hvtMM5v57Zjw6/PZif6zMuPxZuLsrjE1Pp7f1AMhbCZluy8hjs9xAgtTS5v?= =?us-ascii?Q?5vtnBCI2IOcdlMOisFsK9wPdSD3tLjV+PE2p2p6hESupSKxb6+Plv2Oi8ZWS?= =?us-ascii?Q?XDD7P2zq5ZXXqvi5wOSMELFd83xwAIAK1sjolI9Qjbm2hndIY0DJT/YjOdsM?= =?us-ascii?Q?ESTdM/Tj4X6BRpqwPFd46tnF4/eN3236QpM/RpTRVrOPscLBGS1r+RFZYKLW?= =?us-ascii?Q?tQ=3D=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: bfff6430-d117-456a-a5f8-08ddaeeec346 X-MS-Exchange-CrossTenant-AuthSource: PH8PR11MB8107.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 05:04:26.0202 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 930Lh1xrpRufmaMwl6Tv5ME0Zd74VZCVF2AejbNUFtDVjjIzAg/u1WecQp/g+aHUvjimubRwQeh7l2hXWMZP63Q+ksbSLtJkAbjDoyejSio= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR11MB6819 X-OriginatorOrg: intel.com Content-Type: text/plain; charset="utf-8" Rather than unlocking the region rwsem in the middle of cxl_region_probe() create a helper for determining when the region is ready-to-probe. Cc: Davidlohr Bueso Cc: Jonathan Cameron Cc: Dave Jiang Cc: Alison Schofield Cc: Vishal Verma Cc: Ira Weiny Signed-off-by: Dan Williams Acked-by: Peter Zijlstra (Intel) Reviewed-by: Dave Jiang --- drivers/cxl/core/region.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 3a77aec2c447..2a97fa9a394f 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -3572,9 +3572,8 @@ static void shutdown_notifiers(void *_cxlr) unregister_mt_adistance_algorithm(&cxlr->adist_notifier); } =20 -static int cxl_region_probe(struct device *dev) +static int cxl_region_can_probe(struct cxl_region *cxlr) { - struct cxl_region *cxlr =3D to_cxl_region(dev); struct cxl_region_params *p =3D &cxlr->params; int rc; =20 @@ -3597,15 +3596,28 @@ static int cxl_region_probe(struct device *dev) goto out; } =20 - /* - * From this point on any path that changes the region's state away from - * CXL_CONFIG_COMMIT is also responsible for releasing the driver. - */ out: up_read(&cxl_region_rwsem); =20 if (rc) return rc; + return 0; +} + +static int cxl_region_probe(struct device *dev) +{ + struct cxl_region *cxlr =3D to_cxl_region(dev); + struct cxl_region_params *p =3D &cxlr->params; + int rc; + + rc =3D cxl_region_can_probe(cxlr); + if (rc) + return rc; + + /* + * From this point on any path that changes the region's state away from + * CXL_CONFIG_COMMIT is also responsible for releasing the driver. + */ =20 cxlr->memory_notifier.notifier_call =3D cxl_region_perf_attrs_callback; cxlr->memory_notifier.priority =3D CXL_CALLBACK_PRI; --=20 2.49.0 From nobody Thu Oct 9 08:12:59 2025 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 074F8242909; Thu, 19 Jun 2025 05:04:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309484; cv=fail; b=pmhtQvgIBVmO+IksnPdrqIuTCHw4/8RuBrmrLLCSMLHXcZisDI5pTk3NOma1cO/K7zfaikukaYPllWHBya5digWQovi1UnX4dwGp1Z+LhQ/3AS7dYHU6s8aqbzGG6luJYLyACtIsUnxzehJgXs+tNs1w3Zfg5cUOFCQSZo9b9Zo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309484; c=relaxed/simple; bh=pnQcwtvjBxa9RhuYul1e2b91s6N5YrFoqd5GpbEBFaY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=G0YXnlOCQudmSFj3pS+4kk/IBwA3h8AUfbyXOUDdC8qMr/NEpVpwa/DrTj3KiAFgb2xMxJ6tmSb9WIRxgU5OGu0wDwlECTeEOs6qgLCE3zppM96t7m5Hm+URygS+S3sN1RWf1ErEBMrVS/LDAbmn7DT+JNvdPrje9lDjPrgCtPQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=bQec2hfy; arc=fail smtp.client-ip=192.198.163.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="bQec2hfy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1750309483; x=1781845483; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=pnQcwtvjBxa9RhuYul1e2b91s6N5YrFoqd5GpbEBFaY=; b=bQec2hfyJLnpJIf4+dUBXwY4wRjCFRefUU4IpztftSVu3R8yQeEzt+T8 kPsV/rezbP60ffxF6D1LK2N0iffhZUtwWXRbRcE4MAbcE8Ww8PWJLSjgp EELZlieGeMM+Yiui2NSlcCQUyBLNq7CxyFB1bCB5Nxa1JaExFuS8ilyWA sl/w5mbzCOCrmLobvc9SFAY6Msvp9ziyK8oJxBHLt5S/J8yYLGa4X+zpn KKQekGyJIlZ/r8T7Zji2mo4zpgzlOqFb5y+46yv0HArI45v8LgMzw3siZ riLxYmGzYZ4hm0OhWHIF9ZciDVZgPLW759FcJu98pIOtWhXc5UDZMmExu A==; X-CSE-ConnectionGUID: bvxMLNrnSAyOi0j91GrSJg== X-CSE-MsgGUID: bicGt+D8TX+WYWR93O7xSw== X-IronPort-AV: E=McAfee;i="6800,10657,11468"; a="52702219" X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="52702219" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:36 -0700 X-CSE-ConnectionGUID: JE151PNvRtmWbDQhItWxgA== X-CSE-MsgGUID: fyu2aZMtTvmAByeUcrOoJQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="154413123" Received: from orsmsx901.amr.corp.intel.com ([10.22.229.23]) by fmviesa003.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:35 -0700 Received: from ORSMSX901.amr.corp.intel.com (10.22.229.23) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:35 -0700 Received: from ORSEDG903.ED.cps.intel.com (10.7.248.13) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25 via Frontend Transport; Wed, 18 Jun 2025 22:04:35 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (40.107.223.42) by edgegateway.intel.com (134.134.137.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:35 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=besEmmMquqLIharruaE90NptrAArPmnTTuWm5A9bNSuGruLW/I6iBxsnG5FCLuyYHCH6XLy5vvEmxPchxIZUoeDd4PE78SyQBhLWYbqU6rJKt/KAzv0e3DotfMIIFkK+1XEZmRmi8tVYrmHahOBeIEyn6EqoY8boZsVySBfkjqnmQHH2vgkIata4BvveCjk15GBzWx3licI+LARAfQ4GSLKH5ZDcIW5504svQLUi9KIMdhW/6YT4ra3aBpMMmHfT26Cdh1Gq/6jfa75TaulHmeJx7QrCkjnAB4GGMSpLROJpuk6TvlgsHot+y/iT1b/yup6hayuiiBJb4nhtHHmFbA== 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=Erti9SVioFgVrvcz7zKlktZcq1LFHx3OHBo0ntneSXc=; b=lzA50NujKJdHeuqHsU0eWY1d+WHMAPrXsUvpUR2b91T1ckNFelh5wvmEY+ld4BNlPwnIOc1/efweXmDtLZYQ4/2YI/S9Ukoe7s1t/T4wocd6S47xKktEDY0nmlIOUuf4/vq9Hx/2A3yaVvQ9xAzjHUOU4AftM64YxSgOus9dwfMlSdqNVSYGPmPt0Fo9KhInxsrIQo+U8KvSxYQC/kKD1l5rU3Ai9sUTjNJM6EZFtQXEy5t5+Xu9rOV1lhHdVxMOFoGkqS2XexIQ9tEzF7Ynt1C3diuYCoco3/ezgJtxaBHugEjfi1Z/laQ5jN5onrp8o6W43GrxyeZCmJJG0OxErQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) by CY8PR11MB6819.namprd11.prod.outlook.com (2603:10b6:930:61::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.27; Thu, 19 Jun 2025 05:04:27 +0000 Received: from PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8]) by PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8%6]) with mapi id 15.20.8835.027; Thu, 19 Jun 2025 05:04:27 +0000 From: Dan Williams To: CC: , Davidlohr Bueso , Jonathan Cameron , Dave Jiang , Alison Schofield , "Vishal Verma" , Ira Weiny Subject: [PATCH v2 7/8] cxl/region: Introduce CLASS(cxl_decoder_detach...) consolidate multiple paths Date: Wed, 18 Jun 2025 22:04:15 -0700 Message-ID: <20250619050416.782871-8-dan.j.williams@intel.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250619050416.782871-1-dan.j.williams@intel.com> References: <20250619050416.782871-1-dan.j.williams@intel.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0151.namprd03.prod.outlook.com (2603:10b6:a03:338::6) To PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH8PR11MB8107:EE_|CY8PR11MB6819:EE_ X-MS-Office365-Filtering-Correlation-Id: 6307bcf5-b1fe-409b-4192-08ddaeeec3dc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?JvhqKt30iJmwWbnvARUokj1hU7WHjjsZ0Dlu0qH7xWUjGyXMOiOJGeOM+Jwo?= =?us-ascii?Q?iOpVLOm42q5eGdD7IQrFGmXAemZ4hQXayYEg2pu/poErA24CzDze6SRARpFE?= =?us-ascii?Q?LI7r+wbKqb/rSGBnfYEaH6j865OcPrnD/k64sfO4E6nipifsqhQmJD1rI8Oa?= =?us-ascii?Q?rGECZOolHqN9hJaJRj4J41AEiVmOgS+6ZR/UaAlUPhS5z4gliG2nwopx4Vp3?= =?us-ascii?Q?3eaDWIv54LxX2LDlqtGckGQwPGND85bpHYApFH/evV0rRF6fVUV2eInG2ymn?= =?us-ascii?Q?o9m7U2TG5wC+Ir3vrE3PlO9WHo3gagyaOE1l9h3PEtmUUmeW8FOEClJz7Rme?= =?us-ascii?Q?4d2wxlWcIY4sSEJcXAFY1DSf66CjHsHJcBnCUzhI0PUb+dgDNhpvnEAfWNh+?= =?us-ascii?Q?bF7wnOVmnXgKGGCAfOMpIwWCga4gw7ByKxIcz5of1nhUgxmMsnK2dkJ1WYd2?= =?us-ascii?Q?8/ZzvIzBm8r4LA/50UEWH2AE69TugHZKPBTsXdWBg1eDYcxpMjiOLUgqNhVh?= =?us-ascii?Q?0YsFgPmj6FYvNNU/M9c0re7t3e5yl7iPN5GOcumJpzLTncgGcPoaDvPtzwFD?= =?us-ascii?Q?XPRtWKRsYnfOAgEdrnaNFq7Lj0hMBKXaoFBnAZuwicR7AVAiTs9V9SKvlHnO?= =?us-ascii?Q?Uy1PbtrbmNUhanZ3Xt3q2WdHlB65afssKaJ7fAQB1VkzvERaz/2EKeRPU7Ft?= =?us-ascii?Q?r0PY7u6QP0EDcvEhcvRXEf5CwJ4h27W/uOsccfZJS202F6pAm3iGHKwCvz/2?= =?us-ascii?Q?LW5pGyzYBlgpXm5VHRg8/aqW9BOtUX/N+nuHZOInTC6htL5wWj/xq92fNXbv?= =?us-ascii?Q?SfmPp/RBgh18H9KUubbuMaN05DFnwgsABgYBSGUZJsPHyFP+e2H4nHX4V+7M?= =?us-ascii?Q?nY3eYoeJzCEI45S+Vwh3IL/JvYpq43Cj5kShqFuY3PPIf4uaBAbPSvPMrrT4?= =?us-ascii?Q?vbM8HhmRV7VGa6P+kSS29B2pKV/1fQKYlk8hV0lcLOcWjRFj/ArWmBQBHscH?= =?us-ascii?Q?3hs1KnX/k5FVT6Z+2KfgqtD8UZG2RbDX0Z9OD7EFF2MyCMAlZKsl4ZUjQTeA?= =?us-ascii?Q?XLKB70bJ/JNiuvTqGplrdhwjwyWnW4dBbmKi/FjovrLnMrhAfaUb67Br3Bag?= =?us-ascii?Q?90r20FlPQi8qfzQc7cqRAeDz9ZMXHRh0K2hBsI1LC1/G4LNCCqV//8Lld/TF?= =?us-ascii?Q?9yxaIjZeHqP2uL/Io6dCY3bpriWmbeNAgclo1/iF3Ld/2/D0yKfyVd2ytWje?= =?us-ascii?Q?oVqXGTYdjzco9pywKRKLu+Zl0sYXPutta/JT9Uw5M5lb+0JmG35AJclG2hn2?= =?us-ascii?Q?d8LXGBd0KDVGfXDbV+ArKm4E51NVrEru4eg3jxR9i/I58iuGNRMwo5n8QQFv?= =?us-ascii?Q?ocnymADGw2haHfyPdmK+Fz4IDDE4E6LJXpBP7qHQteM0Fp6dULNsLMSYeRve?= =?us-ascii?Q?ock/eBh9z1k=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR11MB8107.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CSA6vRBvhdKdoKMPcVU8SQx9Gu2Nzu2s83AURTo3cOyjAMEgJl+hoaACa1tQ?= =?us-ascii?Q?25khIQ2N6g5IV6OaaxnvS+5YS4XC6SYuR8DN7GcLx+ApueDLNfb5ZMBFrwnz?= =?us-ascii?Q?HDgvu2oGl1150xu2/TI9uCj8RZvLQrTKuVZgKxGFlJk9c+u567aQDuuaLnzx?= =?us-ascii?Q?2zxx0quTsIDUzwYyMui1Gz3woVm2uA2DQpCp/OqoWp0mbBollY+tB0Ma881R?= =?us-ascii?Q?HcSZP1C2UR9hB1D+BtvfCSKSrAANbEd+GkqpArYcz2qyPimhS7yJyEDi968F?= =?us-ascii?Q?mTZyITc3NHpH38w+rr3vTbbp0uXq2wSlT/zfNUrbqGFhc5q4hw0rjX2ZxCTv?= =?us-ascii?Q?8g14D8hpq67zpkd63s7sxq27NCmLgmfPuFpeMN5RCkGQI/WrygQlXL4daKE7?= =?us-ascii?Q?+hPb8Fn/nptLvK8nguA42EHdmtMlBaVweMgWpoY7qyyjmgVc8wnvMp+eEGrw?= =?us-ascii?Q?HHCp6rjdlSMEr5xbxAT1+pgJzXyG/LVb9FJGSGPloG53S+Jc+hLaDfSUibTq?= =?us-ascii?Q?rvXf6h3UbcU6L/Uflz3tQi9CpoxsavKgZQ2V22TGBMunHjZy78vQ0dODu4i8?= =?us-ascii?Q?Y4kzCMwIgboQz2YoTMxVZ/E/TGYK0pET6tm56HCvJ/cohsdWP75del2o2W6Q?= =?us-ascii?Q?4Fsm8sIKVZjMzV4x9WSyfGp6e4GvypL2eEJHObqUIwA+eWCy/GnpJWzO5Kwi?= =?us-ascii?Q?4fepIrsEefcUlh3UVQ0hFEMCzzvvSjZTiPkB6EY1BCir0g0ve+CwF8N0hhs4?= =?us-ascii?Q?RWPHSC5H2mad0PFg8TBam0u1i6OIMtSIpcNIi3jX2Kw13m6sNu83UOy7eq6d?= =?us-ascii?Q?Y2Q0uRP9M/EI8rIThvE3BczHMFhp86rgb1AjpXn1NlC52Jt6C+Z5uG9xQmVd?= =?us-ascii?Q?w3Go4r7k29c7hh/GblM+itKhwvfOkkZgGEkFD13VBKEHmGRQd/7eQTEbYtqE?= =?us-ascii?Q?IqGS1Wbhr6ameHadlYye3YjX0kzA5Eks3Q83e2LWL8Z34UouY9da3ZGPH184?= =?us-ascii?Q?V5ueB7bLghVfQyNS7AW0HiVPsqahaLToaMGc+hd3PFvLRDT/u8B77ERXlxxU?= =?us-ascii?Q?mn2ARQO5aKdL3T78F8Cb6fKnrqTFiUUkO+n8Oajto9KdPufeIgtbnu2uYUgj?= =?us-ascii?Q?Q6FV1d3vVu3dbjanhUsU9Qdnk+o2PDxxFYOhIeoUkFroPdxaHXQhuK1uE+Tf?= =?us-ascii?Q?dKzOLGpyXoPaMURD2KMhmkpGjgG2Pswh7AWX/7FH7hpkKxPLsAm1dtrBEyvA?= =?us-ascii?Q?g/SeDUut2zJZpF/cepyFwagmHe5MrZn6ABNG0gmPgWb62j+q+J14yVnqwBQP?= =?us-ascii?Q?pisb7+oIOQXfT/8C8ltWeUf/0LH7qO1SHQ0PiIpDne/leBoWN3yEVOCIqbZm?= =?us-ascii?Q?epiQK/Pib49NLZuZ/kI6LHYOI83VKY+wR8s3xj+3BxeRNEMepjpmq/Vxnjh0?= =?us-ascii?Q?WjZkePkWkXKSsmG4oVmhTSF24Sz8S1y8QvS/svyeYvE/o67A2gab4kkR4366?= =?us-ascii?Q?IYFe3upGJEPas3Bft7URq7j2YvpQNwqRO88lYs/JUCUcvVgNa5XYoUrp3jOX?= =?us-ascii?Q?yggFphGe3HSoMBIFowjSlh+QswSaS3UEB1KqoN+fFNc0ZVAsrlFavuMj8ppI?= =?us-ascii?Q?fg=3D=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: 6307bcf5-b1fe-409b-4192-08ddaeeec3dc X-MS-Exchange-CrossTenant-AuthSource: PH8PR11MB8107.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 05:04:27.0577 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: EOSsXQxbv4Kzp6/U7ADW1c/r5m/4vlAJqtLfcPOHYmRhNUpASvv+0tA0a1OU25umBBhhraOlmmWUFU2uCIo6qujLq8vmalxFZ5xh8QEykKU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR11MB6819 X-OriginatorOrg: intel.com Content-Type: text/plain; charset="utf-8" Both detach_target() and cxld_unregister() want to tear down a cxl_region when an endpoint decoder is either detached or destroyed. When a region is to be destroyed cxl_decoder_detach() releases cxl_region_rwsem unbinds the cxl_region driver and re-acquires the rwsem. This "reverse" locking pattern is difficult to reason about, not amenable to scope-based cleanup, and the minor differences in the calling convention of cxl_decoder_detach() currently results in the cxl_decoder_kill_region() wrapper. Introduce CLASS(cxl_decoder_detach...) which creates an object that moves the post-detach cleanup work to a destructor, and consolidates minor preamble differences in the constructor. Cc: Davidlohr Bueso Cc: Jonathan Cameron Cc: Dave Jiang Cc: Alison Schofield Cc: Vishal Verma Cc: Ira Weiny Signed-off-by: Dan Williams Acked-by: Peter Zijlstra (Intel) --- drivers/cxl/core/core.h | 43 ++++++++++++++++++- drivers/cxl/core/port.c | 6 +-- drivers/cxl/core/region.c | 88 ++++++++++++++++++--------------------- 3 files changed, 83 insertions(+), 54 deletions(-) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 29b61828a847..8a65777ef3d3 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -12,6 +12,11 @@ extern const struct device_type cxl_pmu_type; =20 extern struct attribute_group cxl_base_attribute_group; =20 +enum cxl_detach_mode { + DETACH_ONLY, + DETACH_INVALIDATE, +}; + #ifdef CONFIG_CXL_REGION extern struct device_attribute dev_attr_create_pmem_region; extern struct device_attribute dev_attr_create_ram_region; @@ -20,7 +25,11 @@ extern struct device_attribute dev_attr_region; extern const struct device_type cxl_pmem_region_type; extern const struct device_type cxl_dax_region_type; extern const struct device_type cxl_region_type; -void cxl_decoder_kill_region(struct cxl_endpoint_decoder *cxled); + +struct cxl_region *cxl_decoder_detach(struct cxl_region *cxlr, + struct cxl_endpoint_decoder *cxled, + int pos, enum cxl_detach_mode mode); + #define CXL_REGION_ATTR(x) (&dev_attr_##x.attr) #define CXL_REGION_TYPE(x) (&cxl_region_type) #define SET_CXL_REGION_ATTR(x) (&dev_attr_##x.attr), @@ -48,7 +57,9 @@ static inline int cxl_get_poison_by_endpoint(struct cxl_p= ort *port) { return 0; } -static inline void cxl_decoder_kill_region(struct cxl_endpoint_decoder *cx= led) +static inline struct cxl_region * +cxl_decoder_detach(struct cxl_region *cxlr, struct cxl_endpoint_decoder *c= xled, + int pos, enum cxl_detach_mode mode) { } static inline int cxl_region_init(void) @@ -99,6 +110,34 @@ u16 cxl_rcrb_to_aer(struct device *dev, resource_size_t= rcrb); extern struct rw_semaphore cxl_dpa_rwsem; extern struct rw_semaphore cxl_region_rwsem; =20 +DEFINE_CLASS( + cxl_decoder_detach, struct cxl_region *, + if (!IS_ERR_OR_NULL(_T)) { + device_release_driver(&_T->dev); + put_device(&_T->dev); + }, + ({ + int rc =3D 0; + + /* when the decoder is being destroyed lock unconditionally */ + if (mode =3D=3D DETACH_INVALIDATE) + down_write(&cxl_region_rwsem); + else + rc =3D down_write_killable(&cxl_region_rwsem); + + if (rc) + cxlr =3D ERR_PTR(rc); + else { + cxlr =3D cxl_decoder_detach(cxlr, cxled, pos, mode); + get_device(&cxlr->dev); + } + up_write(&cxl_region_rwsem); + + cxlr; + }), + struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled, int pos, + enum cxl_detach_mode mode) + int cxl_memdev_init(void); void cxl_memdev_exit(void); void cxl_mbox_init(void); diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index eb46c6764d20..0f1629856380 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -2001,11 +2001,9 @@ EXPORT_SYMBOL_NS_GPL(cxl_decoder_add, "CXL"); =20 static void cxld_unregister(void *dev) { - struct cxl_endpoint_decoder *cxled; - if (is_endpoint_decoder(dev)) { - cxled =3D to_cxl_endpoint_decoder(dev); - cxl_decoder_kill_region(cxled); + CLASS(cxl_decoder_detach, cxlr) + (NULL, to_cxl_endpoint_decoder(dev), -1, DETACH_INVALIDATE); } =20 device_unregister(dev); diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 2a97fa9a394f..010964aa5489 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2135,27 +2135,52 @@ static int cxl_region_attach(struct cxl_region *cxl= r, return 0; } =20 -static int cxl_region_detach(struct cxl_endpoint_decoder *cxled) +/* + * Cleanup a decoder's interest in a region. There are 2 cases to + * handle, removing an unknown @cxled from a known position in a region + * (detach_target()) or removing a known @cxled from an unknown @cxlr + * (cxld_unregister()) + * + * When the detachment finds a region, the caller is responsible for + * releasing the region driver. + */ +struct cxl_region *cxl_decoder_detach(struct cxl_region *cxlr, + struct cxl_endpoint_decoder *cxled, + int pos, enum cxl_detach_mode mode) { - struct cxl_port *iter, *ep_port =3D cxled_to_port(cxled); - struct cxl_region *cxlr =3D cxled->cxld.region; struct cxl_region_params *p; - int rc =3D 0; =20 lockdep_assert_held_write(&cxl_region_rwsem); =20 - if (!cxlr) - return 0; + if (!cxled) { + p =3D &cxlr->params; =20 - p =3D &cxlr->params; - get_device(&cxlr->dev); + if (pos >=3D p->interleave_ways) { + dev_dbg(&cxlr->dev, "position %d out of range %d\n", + pos, p->interleave_ways); + return ERR_PTR(-ENXIO); + } + + if (!p->targets[pos]) + return NULL; + cxled =3D p->targets[pos]; + } else { + cxlr =3D cxled->cxld.region; + if (!cxlr) + return NULL; + p =3D &cxlr->params; + } + + + if (mode =3D=3D DETACH_INVALIDATE) + cxled->part =3D -1; =20 if (p->state > CXL_CONFIG_ACTIVE) { cxl_region_decode_reset(cxlr, p->interleave_ways); p->state =3D CXL_CONFIG_ACTIVE; } =20 - for (iter =3D ep_port; !is_cxl_root(iter); + for (struct cxl_port *iter =3D cxled_to_port(cxled); !is_cxl_root(iter); iter =3D to_cxl_port(iter->dev.parent)) cxl_port_detach_region(iter, cxlr, cxled); =20 @@ -2166,7 +2191,7 @@ static int cxl_region_detach(struct cxl_endpoint_deco= der *cxled) dev_WARN_ONCE(&cxlr->dev, 1, "expected %s:%s at position %d\n", dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), cxled->pos); - goto out; + return NULL; } =20 if (p->state =3D=3D CXL_CONFIG_ACTIVE) { @@ -2180,21 +2205,7 @@ static int cxl_region_detach(struct cxl_endpoint_dec= oder *cxled) .end =3D -1, }; =20 - /* notify the region driver that one of its targets has departed */ - up_write(&cxl_region_rwsem); - device_release_driver(&cxlr->dev); - down_write(&cxl_region_rwsem); -out: - put_device(&cxlr->dev); - return rc; -} - -void cxl_decoder_kill_region(struct cxl_endpoint_decoder *cxled) -{ - down_write(&cxl_region_rwsem); - cxled->part =3D -1; - cxl_region_detach(cxled); - up_write(&cxl_region_rwsem); + return cxlr; } =20 static int attach_target(struct cxl_region *cxlr, @@ -2225,29 +2236,10 @@ static int attach_target(struct cxl_region *cxlr, =20 static int detach_target(struct cxl_region *cxlr, int pos) { - struct cxl_region_params *p =3D &cxlr->params; - int rc; - - rc =3D down_write_killable(&cxl_region_rwsem); - if (rc) - return rc; - - if (pos >=3D p->interleave_ways) { - dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos, - p->interleave_ways); - rc =3D -ENXIO; - goto out; - } - - if (!p->targets[pos]) { - rc =3D 0; - goto out; - } - - rc =3D cxl_region_detach(p->targets[pos]); -out: - up_write(&cxl_region_rwsem); - return rc; + CLASS(cxl_decoder_detach, ret)(cxlr, NULL, pos, DETACH_ONLY); + if (IS_ERR(ret)) + return PTR_ERR(ret); + return 0; } =20 static size_t store_targetN(struct cxl_region *cxlr, const char *buf, int = pos, --=20 2.49.0 From nobody Thu Oct 9 08:12:59 2025 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 2117024167D; Thu, 19 Jun 2025 05:04:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309499; cv=fail; b=aWg/p70HNay4OK0JSju6F1KV1RMwGJmViSlrvPYHNihTMwfsVlmF4szuR7KF66M67tqs2xA7WEX6rmR2JRRVK9FHd/N6bRh0HgMyMYryiSetYt2XPnJsELV49St6D35uwBozaWToILrLkV/Pi+Nuii45BwJFrfVG2l9peToTlMc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750309499; c=relaxed/simple; bh=FzGa1cF5BgK8+3Qn4FIUr4IJUcJZzVT+CQbO8TnhVMw=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=rydePb8Mt1u1fVyHvix87VknpGlfgUREKQV7UJ7QVnsTr7w257TUPwxjMGV9vhux19kEJjH1c2idKS0qPvU/AA8jmfNDel45ERorC1d95QDqyEeEzLJ1W54FWuW2gZ1IBTOzAMxQB/8TxMlmkTJUBxyjBHsQT6r3t6rpnovR1ro= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=BLY9p/Vg; arc=fail smtp.client-ip=192.198.163.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="BLY9p/Vg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1750309496; x=1781845496; h=from:to:cc:subject:date:message-id:in-reply-to: references:content-transfer-encoding:mime-version; bh=FzGa1cF5BgK8+3Qn4FIUr4IJUcJZzVT+CQbO8TnhVMw=; b=BLY9p/VgEoPkPmcO+ZndbB26xtCSQS42Jgx0PmkDz+pUDTOt01NEPuNw tGur6uRzIntcF6E5/VQp/qd5cbXec6DN1EeLgXF9Bcme6zhLDlioiRlym PMRoCyiB5uDgHJPjGH982FDc1nNcNZO09mwFyOfUeSgQyWcqJCg51OAwn F2OsTazUnIsWrIDPgjCVPwKhl1BKa9HjTuFxukJRTzvr8k9bj6kRbxofI VycFufDKErMzaPXgaLGM83zQKCrFYKSPzIQ0O48ffHjdN1U3QUbu1DdN0 i/IRs8XsRvByZZdr8BTTZVa27z3+I5+AT54AFCgu02TCo4V8fsbxCUR8z g==; X-CSE-ConnectionGUID: H0mQxf1yTK+7zYQzgKCOiw== X-CSE-MsgGUID: YP0kMqGUTomKIDES6iZg1A== X-IronPort-AV: E=McAfee;i="6800,10657,11468"; a="52702249" X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="52702249" Received: from fmviesa001.fm.intel.com ([10.60.135.141]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:55 -0700 X-CSE-ConnectionGUID: E6x8D58IQ1GqU4uBwv2LiQ== X-CSE-MsgGUID: lMwV3T1UTzSIk72lwdDUzw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,247,1744095600"; d="scan'208";a="181373673" Received: from orsmsx903.amr.corp.intel.com ([10.22.229.25]) by fmviesa001.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2025 22:04:55 -0700 Received: from ORSMSX901.amr.corp.intel.com (10.22.229.23) by ORSMSX903.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:54 -0700 Received: from ORSEDG901.ED.cps.intel.com (10.7.248.11) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25 via Frontend Transport; Wed, 18 Jun 2025 22:04:54 -0700 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (40.107.220.55) by edgegateway.intel.com (134.134.137.111) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.25; Wed, 18 Jun 2025 22:04:54 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PVoWNTFf6QLLsmCXEzH1yYXIdlhzP3ktglzFdiR4kckQp/g6gK82hyQKq3YXvJuGn3sCiU4Vl7l8IxA6gmh0J8Tk5IC27bzkCo5nFM8MpX7QFZ/5g1j/RTtCpLJq7WjRjLVtLRmltp6QgLSjwmfBZOhfFq8Zu9/LhwmOhjKfscarKZaagPNTsfKRv9FWWUmXgRB5duCb3Hfpr87zIc6w+RkaugB6yw/2QOCBXjSpRtxkgtdmPvxS5im6TDPJjqZG0EZXcl0foKRhG2LYcMQQHyOxA+Wvo12sy2LXfNdlFMS1UVuoXsjBeQs/vilMdTjQlgJv9A4HXy/0GI/aLIFOfg== 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=pnGeI9s0zjM/kbUsos/oi17BSerzhw4gUn9IjEQG4IY=; b=JdUYG1BdEhhF7rGY6QgI6wZlyiumApzOlZqlA2MP0zRW4PoylVtyMQXy40tRj7IjNV2qS1OZD40PACRswzeIim9KatV9Hvk5J9g+4ATeEKAWG2IOWTSuJEdWz4G2CznvbSXshnldNL/cbtY6aQ2KOQYqj6oZ1VReW2yKzQghElGYYpcKXnRRbTPXUyPxC31XLd/xLACaFanO7ccFwL5kxnblXvN4JFOYEOpJn/5hYcZxJbEfnR5bhZqxtovWjH6sCmBHpGKocWO5sVii/GmYS8Rs/OLqqo0qcf11UNs1MpT9fV0Ax/43G8ny9s0fkGv5aY1Xt8agWSpEWWYthdcBgg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) by CY8PR11MB6819.namprd11.prod.outlook.com (2603:10b6:930:61::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.27; Thu, 19 Jun 2025 05:04:28 +0000 Received: from PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8]) by PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::6b05:74cf:a304:ecd8%6]) with mapi id 15.20.8835.027; Thu, 19 Jun 2025 05:04:28 +0000 From: Dan Williams To: CC: , David Lechner , Peter Zijlstra , Linus Torvalds , Ingo Molnar , "Fabio M. De Francesco" , Davidlohr Bueso , Jonathan Cameron , "Dave Jiang" , Alison Schofield , Vishal Verma , Ira Weiny , Shiju Jose Subject: [PATCH v2 8/8] cxl: Convert to ACQUIRE() for conditional rwsem locking Date: Wed, 18 Jun 2025 22:04:16 -0700 Message-ID: <20250619050416.782871-9-dan.j.williams@intel.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250619050416.782871-1-dan.j.williams@intel.com> References: <20250619050416.782871-1-dan.j.williams@intel.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0151.namprd03.prod.outlook.com (2603:10b6:a03:338::6) To PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH8PR11MB8107:EE_|CY8PR11MB6819:EE_ X-MS-Office365-Filtering-Correlation-Id: 84c65719-9168-4b56-aeb6-08ddaeeec4a9 X-LD-Processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?66ya+iNEozipKQ2SlnMzHwAEGbnbqqW3K/uYpWc9rymLilf9PUgmcXw03+Y4?= =?us-ascii?Q?EJHif9Zh09FQqKOl7K3NKGwLFKMNbAu8kqE/ZRs6ScRiuSgoRA3wTL00Tezu?= =?us-ascii?Q?frLF2XKVr/cyOa389/a9+iGO/un+kra0n7L/9WJdv5F7FSleeCullurV04h5?= =?us-ascii?Q?sNRk1p6XLXTTE/iBvNA3sk05IEfv2taI2KZNcMmheznVkzsF6QenzQbgejXg?= =?us-ascii?Q?ln+Z5S3AmJCzP6RD8AkM56m2pB4ast5Z+2oLbXVElVy/A58Tr3+sDT29kMwf?= =?us-ascii?Q?M7wd18bPuG1umDNV7zJP95aRl5obbwbmMJBPEFkRQ2OCLWiEehJia9tdEtnf?= =?us-ascii?Q?MfW/bbw6p9uCfqrSwdGBc2vKAGp8pIsz1q0GP0PE+bStJq6GGWAH/pu9nJU3?= =?us-ascii?Q?xqKbEanwNuQLyFDK9YwFBx5bBPHKetauoupQJOBA51AW9+8eXusQB3V/KfV0?= =?us-ascii?Q?ILadPO1dI+QamYUDLSF6b8Xm1mBssPj2dsY18fqQtPSfTjsd3x1ZVUqlfBcH?= =?us-ascii?Q?uVrQxjpO76VilA36H+PaXrV+2FNMpFBtrs2FHzKR6fsT6tMTZ9KQFUqlIa6B?= =?us-ascii?Q?eFjKrk81nX0ImnuZY7ZsVVhVOQPSCqy+9HJ/S2oLQWE/U6G9dQQTM1LdkDkN?= =?us-ascii?Q?gNroe5CPd2tDOhjoBGc4pKxiNye40tmsTJuEtJFxkQfkFOk+cs7HgEz9449G?= =?us-ascii?Q?4MIY/sJg018DykTv1FJ0lS9U/89HeK3sgrWMWgNtcn6MPh6zuyuEmwEF2Sti?= =?us-ascii?Q?bsILTb480wLzpRV9NQ7Ct6m4UI/poMG6bSrq1uEQCkEL6Havfb4eJQXdStpO?= =?us-ascii?Q?mctsZPWsdtrxdSSkewG8lFe5pnclepup7DyyPXsSz0TcBpaSfkmSfuOInMly?= =?us-ascii?Q?q5WWQY3lkRvYZSbYZBvg2gVpWE1aPrCwB+O/YJ1GrQ9YvuJYHIc3mYIbmGCn?= =?us-ascii?Q?eCmz8lsaCggPNGF9s1xEtP0CAM+BME0X6x/ag2yiZUYP3yTvR7oP/K0/UMg7?= =?us-ascii?Q?ZSx9GMeNaUfMPPCELXMBGb8OXGzGPft2ZMzEbul+FAfZddtb+sfa/m+W2OM2?= =?us-ascii?Q?R5ydPpJublFIqZyVom4cs71F0DOvKRhvVpOfJ9paNRgMz6l+AYDWxe08Ey8V?= =?us-ascii?Q?Zib5vq8uZdIaxwIUmfMpOIzrloWiDkEBaHWOdRy6ZM5Pqw3RrQ/wlOLR5eTe?= =?us-ascii?Q?guOAWoSbvfB9ErVlrN+oSfF3Cp68iD5K3vcEGj+tF/xNbih68EGe+439Z03O?= =?us-ascii?Q?4LbPqH+durp4kROxYV0EstKozjPisFOxzfKftcrYKAWBduuiCsz1JG15HnkM?= =?us-ascii?Q?/o3PCuxFgfR7AZrZNNTabqhr/IZUpQ+TEnFPri5NIQ5XTuknrJWUol17fQSm?= =?us-ascii?Q?IIEMQwCuJvzGPF3ZKIWn5bcfOLtsCYO2onVyftCaAquYuaFHPKkEB/j8cbQH?= =?us-ascii?Q?WotTbpJhJvQ=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR11MB8107.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?eFIto9/9FIYipaLgosvDZFExHywGuOksk2qfunJVuxV7AmAvlkd0aFbxpZSq?= =?us-ascii?Q?BjcpFyVsxPGp1MRnn6IpUV48Wd9i4EmMRj6MbfVKO7pcrOJqnM81iuODIKOz?= =?us-ascii?Q?WrcDGM8hYnvy6Wx1xTp9wggCkTYLRgvHkP1Hie4ZBz5IuXukvJcIXJD2LFy5?= =?us-ascii?Q?awQzbSQfbs0HHrsuwa0balFGvsfFtye5NW8Y6jRkYy2xpQDMj9sAwhDLroSP?= =?us-ascii?Q?eXKvxL9shMBy4ANCYMQIaitP2w/naQevCf6NgDQxKqCsHkaaMnYOi7YmZF3u?= =?us-ascii?Q?HsTPmB6/F7keGQAm4Q2lA3TpSFNDf+7bpmL7bjssWOKajqO0KPzPf7BQyY3C?= =?us-ascii?Q?5w8jFeLhSUoZreIdI/TBqyUHhJkvSC9yvaD84tY8Tlh3RbPtMQcQd5SZ1RQj?= =?us-ascii?Q?AlClKy4p49QThyvnHSTjKHlhOAPIfRSKHv2ULXu/QYFoWYGYPgWLLheHKsth?= =?us-ascii?Q?OI3o4hJNdLiWa+ZuDOvk/WYF1We8ADFXVLn5Y2Vcub4vzuGaISQr6WAb0Cnw?= =?us-ascii?Q?GiuUtiUPcgtkAZS9uc3ynxabANdkIpruDBas79sz0lhSH8AKyrUi8XTmTD9q?= =?us-ascii?Q?z05h10wTiyLnvrrRhmAXAY0KNTUEHBzj91V2PUvCzYgwjUJcO2ZuLPfJRUBb?= =?us-ascii?Q?RYZ1pDRaaOLQ7AqcIWkutU4nzNHkKbXlj/9yirQUQ1ZkPMmSTGkNmCViU30M?= =?us-ascii?Q?X7Qa79QVdYw96zWA0Ca5PbRo0Yf1q1wSBSWtffN4gea9XqwDKyeQ/TDi5QZy?= =?us-ascii?Q?3VEhbILoCOf5HfXm0LIh3HZUCXuTXIILrHpjdA3a1ZcTES0qHFT8/3o9L32l?= =?us-ascii?Q?whD2rXnVPPBBWPD1TxgMoPrb+4gXoygFAZp66gsTY5uafB3AL0BW9nZErMXR?= =?us-ascii?Q?zXKRtSyxu7UfLkWhECzgog89cXHGm0aqs2uCaFpmT/fd44iEDajPINrF+xeJ?= =?us-ascii?Q?WlvUQfo+T28PGGyBwdnoHazBeTg9Z/4aeXq4JyFnc8CSqeWwqpdUN2C4q6B7?= =?us-ascii?Q?qZN0WE9epsi8vWrO1VLz3eZ/knbLEjOcLkA9HcKP8fL1jyC7p7+FVCTsF1m3?= =?us-ascii?Q?qjdZ+3Wnhf+JGNsVZBPMZc7a7Xrcxx5mxojYAcKzNS39HE9Ck/wc75AoecM0?= =?us-ascii?Q?E/jA07VFjjgCHTXtuU02evpsOPJc0KyiB3CW3xtzCrzmxfv/zmcC7Yqj9m5y?= =?us-ascii?Q?Hfor7gJr51kJRLBvCxOU+yuWdlOD4yc+6f4ey+7iEnQC1ZbJzurQdqM4HD33?= =?us-ascii?Q?BiZmzDunD9RktXMVlsoUllT61Bis4UzO4+o7HGttXnJFDbZxY9SE1al/fMWK?= =?us-ascii?Q?hm/4FEALgCevq0JVVF3SMQmt53y0ejBbwAF5bN3Uh/A8luQcU6SgwLdft5Oy?= =?us-ascii?Q?WNUI8QD0foRgY8/dLI9fWh/V2FrJfXyUIKJXzRgdJnTne646X5R+Ai5cnuKI?= =?us-ascii?Q?quaQgzyvuVbhOBex5f8TdclRlX2VDIhnpS/qVp0dpDtOuXpQuMl0Tpi4XYSq?= =?us-ascii?Q?pyWqDVDRMi6gaodKuF1tdnnfaZJiuCdjSPHWEBCmCm0ya7wsOJzyzFLP5yp6?= =?us-ascii?Q?b6vNP2Gv9mO3Rrt2bTUt2TLwUq+7I5wTi/RwHmnvtK/Rx7XR9xeK0ju113Mc?= =?us-ascii?Q?UA=3D=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: 84c65719-9168-4b56-aeb6-08ddaeeec4a9 X-MS-Exchange-CrossTenant-AuthSource: PH8PR11MB8107.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 05:04:28.4792 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 9IvadolWnBZNomoAp4t2Ktu4/PyRM6eBMD3SGhozvi6bYaEbDnPHbid61lbz9Ckqe0VndxnaVOLU21vrZGzOlZVdLkBSAdc5/JTWbbsAI1M= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR11MB6819 X-OriginatorOrg: intel.com Content-Type: text/plain; charset="utf-8" Use ACQUIRE() to cleanup conditional locking paths in the CXL driver The ACQUIRE() macro and its associated ACQUIRE_ERR() helpers, like scoped_cond_guard(), arrange for scoped-based conditional locking. Unlike scoped_cond_guard(), these macros arrange for an ERR_PTR() to be retrieved representing the state of the conditional lock. The goal of this conversion is to complete the removal of all explicit unlock calls in the subsystem. I.e. the methods to acquire a lock are solely via guard(), scoped_guard() (for limited cases), or ACQUIRE(). All unlock is implicit / scope-based. In order to make sure all lock sites are converted, the existing rwsem's are consolidated and renamed in 'struct cxl_rwsem'. While that makes the patch noisier it gives a clean cut-off between old-world (explicit unlock allowed), and new world (explicit unlock deleted). Cc: David Lechner Cc: Peter Zijlstra Cc: Linus Torvalds Cc: Ingo Molnar Cc: "Fabio M. De Francesco" Cc: Davidlohr Bueso Cc: Jonathan Cameron Cc: Dave Jiang Cc: Alison Schofield Cc: Vishal Verma Cc: Ira Weiny Cc: Shiju Jose Signed-off-by: Dan Williams Acked-by: Peter Zijlstra (Intel) --- drivers/cxl/core/cdat.c | 6 +- drivers/cxl/core/core.h | 43 +++--- drivers/cxl/core/edac.c | 44 +++---- drivers/cxl/core/hdm.c | 41 +++--- drivers/cxl/core/mbox.c | 6 +- drivers/cxl/core/memdev.c | 50 +++---- drivers/cxl/core/port.c | 18 +-- drivers/cxl/core/region.c | 266 +++++++++++++++----------------------- drivers/cxl/cxl.h | 13 +- include/linux/rwsem.h | 1 + 10 files changed, 206 insertions(+), 282 deletions(-) diff --git a/drivers/cxl/core/cdat.c b/drivers/cxl/core/cdat.c index 0ccef2f2a26a..c0af645425f4 100644 --- a/drivers/cxl/core/cdat.c +++ b/drivers/cxl/core/cdat.c @@ -336,7 +336,7 @@ static int match_cxlrd_hb(struct device *dev, void *dat= a) cxlrd =3D to_cxl_root_decoder(dev); cxlsd =3D &cxlrd->cxlsd; =20 - guard(rwsem_read)(&cxl_region_rwsem); + guard(rwsem_read)(&cxl_rwsem.region); for (int i =3D 0; i < cxlsd->nr_targets; i++) { if (host_bridge =3D=3D cxlsd->target[i]->dport_dev) return 1; @@ -987,7 +987,7 @@ void cxl_region_shared_upstream_bandwidth_update(struct= cxl_region *cxlr) bool is_root; int rc; =20 - lockdep_assert_held(&cxl_dpa_rwsem); + lockdep_assert_held(&cxl_rwsem.dpa); =20 struct xarray *usp_xa __free(free_perf_xa) =3D kzalloc(sizeof(*usp_xa), GFP_KERNEL); @@ -1057,7 +1057,7 @@ void cxl_region_perf_data_calculate(struct cxl_region= *cxlr, { struct cxl_dpa_perf *perf; =20 - lockdep_assert_held(&cxl_dpa_rwsem); + lockdep_assert_held(&cxl_rwsem.dpa); =20 perf =3D cxled_get_dpa_perf(cxled); if (IS_ERR(perf)) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 8a65777ef3d3..ed7d08244542 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -5,6 +5,7 @@ #define __CXL_CORE_H__ =20 #include +#include =20 extern const struct device_type cxl_nvdimm_bridge_type; extern const struct device_type cxl_nvdimm_type; @@ -107,8 +108,20 @@ u16 cxl_rcrb_to_aer(struct device *dev, resource_size_= t rcrb); #define PCI_RCRB_CAP_HDR_NEXT_MASK GENMASK(15, 8) #define PCI_CAP_EXP_SIZEOF 0x3c =20 -extern struct rw_semaphore cxl_dpa_rwsem; -extern struct rw_semaphore cxl_region_rwsem; +struct cxl_rwsem { + /* + * All changes to HPA (interleave configuration) occur with this + * lock held for write. + */ + struct rw_semaphore region; + /* + * All changes to a device DPA space occur with this lock held + * for write. + */ + struct rw_semaphore dpa; +}; + +extern struct cxl_rwsem cxl_rwsem; =20 DEFINE_CLASS( cxl_decoder_detach, struct cxl_region *, @@ -117,22 +130,22 @@ DEFINE_CLASS( put_device(&_T->dev); }, ({ - int rc =3D 0; - /* when the decoder is being destroyed lock unconditionally */ - if (mode =3D=3D DETACH_INVALIDATE) - down_write(&cxl_region_rwsem); - else - rc =3D down_write_killable(&cxl_region_rwsem); - - if (rc) - cxlr =3D ERR_PTR(rc); - else { + if (mode =3D=3D DETACH_INVALIDATE) { + guard(rwsem_write)(&cxl_rwsem.region); cxlr =3D cxl_decoder_detach(cxlr, cxled, pos, mode); - get_device(&cxlr->dev); + } else { + int rc; + + ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_write_kill, &rwsem))) + cxlr =3D ERR_PTR(rc); + else + cxlr =3D cxl_decoder_detach(cxlr, cxled, pos, + mode); } - up_write(&cxl_region_rwsem); - + if (!IS_ERR_OR_NULL(cxlr)) + get_device(&cxlr->dev); cxlr; }), struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled, int pos, diff --git a/drivers/cxl/core/edac.c b/drivers/cxl/core/edac.c index 2cbc664e5d62..f1ebdbe222c8 100644 --- a/drivers/cxl/core/edac.c +++ b/drivers/cxl/core/edac.c @@ -115,10 +115,9 @@ static int cxl_scrub_get_attrbs(struct cxl_patrol_scru= b_context *cxl_ps_ctx, flags, min_cycle); } =20 - struct rw_semaphore *region_lock __free(rwsem_read_release) =3D - rwsem_read_intr_acquire(&cxl_region_rwsem); - if (!region_lock) - return -EINTR; + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if ((ret =3D ACQUIRE_ERR(rwsem_read_intr, &rwsem))) + return ret; =20 cxlr =3D cxl_ps_ctx->cxlr; p =3D &cxlr->params; @@ -154,10 +153,9 @@ static int cxl_scrub_set_attrbs_region(struct device *= dev, struct cxl_region *cxlr; int ret, i; =20 - struct rw_semaphore *region_lock __free(rwsem_read_release) =3D - rwsem_read_intr_acquire(&cxl_region_rwsem); - if (!region_lock) - return -EINTR; + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if ((ret =3D ACQUIRE_ERR(rwsem_read_intr, &rwsem))) + return ret; =20 cxlr =3D cxl_ps_ctx->cxlr; p =3D &cxlr->params; @@ -1332,16 +1330,15 @@ cxl_mem_perform_sparing(struct device *dev, struct cxl_memdev_sparing_in_payload sparing_pi; struct cxl_event_dram *rec =3D NULL; u16 validity_flags =3D 0; + int ret; =20 - struct rw_semaphore *region_lock __free(rwsem_read_release) =3D - rwsem_read_intr_acquire(&cxl_region_rwsem); - if (!region_lock) - return -EINTR; + ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region); + if ((ret =3D ACQUIRE_ERR(rwsem_read_intr, ®ion_rwsem))) + return ret; =20 - struct rw_semaphore *dpa_lock __free(rwsem_read_release) =3D - rwsem_read_intr_acquire(&cxl_dpa_rwsem); - if (!dpa_lock) - return -EINTR; + ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa); + if ((ret =3D ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem))) + return ret; =20 if (!cxl_sparing_ctx->cap_safe_when_in_use) { /* Memory to repair must be offline */ @@ -1779,16 +1776,15 @@ static int cxl_mem_perform_ppr(struct cxl_ppr_conte= xt *cxl_ppr_ctx) struct cxl_memdev_ppr_maintenance_attrbs maintenance_attrbs; struct cxl_memdev *cxlmd =3D cxl_ppr_ctx->cxlmd; struct cxl_mem_repair_attrbs attrbs =3D { 0 }; + int ret; =20 - struct rw_semaphore *region_lock __free(rwsem_read_release) =3D - rwsem_read_intr_acquire(&cxl_region_rwsem); - if (!region_lock) - return -EINTR; + ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region); + if ((ret =3D ACQUIRE_ERR(rwsem_read_intr, ®ion_rwsem))) + return ret; =20 - struct rw_semaphore *dpa_lock __free(rwsem_read_release) =3D - rwsem_read_intr_acquire(&cxl_dpa_rwsem); - if (!dpa_lock) - return -EINTR; + ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa); + if ((ret =3D ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem))) + return ret; =20 if (!cxl_ppr_ctx->media_accessible || !cxl_ppr_ctx->data_retained) { /* Memory to repair must be offline */ diff --git a/drivers/cxl/core/hdm.c b/drivers/cxl/core/hdm.c index e9cb34e30248..865a71bce251 100644 --- a/drivers/cxl/core/hdm.c +++ b/drivers/cxl/core/hdm.c @@ -16,7 +16,10 @@ * for enumerating these registers and capabilities. */ =20 -DECLARE_RWSEM(cxl_dpa_rwsem); +struct cxl_rwsem cxl_rwsem =3D { + .region =3D __RWSEM_INITIALIZER(cxl_rwsem.region), + .dpa =3D __RWSEM_INITIALIZER(cxl_rwsem.dpa), +}; =20 static int add_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld, int *target_map) @@ -214,7 +217,7 @@ void cxl_dpa_debug(struct seq_file *file, struct cxl_de= v_state *cxlds) { struct resource *p1, *p2; =20 - guard(rwsem_read)(&cxl_dpa_rwsem); + guard(rwsem_read)(&cxl_rwsem.dpa); for (p1 =3D cxlds->dpa_res.child; p1; p1 =3D p1->sibling) { __cxl_dpa_debug(file, p1, 0); for (p2 =3D p1->child; p2; p2 =3D p2->sibling) @@ -266,7 +269,7 @@ static void __cxl_dpa_release(struct cxl_endpoint_decod= er *cxled) struct resource *res =3D cxled->dpa_res; resource_size_t skip_start; =20 - lockdep_assert_held_write(&cxl_dpa_rwsem); + lockdep_assert_held_write(&cxl_rwsem.dpa); =20 /* save @skip_start, before @res is released */ skip_start =3D res->start - cxled->skip; @@ -281,7 +284,7 @@ static void __cxl_dpa_release(struct cxl_endpoint_decod= er *cxled) =20 static void cxl_dpa_release(void *cxled) { - guard(rwsem_write)(&cxl_dpa_rwsem); + guard(rwsem_write)(&cxl_rwsem.dpa); __cxl_dpa_release(cxled); } =20 @@ -293,7 +296,7 @@ static void devm_cxl_dpa_release(struct cxl_endpoint_de= coder *cxled) { struct cxl_port *port =3D cxled_to_port(cxled); =20 - lockdep_assert_held_write(&cxl_dpa_rwsem); + lockdep_assert_held_write(&cxl_rwsem.dpa); devm_remove_action(&port->dev, cxl_dpa_release, cxled); __cxl_dpa_release(cxled); } @@ -361,7 +364,7 @@ static int __cxl_dpa_reserve(struct cxl_endpoint_decode= r *cxled, struct resource *res; int rc; =20 - lockdep_assert_held_write(&cxl_dpa_rwsem); + lockdep_assert_held_write(&cxl_rwsem.dpa); =20 if (!len) { dev_warn(dev, "decoder%d.%d: empty reservation attempted\n", @@ -470,7 +473,7 @@ int cxl_dpa_setup(struct cxl_dev_state *cxlds, const st= ruct cxl_dpa_info *info) { struct device *dev =3D cxlds->dev; =20 - guard(rwsem_write)(&cxl_dpa_rwsem); + guard(rwsem_write)(&cxl_rwsem.dpa); =20 if (cxlds->nr_partitions) return -EBUSY; @@ -516,9 +519,8 @@ int devm_cxl_dpa_reserve(struct cxl_endpoint_decoder *c= xled, struct cxl_port *port =3D cxled_to_port(cxled); int rc; =20 - down_write(&cxl_dpa_rwsem); - rc =3D __cxl_dpa_reserve(cxled, base, len, skipped); - up_write(&cxl_dpa_rwsem); + scoped_guard(rwsem_write, &cxl_rwsem.dpa) + rc =3D __cxl_dpa_reserve(cxled, base, len, skipped); =20 if (rc) return rc; @@ -529,7 +531,7 @@ EXPORT_SYMBOL_NS_GPL(devm_cxl_dpa_reserve, "CXL"); =20 resource_size_t cxl_dpa_size(struct cxl_endpoint_decoder *cxled) { - guard(rwsem_read)(&cxl_dpa_rwsem); + guard(rwsem_read)(&cxl_rwsem.dpa); if (cxled->dpa_res) return resource_size(cxled->dpa_res); =20 @@ -540,7 +542,7 @@ resource_size_t cxl_dpa_resource_start(struct cxl_endpo= int_decoder *cxled) { resource_size_t base =3D -1; =20 - lockdep_assert_held(&cxl_dpa_rwsem); + lockdep_assert_held(&cxl_rwsem.dpa); if (cxled->dpa_res) base =3D cxled->dpa_res->start; =20 @@ -552,7 +554,7 @@ int cxl_dpa_free(struct cxl_endpoint_decoder *cxled) struct cxl_port *port =3D cxled_to_port(cxled); struct device *dev =3D &cxled->cxld.dev; =20 - guard(rwsem_write)(&cxl_dpa_rwsem); + guard(rwsem_write)(&cxl_rwsem.dpa); if (!cxled->dpa_res) return 0; if (cxled->cxld.region) { @@ -582,7 +584,7 @@ int cxl_dpa_set_part(struct cxl_endpoint_decoder *cxled, struct device *dev =3D &cxled->cxld.dev; int part; =20 - guard(rwsem_write)(&cxl_dpa_rwsem); + guard(rwsem_write)(&cxl_rwsem.dpa); if (cxled->cxld.flags & CXL_DECODER_F_ENABLE) return -EBUSY; =20 @@ -614,7 +616,7 @@ static int __cxl_dpa_alloc(struct cxl_endpoint_decoder = *cxled, u64 size) struct resource *p, *last; int part; =20 - guard(rwsem_write)(&cxl_dpa_rwsem); + guard(rwsem_write)(&cxl_rwsem.dpa); if (cxled->cxld.region) { dev_dbg(dev, "decoder attached to %s\n", dev_name(&cxled->cxld.region->dev)); @@ -842,9 +844,8 @@ static int cxl_decoder_commit(struct cxl_decoder *cxld) } } =20 - down_read(&cxl_dpa_rwsem); - setup_hw_decoder(cxld, hdm); - up_read(&cxl_dpa_rwsem); + scoped_guard(rwsem_read, &cxl_rwsem.dpa) + setup_hw_decoder(cxld, hdm); =20 port->commit_end++; rc =3D cxld_await_commit(hdm, cxld->id); @@ -882,7 +883,7 @@ void cxl_port_commit_reap(struct cxl_decoder *cxld) { struct cxl_port *port =3D to_cxl_port(cxld->dev.parent); =20 - lockdep_assert_held_write(&cxl_region_rwsem); + lockdep_assert_held_write(&cxl_rwsem.region); =20 /* * Once the highest committed decoder is disabled, free any other @@ -1030,7 +1031,7 @@ static int init_hdm_decoder(struct cxl_port *port, st= ruct cxl_decoder *cxld, else cxld->target_type =3D CXL_DECODER_DEVMEM; =20 - guard(rwsem_write)(&cxl_region_rwsem); + guard(rwsem_write)(&cxl_rwsem.region); if (cxld->id !=3D cxl_num_decoders_committed(port)) { dev_warn(&port->dev, "decoder%d.%d: Committed out of order\n", diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 81b21effe8cf..92cd3cbdd8ec 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -909,8 +909,8 @@ void cxl_event_trace_record(const struct cxl_memdev *cx= lmd, * translations. Take topology mutation locks and lookup * { HPA, REGION } from { DPA, MEMDEV } in the event record. */ - guard(rwsem_read)(&cxl_region_rwsem); - guard(rwsem_read)(&cxl_dpa_rwsem); + guard(rwsem_read)(&cxl_rwsem.region); + guard(rwsem_read)(&cxl_rwsem.dpa); =20 dpa =3D le64_to_cpu(evt->media_hdr.phys_addr) & CXL_DPA_MASK; cxlr =3D cxl_dpa_to_region(cxlmd, dpa); @@ -1265,7 +1265,7 @@ int cxl_mem_sanitize(struct cxl_memdev *cxlmd, u16 cm= d) /* synchronize with cxl_mem_probe() and decoder write operations */ guard(device)(&cxlmd->dev); endpoint =3D cxlmd->endpoint; - guard(rwsem_read)(&cxl_region_rwsem); + guard(rwsem_read)(&cxl_rwsem.region); /* * Require an endpoint to be safe otherwise the driver can not * be sure that the device is unmapped. diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c index f88a13adf7fa..f5fbd34310fd 100644 --- a/drivers/cxl/core/memdev.c +++ b/drivers/cxl/core/memdev.c @@ -232,15 +232,13 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd) if (!port || !is_cxl_endpoint(port)) return -EINVAL; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, ®ion_rwsem))) return rc; =20 - rc =3D down_read_interruptible(&cxl_dpa_rwsem); - if (rc) { - up_read(&cxl_region_rwsem); + ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem))) return rc; - } =20 if (cxl_num_decoders_committed(port) =3D=3D 0) { /* No regions mapped to this memdev */ @@ -249,8 +247,6 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd) /* Regions mapped, collect poison by endpoint */ rc =3D cxl_get_poison_by_endpoint(port); } - up_read(&cxl_dpa_rwsem); - up_read(&cxl_region_rwsem); =20 return rc; } @@ -292,19 +288,17 @@ int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 d= pa) if (!IS_ENABLED(CONFIG_DEBUG_FS)) return 0; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, ®ion_rwsem))) return rc; =20 - rc =3D down_read_interruptible(&cxl_dpa_rwsem); - if (rc) { - up_read(&cxl_region_rwsem); + ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem))) return rc; - } =20 rc =3D cxl_validate_poison_dpa(cxlmd, dpa); if (rc) - goto out; + return rc; =20 inject.address =3D cpu_to_le64(dpa); mbox_cmd =3D (struct cxl_mbox_cmd) { @@ -314,7 +308,7 @@ int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa) }; rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc) - goto out; + return rc; =20 cxlr =3D cxl_dpa_to_region(cxlmd, dpa); if (cxlr) @@ -327,11 +321,8 @@ int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dp= a) .length =3D cpu_to_le32(1), }; trace_cxl_poison(cxlmd, cxlr, &record, 0, 0, CXL_POISON_TRACE_INJECT); -out: - up_read(&cxl_dpa_rwsem); - up_read(&cxl_region_rwsem); =20 - return rc; + return 0; } EXPORT_SYMBOL_NS_GPL(cxl_inject_poison, "CXL"); =20 @@ -347,19 +338,17 @@ int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dp= a) if (!IS_ENABLED(CONFIG_DEBUG_FS)) return 0; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, ®ion_rwsem))) return rc; =20 - rc =3D down_read_interruptible(&cxl_dpa_rwsem); - if (rc) { - up_read(&cxl_region_rwsem); + ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem))) return rc; - } =20 rc =3D cxl_validate_poison_dpa(cxlmd, dpa); if (rc) - goto out; + return rc; =20 /* * In CXL 3.0 Spec 8.2.9.8.4.3, the Clear Poison mailbox command @@ -378,7 +367,7 @@ int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa) =20 rc =3D cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); if (rc) - goto out; + return rc; =20 cxlr =3D cxl_dpa_to_region(cxlmd, dpa); if (cxlr) @@ -391,11 +380,8 @@ int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa) .length =3D cpu_to_le32(1), }; trace_cxl_poison(cxlmd, cxlr, &record, 0, 0, CXL_POISON_TRACE_CLEAR); -out: - up_read(&cxl_dpa_rwsem); - up_read(&cxl_region_rwsem); =20 - return rc; + return 0; } EXPORT_SYMBOL_NS_GPL(cxl_clear_poison, "CXL"); =20 diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index 0f1629856380..58764d8a935b 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -30,18 +30,12 @@ * instantiated by the core. */ =20 -/* - * All changes to the interleave configuration occur with this lock held - * for write. - */ -DECLARE_RWSEM(cxl_region_rwsem); - static DEFINE_IDA(cxl_port_ida); static DEFINE_XARRAY(cxl_root_buses); =20 int cxl_num_decoders_committed(struct cxl_port *port) { - lockdep_assert_held(&cxl_region_rwsem); + lockdep_assert_held(&cxl_rwsem.region); =20 return port->commit_end + 1; } @@ -176,7 +170,7 @@ static ssize_t target_list_show(struct device *dev, ssize_t offset; int rc; =20 - guard(rwsem_read)(&cxl_region_rwsem); + guard(rwsem_read)(&cxl_rwsem.region); rc =3D emit_target_list(cxlsd, buf); if (rc < 0) return rc; @@ -196,7 +190,7 @@ static ssize_t mode_show(struct device *dev, struct dev= ice_attribute *attr, struct cxl_endpoint_decoder *cxled =3D to_cxl_endpoint_decoder(dev); struct cxl_memdev *cxlmd =3D cxled_to_memdev(cxled); struct cxl_dev_state *cxlds =3D cxlmd->cxlds; - /* without @cxl_dpa_rwsem, make sure @part is not reloaded */ + /* without @cxl_rwsem.dpa, make sure @part is not reloaded */ int part =3D READ_ONCE(cxled->part); const char *desc; =20 @@ -235,7 +229,7 @@ static ssize_t dpa_resource_show(struct device *dev, st= ruct device_attribute *at { struct cxl_endpoint_decoder *cxled =3D to_cxl_endpoint_decoder(dev); =20 - guard(rwsem_read)(&cxl_dpa_rwsem); + guard(rwsem_read)(&cxl_rwsem.dpa); return sysfs_emit(buf, "%#llx\n", (u64)cxl_dpa_resource_start(cxled)); } static DEVICE_ATTR_RO(dpa_resource); @@ -560,7 +554,7 @@ static ssize_t decoders_committed_show(struct device *d= ev, { struct cxl_port *port =3D to_cxl_port(dev); =20 - guard(rwsem_read)(&cxl_region_rwsem); + guard(rwsem_read)(&cxl_rwsem.region); return sysfs_emit(buf, "%d\n", cxl_num_decoders_committed(port)); } =20 @@ -1722,7 +1716,7 @@ static int decoder_populate_targets(struct cxl_switch= _decoder *cxlsd, if (xa_empty(&port->dports)) return -EINVAL; =20 - guard(rwsem_write)(&cxl_region_rwsem); + guard(rwsem_write)(&cxl_rwsem.region); for (i =3D 0; i < cxlsd->cxld.interleave_ways; i++) { struct cxl_dport *dport =3D find_dport(port, target_map[i]); =20 diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 010964aa5489..a2ba19151d4f 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -141,16 +141,12 @@ static ssize_t uuid_show(struct device *dev, struct d= evice_attribute *attr, struct cxl_region_params *p =3D &cxlr->params; ssize_t rc; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, ®ion_rwsem))) return rc; if (cxlr->mode !=3D CXL_PARTMODE_PMEM) - rc =3D sysfs_emit(buf, "\n"); - else - rc =3D sysfs_emit(buf, "%pUb\n", &p->uuid); - up_read(&cxl_region_rwsem); - - return rc; + return sysfs_emit(buf, "\n"); + return sysfs_emit(buf, "%pUb\n", &p->uuid); } =20 static int is_dup(struct device *match, void *data) @@ -162,7 +158,7 @@ static int is_dup(struct device *match, void *data) if (!is_cxl_region(match)) return 0; =20 - lockdep_assert_held(&cxl_region_rwsem); + lockdep_assert_held(&cxl_rwsem.region); cxlr =3D to_cxl_region(match); p =3D &cxlr->params; =20 @@ -192,27 +188,22 @@ static ssize_t uuid_store(struct device *dev, struct = device_attribute *attr, if (uuid_is_null(&temp)) return -EINVAL; =20 - rc =3D down_write_killable(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_write_kill, region_rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_write_kill, ®ion_rwsem))) return rc; =20 if (uuid_equal(&p->uuid, &temp)) - goto out; + return len; =20 - rc =3D -EBUSY; if (p->state >=3D CXL_CONFIG_ACTIVE) - goto out; + return -EBUSY; =20 rc =3D bus_for_each_dev(&cxl_bus_type, NULL, &temp, is_dup); if (rc < 0) - goto out; + return rc; =20 uuid_copy(&p->uuid, &temp); -out: - up_write(&cxl_region_rwsem); =20 - if (rc) - return rc; return len; } static DEVICE_ATTR_RW(uuid); @@ -354,20 +345,17 @@ static int queue_reset(struct cxl_region *cxlr) struct cxl_region_params *p =3D &cxlr->params; int rc; =20 - rc =3D down_write_killable(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_write_kill, &rwsem))) return rc; =20 /* Already in the requested state? */ if (p->state < CXL_CONFIG_COMMIT) - goto out; + return 0; =20 p->state =3D CXL_CONFIG_RESET_PENDING; =20 -out: - up_write(&cxl_region_rwsem); - - return rc; + return 0; } =20 static int __commit(struct cxl_region *cxlr) @@ -375,19 +363,17 @@ static int __commit(struct cxl_region *cxlr) struct cxl_region_params *p =3D &cxlr->params; int rc; =20 - rc =3D down_write_killable(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_write_kill, &rwsem))) return rc; =20 /* Already in the requested state? */ if (p->state >=3D CXL_CONFIG_COMMIT) - goto out; + return 0; =20 /* Not ready to commit? */ - if (p->state < CXL_CONFIG_ACTIVE) { - rc =3D -ENXIO; - goto out; - } + if (p->state < CXL_CONFIG_ACTIVE) + return -ENXIO; =20 /* * Invalidate caches before region setup to drop any speculative @@ -395,16 +381,15 @@ static int __commit(struct cxl_region *cxlr) */ rc =3D cxl_region_invalidate_memregion(cxlr); if (rc) - goto out; + return rc; =20 rc =3D cxl_region_decode_commit(cxlr); - if (rc =3D=3D 0) - p->state =3D CXL_CONFIG_COMMIT; + if (rc) + return rc; =20 -out: - up_write(&cxl_region_rwsem); + p->state =3D CXL_CONFIG_COMMIT; =20 - return rc; + return 0; } =20 static ssize_t commit_store(struct device *dev, struct device_attribute *a= ttr, @@ -437,10 +422,10 @@ static ssize_t commit_store(struct device *dev, struc= t device_attribute *attr, device_release_driver(&cxlr->dev); =20 /* - * With the reset pending take cxl_region_rwsem unconditionally + * With the reset pending take cxl_rwsem.region unconditionally * to ensure the reset gets handled before returning. */ - guard(rwsem_write)(&cxl_region_rwsem); + guard(rwsem_write)(&cxl_rwsem.region); =20 /* * Revalidate that the reset is still pending in case another @@ -461,13 +446,10 @@ static ssize_t commit_show(struct device *dev, struct= device_attribute *attr, struct cxl_region_params *p =3D &cxlr->params; ssize_t rc; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, &rwsem))) return rc; - rc =3D sysfs_emit(buf, "%d\n", p->state >=3D CXL_CONFIG_COMMIT); - up_read(&cxl_region_rwsem); - - return rc; + return sysfs_emit(buf, "%d\n", p->state >=3D CXL_CONFIG_COMMIT); } static DEVICE_ATTR_RW(commit); =20 @@ -491,15 +473,11 @@ static ssize_t interleave_ways_show(struct device *de= v, { struct cxl_region *cxlr =3D to_cxl_region(dev); struct cxl_region_params *p =3D &cxlr->params; - ssize_t rc; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) - return rc; - rc =3D sysfs_emit(buf, "%d\n", p->interleave_ways); - up_read(&cxl_region_rwsem); - - return rc; + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if (ACQUIRE_ERR(rwsem_read_intr, &rwsem)) + return ACQUIRE_ERR(rwsem_read_intr, &rwsem); + return sysfs_emit(buf, "%d\n", p->interleave_ways); } =20 static const struct attribute_group *get_cxl_region_target_group(void); @@ -534,23 +512,21 @@ static ssize_t interleave_ways_store(struct device *d= ev, return -EINVAL; } =20 - rc =3D down_write_killable(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_write_kill, &rwsem))) return rc; - if (p->state >=3D CXL_CONFIG_INTERLEAVE_ACTIVE) { - rc =3D -EBUSY; - goto out; - } + + if (p->state >=3D CXL_CONFIG_INTERLEAVE_ACTIVE) + return -EBUSY; =20 save =3D p->interleave_ways; p->interleave_ways =3D val; rc =3D sysfs_update_group(&cxlr->dev.kobj, get_cxl_region_target_group()); - if (rc) + if (rc) { p->interleave_ways =3D save; -out: - up_write(&cxl_region_rwsem); - if (rc) return rc; + } + return len; } static DEVICE_ATTR_RW(interleave_ways); @@ -561,15 +537,11 @@ static ssize_t interleave_granularity_show(struct dev= ice *dev, { struct cxl_region *cxlr =3D to_cxl_region(dev); struct cxl_region_params *p =3D &cxlr->params; - ssize_t rc; - - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) - return rc; - rc =3D sysfs_emit(buf, "%d\n", p->interleave_granularity); - up_read(&cxl_region_rwsem); =20 - return rc; + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if (ACQUIRE_ERR(rwsem_read_intr, &rwsem)) + return ACQUIRE_ERR(rwsem_read_intr, &rwsem); + return sysfs_emit(buf, "%d\n", p->interleave_granularity); } =20 static ssize_t interleave_granularity_store(struct device *dev, @@ -602,19 +574,15 @@ static ssize_t interleave_granularity_store(struct de= vice *dev, if (cxld->interleave_ways > 1 && val !=3D cxld->interleave_granularity) return -EINVAL; =20 - rc =3D down_write_killable(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_write_kill, &rwsem))) return rc; - if (p->state >=3D CXL_CONFIG_INTERLEAVE_ACTIVE) { - rc =3D -EBUSY; - goto out; - } + + if (p->state >=3D CXL_CONFIG_INTERLEAVE_ACTIVE) + return -EBUSY; =20 p->interleave_granularity =3D val; -out: - up_write(&cxl_region_rwsem); - if (rc) - return rc; + return len; } static DEVICE_ATTR_RW(interleave_granularity); @@ -625,17 +593,14 @@ static ssize_t resource_show(struct device *dev, stru= ct device_attribute *attr, struct cxl_region *cxlr =3D to_cxl_region(dev); struct cxl_region_params *p =3D &cxlr->params; u64 resource =3D -1ULL; - ssize_t rc; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) - return rc; + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if (ACQUIRE_ERR(rwsem_read_intr, &rwsem)) + return ACQUIRE_ERR(rwsem_read_intr, &rwsem); + if (p->res) resource =3D p->res->start; - rc =3D sysfs_emit(buf, "%#llx\n", resource); - up_read(&cxl_region_rwsem); - - return rc; + return sysfs_emit(buf, "%#llx\n", resource); } static DEVICE_ATTR_RO(resource); =20 @@ -663,7 +628,7 @@ static int alloc_hpa(struct cxl_region *cxlr, resource_= size_t size) struct resource *res; u64 remainder =3D 0; =20 - lockdep_assert_held_write(&cxl_region_rwsem); + lockdep_assert_held_write(&cxl_rwsem.region); =20 /* Nothing to do... */ if (p->res && resource_size(p->res) =3D=3D size) @@ -705,7 +670,7 @@ static void cxl_region_iomem_release(struct cxl_region = *cxlr) struct cxl_region_params *p =3D &cxlr->params; =20 if (device_is_registered(&cxlr->dev)) - lockdep_assert_held_write(&cxl_region_rwsem); + lockdep_assert_held_write(&cxl_rwsem.region); if (p->res) { /* * Autodiscovered regions may not have been able to insert their @@ -722,7 +687,7 @@ static int free_hpa(struct cxl_region *cxlr) { struct cxl_region_params *p =3D &cxlr->params; =20 - lockdep_assert_held_write(&cxl_region_rwsem); + lockdep_assert_held_write(&cxl_rwsem.region); =20 if (!p->res) return 0; @@ -746,15 +711,14 @@ static ssize_t size_store(struct device *dev, struct = device_attribute *attr, if (rc) return rc; =20 - rc =3D down_write_killable(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_write_kill, &rwsem))) return rc; =20 if (val) rc =3D alloc_hpa(cxlr, val); else rc =3D free_hpa(cxlr); - up_write(&cxl_region_rwsem); =20 if (rc) return rc; @@ -770,15 +734,12 @@ static ssize_t size_show(struct device *dev, struct d= evice_attribute *attr, u64 size =3D 0; ssize_t rc; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, &rwsem))) return rc; if (p->res) size =3D resource_size(p->res); - rc =3D sysfs_emit(buf, "%#llx\n", size); - up_read(&cxl_region_rwsem); - - return rc; + return sysfs_emit(buf, "%#llx\n", size); } static DEVICE_ATTR_RW(size); =20 @@ -804,26 +765,20 @@ static size_t show_targetN(struct cxl_region *cxlr, c= har *buf, int pos) struct cxl_endpoint_decoder *cxled; int rc; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, &rwsem))) return rc; =20 if (pos >=3D p->interleave_ways) { dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos, p->interleave_ways); - rc =3D -ENXIO; - goto out; + return -ENXIO; } =20 cxled =3D p->targets[pos]; if (!cxled) - rc =3D sysfs_emit(buf, "\n"); - else - rc =3D sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev)); -out: - up_read(&cxl_region_rwsem); - - return rc; + return sysfs_emit(buf, "\n"); + return sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev)); } =20 static int check_commit_order(struct device *dev, void *data) @@ -938,7 +893,7 @@ cxl_port_pick_region_decoder(struct cxl_port *port, /* * This decoder is pinned registered as long as the endpoint decoder is * registered, and endpoint decoder unregistration holds the - * cxl_region_rwsem over unregister events, so no need to hold on to + * cxl_rwsem.region over unregister events, so no need to hold on to * this extra reference. */ put_device(dev); @@ -1129,7 +1084,7 @@ static int cxl_port_attach_region(struct cxl_port *po= rt, unsigned long index; int rc =3D -EBUSY; =20 - lockdep_assert_held_write(&cxl_region_rwsem); + lockdep_assert_held_write(&cxl_rwsem.region); =20 cxl_rr =3D cxl_rr_load(port, cxlr); if (cxl_rr) { @@ -1239,7 +1194,7 @@ static void cxl_port_detach_region(struct cxl_port *p= ort, struct cxl_region_ref *cxl_rr; struct cxl_ep *ep =3D NULL; =20 - lockdep_assert_held_write(&cxl_region_rwsem); + lockdep_assert_held_write(&cxl_rwsem.region); =20 cxl_rr =3D cxl_rr_load(port, cxlr); if (!cxl_rr) @@ -2150,7 +2105,7 @@ struct cxl_region *cxl_decoder_detach(struct cxl_regi= on *cxlr, { struct cxl_region_params *p; =20 - lockdep_assert_held_write(&cxl_region_rwsem); + lockdep_assert_held_write(&cxl_rwsem.region); =20 if (!cxled) { p =3D &cxlr->params; @@ -2212,19 +2167,19 @@ static int attach_target(struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled, int pos, unsigned int state) { - int rc =3D 0; - - if (state =3D=3D TASK_INTERRUPTIBLE) - rc =3D down_write_killable(&cxl_region_rwsem); - else - down_write(&cxl_region_rwsem); - if (rc) - return rc; + int rc; =20 - down_read(&cxl_dpa_rwsem); - rc =3D cxl_region_attach(cxlr, cxled, pos); - up_read(&cxl_dpa_rwsem); - up_write(&cxl_region_rwsem); + if (state =3D=3D TASK_INTERRUPTIBLE) { + ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_write_kill, &rwsem)) =3D=3D 0) { + guard(rwsem_read)(&cxl_rwsem.dpa); + rc =3D cxl_region_attach(cxlr, cxled, pos); + } + } else { + guard(rwsem_write)(&cxl_rwsem.region); + guard(rwsem_read)(&cxl_rwsem.dpa); + rc =3D cxl_region_attach(cxlr, cxled, pos); + } =20 if (rc) dev_warn(cxled->cxld.dev.parent, @@ -2493,7 +2448,7 @@ static int cxl_region_perf_attrs_callback(struct noti= fier_block *nb, return NOTIFY_DONE; =20 /* - * No need to hold cxl_region_rwsem; region parameters are stable + * No need to hold cxl_rwsem.region; region parameters are stable * within the cxl_region driver. */ region_nid =3D phys_to_target_node(cxlr->params.res->start); @@ -2516,7 +2471,7 @@ static int cxl_region_calculate_adistance(struct noti= fier_block *nb, int region_nid; =20 /* - * No need to hold cxl_region_rwsem; region parameters are stable + * No need to hold cxl_rwsem.region; region parameters are stable * within the cxl_region driver. */ region_nid =3D phys_to_target_node(cxlr->params.res->start); @@ -2665,17 +2620,13 @@ static ssize_t region_show(struct device *dev, stru= ct device_attribute *attr, struct cxl_decoder *cxld =3D to_cxl_decoder(dev); ssize_t rc; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, &rwsem))) return rc; =20 if (cxld->region) - rc =3D sysfs_emit(buf, "%s\n", dev_name(&cxld->region->dev)); - else - rc =3D sysfs_emit(buf, "\n"); - up_read(&cxl_region_rwsem); - - return rc; + return sysfs_emit(buf, "%s\n", dev_name(&cxld->region->dev)); + return sysfs_emit(buf, "\n"); } DEVICE_ATTR_RO(region); =20 @@ -3014,7 +2965,7 @@ static int cxl_pmem_region_alloc(struct cxl_region *c= xlr) struct device *dev; int i; =20 - guard(rwsem_read)(&cxl_region_rwsem); + guard(rwsem_read)(&cxl_rwsem.region); if (p->state !=3D CXL_CONFIG_COMMIT) return -ENXIO; =20 @@ -3026,7 +2977,7 @@ static int cxl_pmem_region_alloc(struct cxl_region *c= xlr) cxlr_pmem->hpa_range.start =3D p->res->start; cxlr_pmem->hpa_range.end =3D p->res->end; =20 - /* Snapshot the region configuration underneath the cxl_region_rwsem */ + /* Snapshot the region configuration underneath the cxl_rwsem.region */ cxlr_pmem->nr_mappings =3D p->nr_targets; for (i =3D 0; i < p->nr_targets; i++) { struct cxl_endpoint_decoder *cxled =3D p->targets[i]; @@ -3103,7 +3054,7 @@ static struct cxl_dax_region *cxl_dax_region_alloc(st= ruct cxl_region *cxlr) struct cxl_dax_region *cxlr_dax; struct device *dev; =20 - guard(rwsem_read)(&cxl_region_rwsem); + guard(rwsem_read)(&cxl_rwsem.region); if (p->state !=3D CXL_CONFIG_COMMIT) return ERR_PTR(-ENXIO); =20 @@ -3303,7 +3254,7 @@ static int match_region_by_range(struct device *dev, = const void *data) cxlr =3D to_cxl_region(dev); p =3D &cxlr->params; =20 - guard(rwsem_read)(&cxl_region_rwsem); + guard(rwsem_read)(&cxl_rwsem.region); if (p->res && p->res->start =3D=3D r->start && p->res->end =3D=3D r->end) return 1; =20 @@ -3363,7 +3314,7 @@ static int __construct_region(struct cxl_region *cxlr, struct resource *res; int rc; =20 - guard(rwsem_write)(&cxl_region_rwsem); + guard(rwsem_write)(&cxl_rwsem.region); p =3D &cxlr->params; if (p->state >=3D CXL_CONFIG_INTERLEAVE_ACTIVE) { dev_err(cxlmd->dev.parent, @@ -3499,10 +3450,10 @@ int cxl_add_to_region(struct cxl_endpoint_decoder *= cxled) =20 attach_target(cxlr, cxled, -1, TASK_UNINTERRUPTIBLE); =20 - down_read(&cxl_region_rwsem); - p =3D &cxlr->params; - attach =3D p->state =3D=3D CXL_CONFIG_COMMIT; - up_read(&cxl_region_rwsem); + scoped_guard(rwsem_read, &cxl_rwsem.region) { + p =3D &cxlr->params; + attach =3D p->state =3D=3D CXL_CONFIG_COMMIT; + } =20 if (attach) { /* @@ -3527,7 +3478,7 @@ u64 cxl_port_get_spa_cache_alias(struct cxl_port *end= point, u64 spa) if (!endpoint) return ~0ULL; =20 - guard(rwsem_write)(&cxl_region_rwsem); + guard(rwsem_write)(&cxl_rwsem.region); =20 xa_for_each(&endpoint->regions, index, iter) { struct cxl_region_params *p =3D &iter->region->params; @@ -3569,30 +3520,23 @@ static int cxl_region_can_probe(struct cxl_region *= cxlr) struct cxl_region_params *p =3D &cxlr->params; int rc; =20 - rc =3D down_read_interruptible(&cxl_region_rwsem); - if (rc) { + ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); + if ((rc =3D ACQUIRE_ERR(rwsem_read_intr, &rwsem))) { dev_dbg(&cxlr->dev, "probe interrupted\n"); return rc; } =20 if (p->state < CXL_CONFIG_COMMIT) { dev_dbg(&cxlr->dev, "config state: %d\n", p->state); - rc =3D -ENXIO; - goto out; + return -ENXIO; } =20 if (test_bit(CXL_REGION_F_NEEDS_RESET, &cxlr->flags)) { dev_err(&cxlr->dev, "failed to activate, re-commit region and retry\n"); - rc =3D -ENXIO; - goto out; + return -ENXIO; } =20 -out: - up_read(&cxl_region_rwsem); - - if (rc) - return rc; return 0; } =20 diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 3f1695c96abc..50799a681231 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -469,7 +469,7 @@ enum cxl_config_state { * @nr_targets: number of targets * @cache_size: extended linear cache size if exists, otherwise zero. * - * State transitions are protected by the cxl_region_rwsem + * State transitions are protected by cxl_rwsem.region */ struct cxl_region_params { enum cxl_config_state state; @@ -912,15 +912,4 @@ bool cxl_endpoint_decoder_reset_detected(struct cxl_po= rt *port); #endif =20 u16 cxl_gpf_get_dvsec(struct device *dev); - -static inline struct rw_semaphore *rwsem_read_intr_acquire(struct rw_semap= hore *rwsem) -{ - if (down_read_interruptible(rwsem)) - return NULL; - - return rwsem; -} - -DEFINE_FREE(rwsem_read_release, struct rw_semaphore *, if (_T) up_read(_T)) - #endif /* __CXL_H__ */ diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index c810deb88d13..cbafdc12e743 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h @@ -244,6 +244,7 @@ DEFINE_GUARD_COND(rwsem_read, _intr, down_read_interrup= tible(_T), _RET =3D=3D 0) =20 DEFINE_GUARD(rwsem_write, struct rw_semaphore *, down_write(_T), up_write(= _T)) DEFINE_GUARD_COND(rwsem_write, _try, down_write_trylock(_T)) +DEFINE_GUARD_COND(rwsem_write, _kill, down_write_killable(_T), _RET =3D=3D= 0) =20 /* * downgrade write lock to read lock --=20 2.49.0