From patchwork Sun Apr 13 22:52:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 14049470 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 A13FA1C860E for ; Sun, 13 Apr 2025 22:52:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.7 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584744; cv=fail; b=RJ2eMktrICYDlYK75IJN+IZfLbDsbI7rJ78cvZ1pGDO37/+BNNGzdCTKi6H2gYxgi4qk47x5wNDyMblkdxTRF4/7M8IHLpTST67tzHIONX8S6ZghWWyHpd9nM8EtSQHFgrBKaoWVyAK/nDIGzxr7OUwaFAmAHTjOWE8rRF1BCbM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584744; c=relaxed/simple; bh=dbpnUt0Rj32jPB+ZTtMa+10bARM2SLtI6QbpS09VtA4=; h=From:Date:Subject:Content-Type:Message-ID:References:In-Reply-To: To:CC:MIME-Version; b=LI9YBL0Xm3gnjr+TB2kH2BN8cQ1aIoo/k6wZ1xc07rD0Ww1F4H/wpIEvKZIPNG4hSKPDFU4hoDtcmQvRKcAjVYWo3Ar9C1BfuEfeFPYyEIjCFlvjZm/59yHaTQ1/mwyRcFocxk0VfQ1np/Pke1XN4yv3SuojJ0fbN5qN5sybmdE= 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=GJYc0G8V; arc=fail smtp.client-ip=192.198.163.7 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="GJYc0G8V" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1744584742; x=1776120742; h=from:date:subject:content-transfer-encoding:message-id: references:in-reply-to:to:cc:mime-version; bh=dbpnUt0Rj32jPB+ZTtMa+10bARM2SLtI6QbpS09VtA4=; b=GJYc0G8Vn31qDmzTRX1gjW3/oRORbCrDpA8SxIRLdcUtweUqCGJ2qW2d YbuwOtCTxINDVnRebqZldpk+XmlrW2YOXRnCwI2OMCMO+BU7H/XEeTxDI m4K1vdLwd3cGqIXXiryF/+eySdtWJgbB4sPigbMSdgFT5vNJz6gJ5V4Il ld5HTXZooyL+2PCtUWmfeU6ywkLgqip8ahDRpJSm6cC3n+KoDx9TZvYwo tDdiCpMiFb6sl6jLK2n+tni1gAkoVpmIkCNoJlyo3KBBaI/d4DACiPw9F BuWlz12YCGHEyx2iFk7hzhYysQzbNJE2gCWrPB40az1EGFnqAHUamqAoc g==; X-CSE-ConnectionGUID: d2L/evoRQnKASEo0IMTwbw== X-CSE-MsgGUID: G1ru5EZeQ3iEzIF/3y+9Cg== X-IronPort-AV: E=McAfee;i="6700,10204,11402"; a="71431138" X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="71431138" Received: from fmviesa005.fm.intel.com ([10.60.135.145]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Apr 2025 15:52:20 -0700 X-CSE-ConnectionGUID: QGOhIkznRJiD28s1okWoEA== X-CSE-MsgGUID: f8EH6ZhjSjGuw8Fi6920eA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="134405570" Received: from orsmsx901.amr.corp.intel.com ([10.22.229.23]) by fmviesa005.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Apr 2025 15:52:21 -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.14; Sun, 13 Apr 2025 15:52:20 -0700 Received: from ORSEDG602.ED.cps.intel.com (10.7.248.7) 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.14 via Frontend Transport; Sun, 13 Apr 2025 15:52:20 -0700 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (104.47.55.43) by edgegateway.intel.com (134.134.137.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.44; Sun, 13 Apr 2025 15:52:19 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=LdHooYh1JpyfT8w0EiR6oyCluqFXITWnC20fw1Ol+/8kLpwP7TsFAe4zAVsiLvbGOc/oor+Xi8FWNgnVmjEDHJ+mEg0D3ziYKlohjMiwUZqB+cjZnW3qdRkfEaJZhyuXp0SyJsD/e1eJjeWHts7X8lq4vlPpUWTQNuFDA0ETns0PF4i9lmZf+ut04SbrSALvwiGSsNjsuV5htkAyr5cDVQOaImwgJyvQQUqQnbHsGBR4HntlAVGCQlmQEkiqpRNX7wCkhn1EpD6z6kjf+JGRq7cOLwTDJhwgHBweG2Bquz8IwTQzN0VPILQs/lOZuCUIU6O0HLB37Dne0c4emKHyoQ== 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=wNoAbBBYNS2LHiqzwRXuIEpkmfzCc69lB2/JkZ8R22g=; b=NekB3uZiYnJh9pjEKc4rnOaiVonv5oyAT1bQSCafD++ZLOxBAiZgCHqA5/9uSsDpX57QBASXnHFHW59YB2yww435NrBD7RWtux4n58dpVNeCW6ncaON9XMfRURpTsN6/MqzWesmOOmjUrLyCX+j0heDl6owPwhX0G3ZB0orolfJc20R8TjdSVLSwaglvWyCG+3d3mho54Qh3kfDYIRZDaNPZs+SU5MjhG6hFBiuCsnQnFOU7ocD7ABAcWEaxuFVYUzn14V6mQ9ISHlaN+DRGaLfZFZ9pYN/PYmc7UIDKDaA9Vtb+Sqit7g7Vkg1e0zFhxVrUQjMnLOGuSg6j1FyETQ== 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 MW4PR11MB6739.namprd11.prod.outlook.com (2603:10b6:303:20b::19) by PH7PR11MB7003.namprd11.prod.outlook.com (2603:10b6:510:20a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8632.33; Sun, 13 Apr 2025 22:52:09 +0000 Received: from MW4PR11MB6739.namprd11.prod.outlook.com ([fe80::a7ad:a6e8:fced:3f24]) by MW4PR11MB6739.namprd11.prod.outlook.com ([fe80::a7ad:a6e8:fced:3f24%4]) with mapi id 15.20.8606.033; Sun, 13 Apr 2025 22:52:09 +0000 From: Ira Weiny Date: Sun, 13 Apr 2025 17:52:24 -0500 Subject: [PATCH v9 16/19] cxl/region: Read existing extents on region creation Message-ID: <20250413-dcd-type2-upstream-v9-16-1d4911a0b365@intel.com> References: <20250413-dcd-type2-upstream-v9-0-1d4911a0b365@intel.com> In-Reply-To: <20250413-dcd-type2-upstream-v9-0-1d4911a0b365@intel.com> To: Dave Jiang , Fan Ni , "Jonathan Cameron" CC: Dan Williams , Davidlohr Bueso , Alison Schofield , "Vishal Verma" , Ira Weiny , , , X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1744584735; l=8457; i=ira.weiny@intel.com; s=20221211; h=from:subject:message-id; bh=dbpnUt0Rj32jPB+ZTtMa+10bARM2SLtI6QbpS09VtA4=; b=70LGskBUS72k14zEP1Njc047eMZ4tEAL0gJfSp2jak5WU2AlIXmrrUYBAsAkY9W4FefcUPLLg 2SacYrWNvLpAk1H9F7j78oUDfgSc1+GfOT/QkEwP4WDjJWW7AndDprC X-Developer-Key: i=ira.weiny@intel.com; a=ed25519; pk=noldbkG+Wp1qXRrrkfY1QJpDf7QsOEthbOT7vm0PqsE= X-ClientProxiedBy: MW4PR03CA0227.namprd03.prod.outlook.com (2603:10b6:303:b9::22) To MW4PR11MB6739.namprd11.prod.outlook.com (2603:10b6:303:20b::19) Precedence: bulk X-Mailing-List: nvdimm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MW4PR11MB6739:EE_|PH7PR11MB7003:EE_ X-MS-Office365-Filtering-Correlation-Id: e84c113a-2d07-40ec-c33e-08dd7addd229 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024|7053199007; X-Microsoft-Antispam-Message-Info: =?utf-8?q?CkrqC6JZM1YO9OZ13kmA+i+qJE3aPtY?= =?utf-8?q?B6Q8ji8VqN5/xMXd7JqJ4W94gXR31a8JRlZjqfKfbpPIr8dIkKJc3jMWzfro7Rdc9?= =?utf-8?q?LcU6Xd0N5h8VI1znqpiN6rrebqCcGz7xDh1j2+vwsP7tHNnTWH8vNH8zy3RVJGpBg?= =?utf-8?q?55ylPpHiJmGyQcIuQwz4+hqz3lro6DfBRh2su8BJXNuMufpLW2l2Gk7xVLT1Jpyod?= =?utf-8?q?HEIsH2NZBzSGzYljZvBIQp14m50/0OML6kr6WkrCpIEe78HbfxcG+E9rZFJVsTZ8F?= =?utf-8?q?AaCqHRpAoKlugTwKD9K4LXPXYXBe1g4dDr+k6hodkNbTgRKwHhhSDYzd3Qz5pBj5T?= =?utf-8?q?enddYbYg8T6gzlWYvonp1wO+jJpFv28M//oE1+UYkdaIVSDvBCG89veG6c1DrJbiM?= =?utf-8?q?xPyxENEx6zOz0cCHqetP8ywhTdnLUU7zhdNsf6i/eXw/PcayeegkDKatIh43xM+j9?= =?utf-8?q?9BakSACA/rsdfZDgeVuup9smqkZUdMOQuIu2uJqo4ZEMlgjhy6tq1WHVHz0/ZGzNy?= =?utf-8?q?GCyyD+77caIpeDxe0NWHmalEVhSl4FpawEW+uE4+NRXbiStpdybbnTxtm9k8mM1uO?= =?utf-8?q?mR+svSM/pR0hyGwaFaAJkvxd/0BZbHgVBWF0c0/iSPIp931IdA5YxwfHEs/GcGIgs?= =?utf-8?q?Arno8ibWTLsWDAioqevFmS8HqwXUsU8ofgjmNIMGxXup4Z5IJviQH6KvTkbaWxqKD?= =?utf-8?q?gggyD5D5W9in/3O3ALMpr8hXpQFcHwf6IDZtsNnc3sKvFRITIv9Tj9ZEJFBsz2Mxh?= =?utf-8?q?biopTNsFCYXgLhfL5FXem2i0u7+E/SpyJC47j8iBuSvthXHNpasQzui1ixeJFyWfp?= =?utf-8?q?o/6+1UvrJmZQk9YcvRyXINO9Um52cBmqzhTRE9O+8oSDfteCsgCIBGHtNH4QZw82b?= =?utf-8?q?OWNz+IOPWlKY4YDiV0XHybXatHgakMOqdAJ6Ov8EtyQVvrIBHfWlw9zeQ0Y+sCvoW?= =?utf-8?q?hEcbnm7EUGNTclZr9npxg3fAMNSUNdXwJd9hP41fJ0GOl1p+GNoiCMc7lqSF8PU4t?= =?utf-8?q?EhDIsJyr+kmyCfLNEfAncxsMijNI8rqef/EduN1ZEUOnyq4Lfyxpqp/5WZNT/iJtz?= =?utf-8?q?8oD+6sCrwpAt2oD8s4bFuBU+9j95zUE7E0T2sZ6nPfNDNlzW2TxHCRgU0MPgf+Qfo?= =?utf-8?q?CNjlnOB6jN1T1P7RPq0/0voHAK8Uiq8ddNiGAd7GzGJtbQAcl2/sobcmGD0CNHCmK?= =?utf-8?q?7URqUML4rd/tACr6XyUjj4WrE7P4mvwckMK5u5o8SXPypi8NGC9rJ7CcR/w6aT/xE?= =?utf-8?q?JpfhGyi8I1rCT/96w1TVFto9fmZrxN+40db2y2jomsaCfGlhkkZEKkFyPYTKC0c01?= =?utf-8?q?V5YcitTv4KDx0QjO8Vf+xO+8DmARIEfuGg=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW4PR11MB6739.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?7hIqZqJST+U92Y9n4i44fjjtYwE9?= =?utf-8?q?a25t8IBR24xdbgoh4vBn5H8TG7lm7xPMizg3a09DgbvLEtMmZjcuhyjgGoTLJcG6+?= =?utf-8?q?DhWMegVcZ7wmg3Y0beH84IIx5ezkM5Fz5vXFYmeHZcoepUZI4zmvpZxKHaWb/YVRp?= =?utf-8?q?F2BIBacB5s0iuG1qmEbG3IaYYqEt20P9XZVQSKtVizbJ/hgkDx3pI8mJ/jPY7BXqE?= =?utf-8?q?jrqxLlUqtNLR6rTXevCz6nhwq+ioGRKdu0BMm6NHTfiMHn0WbYa6Vjhq71p9lo2nZ?= =?utf-8?q?vWYFQTbZ+9bWspA7C0w2sGu2B1yXdSRlsd60IvELPYPnVqyYw05smTy0pbsstLaAR?= =?utf-8?q?60XMQInVvPo13CPGngbdlg0vQbfg3Z2Zsqt5qtU84cndDYkAlfUi73NRiYeEK450R?= =?utf-8?q?PnkjOJ2pVxdKJr3wwB3+dTfozTShl3eqAgMfhcrFcGPXfZcK+zcJm4pB0BM0Bv3Xs?= =?utf-8?q?GDPTrVkdsJRkICCFI2MPe9IZFxWK/UPROhEGKlZc7e/moafHgHR3giTJJi1JzKBEt?= =?utf-8?q?IYNBF41H73X2FCoThpI/Iof2OLTaYlS8VcjRd+UyAaf+7rPqmZWJI5cPmOrsERdby?= =?utf-8?q?rQPdAdMjm1upUmOMrqFIlHNkpSvv49A9hqv4gQUBp28gn7ZXiOIGRAVd9b/iwXbJZ?= =?utf-8?q?bi+a2YzwErOd+nl2UTzUGvAoPKeTYflbJ2UGDTRtc05IrpsXwopo4guYq4LwTAc04?= =?utf-8?q?1vsvKITOngqn2K1TvYUrHmugDfnNVFlMLFoH16fX6MknnHky4aERl5sl/MjKhUkud?= =?utf-8?q?RalSViwjBL6iEag0k8tvc9/b4pzVHxwBzNwIJ/4BifTtPeOU4MWFVRf4fxr3daH09?= =?utf-8?q?DFk55QVJ157MBcSoHibw9U0ePaOyZJBwaiX7qnuASQzc8JDnwWHZiR+Zl45lT6QF7?= =?utf-8?q?fFmbbFAe+pGcPHeeWErCaoI8dOln8clpLj61NM+7Ec9z9RKjt/n67YgNxKqEX8ITv?= =?utf-8?q?3iCjDoQKYc1rYSODrHKMwrCqWOfyrZE6y2BDIG3M0QjIyC2HP6+ZsXzAI7vX1djV2?= =?utf-8?q?buZod5HhAnhdZwNMOOzynn7oBl7NGUF2/fLljqIiOpLo9+qOamDo49phcwUHWSiUN?= =?utf-8?q?7R5xiwQbu2DxGo5Oa2aVwZ9nseVx4+axdBd8HfoqtPhdDnLjomKu7GFoGl5jnazkC?= =?utf-8?q?r/R5xdBuE2THWOlIsjO/Eqx8av5807U0L9a1eQGWz8pEojvNudjbJCvIeQy0dZVwo?= =?utf-8?q?fjRH+E6lXNqmbGnJHU77PSILmsPtK4NtlRKPmye4CN8vek+Uo53OxI3C85hw9360v?= =?utf-8?q?kEcBkLC97Zpp9z7oXxmXnYK8i0Cu50ZnsrfDp3nzTvUGCZCZtnSivIf56OESrFO1S?= =?utf-8?q?detQDPt3QbB8UiGIhXwhSFxapCk1S4srKIWTUmog9/GgFikeq1+rJbx7Il7nqoZvN?= =?utf-8?q?/4Y6HAmScDjJmUzyVzBUTaCM29Yp+xHFaorw/udMQmmTuDRzpNbxebK86KpkuSM6w?= =?utf-8?q?NzBHk6YYFsRzfUY20Y6tkm5PiWfP7BKHlUbHI52nm1gYFFt771aRGG3yzjp9l7NTb?= =?utf-8?q?u4W4dwrcC0vd?= X-MS-Exchange-CrossTenant-Network-Message-Id: e84c113a-2d07-40ec-c33e-08dd7addd229 X-MS-Exchange-CrossTenant-AuthSource: MW4PR11MB6739.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Apr 2025 22:52:09.2099 (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: 9SwpEwJbiZKm8gFKf9HBl0LfA8NclD6Fy4yMdD2qe3q9xKLlG5XoOFZLiWfH5SW3ehEDhp2R8jquq+CHGahIhA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR11MB7003 X-OriginatorOrg: intel.com Dynamic capacity device extents may be left in an accepted state on a device due to an unexpected host crash. In this case it is expected that the creation of a new region on top of a DC partition can read those extents and surface them for continued use. Once all endpoint decoders are part of a region and the region is being realized, a read of the 'devices extent list' can reveal these previously accepted extents. CXL r3.1 specifies the mailbox call Get Dynamic Capacity Extent List for this purpose. The call returns all the extents for all dynamic capacity partitions. If the fabric manager is adding extents to any DCD partition, the extent list for the recovered region may change. In this case the query must retry. Upon retry the query could encounter extents which were accepted on a previous list query. Adding such extents is ignored without error because they are entirely within a previous accepted extent. Instead warn on this case to allow for differentiating bad devices from this normal condition. Latch any errors to be bubbled up to ensure notification to the user even if individual errors are rate limited or otherwise ignored. The scan for existing extents races with the dax_cxl driver. This is synchronized through the region device lock. Extents which are found after the driver has loaded will surface through the normal notification path while extents seen prior to the driver are read during driver load. Based on an original patch by Navneet Singh. Reviewed-by: Jonathan Cameron Reviewed-by: Fan Ni Signed-off-by: Ira Weiny --- Changes: [0day: fix extent count in GetExtent input payload] [iweiny: minor clean ups] [iweiny: Adjust for partition arch] --- drivers/cxl/core/core.h | 1 + drivers/cxl/core/mbox.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++ drivers/cxl/core/region.c | 25 +++++++++++ drivers/cxl/cxlmem.h | 21 +++++++++ 4 files changed, 156 insertions(+) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 027dd1504d77..e06a46fec217 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -22,6 +22,7 @@ cxled_to_mds(struct cxl_endpoint_decoder *cxled) return container_of(cxlds, struct cxl_memdev_state, cxlds); } +int cxl_process_extent_list(struct cxl_endpoint_decoder *cxled); int cxl_region_invalidate_memregion(struct cxl_region *cxlr); #ifdef CONFIG_CXL_REGION diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index de01c6684530..8af3a4173b99 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -1737,6 +1737,115 @@ int cxl_dev_dc_identify(struct cxl_mailbox *mbox, } EXPORT_SYMBOL_NS_GPL(cxl_dev_dc_identify, "CXL"); +/* Return -EAGAIN if the extent list changes while reading */ +static int __cxl_process_extent_list(struct cxl_endpoint_decoder *cxled) +{ + u32 current_index, total_read, total_expected, initial_gen_num; + struct cxl_memdev_state *mds = cxled_to_mds(cxled); + struct cxl_mailbox *cxl_mbox = &mds->cxlds.cxl_mbox; + struct device *dev = mds->cxlds.dev; + struct cxl_mbox_cmd mbox_cmd; + u32 max_extent_count; + int latched_rc = 0; + bool first = true; + + struct cxl_mbox_get_extent_out *extents __free(kvfree) = + kvmalloc(cxl_mbox->payload_size, GFP_KERNEL); + if (!extents) + return -ENOMEM; + + total_read = 0; + current_index = 0; + total_expected = 0; + max_extent_count = (cxl_mbox->payload_size - sizeof(*extents)) / + sizeof(struct cxl_extent); + do { + u32 nr_returned, current_total, current_gen_num; + struct cxl_mbox_get_extent_in get_extent; + int rc; + + get_extent = (struct cxl_mbox_get_extent_in) { + .extent_cnt = cpu_to_le32(max(max_extent_count, + total_expected - current_index)), + .start_extent_index = cpu_to_le32(current_index), + }; + + mbox_cmd = (struct cxl_mbox_cmd) { + .opcode = CXL_MBOX_OP_GET_DC_EXTENT_LIST, + .payload_in = &get_extent, + .size_in = sizeof(get_extent), + .size_out = cxl_mbox->payload_size, + .payload_out = extents, + .min_out = 1, + }; + + rc = cxl_internal_send_cmd(cxl_mbox, &mbox_cmd); + if (rc < 0) + return rc; + + /* Save initial data */ + if (first) { + total_expected = le32_to_cpu(extents->total_extent_count); + initial_gen_num = le32_to_cpu(extents->generation_num); + first = false; + } + + nr_returned = le32_to_cpu(extents->returned_extent_count); + total_read += nr_returned; + current_total = le32_to_cpu(extents->total_extent_count); + current_gen_num = le32_to_cpu(extents->generation_num); + + dev_dbg(dev, "Got extent list %d-%d of %d generation Num:%d\n", + current_index, total_read - 1, current_total, current_gen_num); + + if (current_gen_num != initial_gen_num || total_expected != current_total) { + dev_warn(dev, "Extent list change detected; gen %u != %u : cnt %u != %u\n", + current_gen_num, initial_gen_num, + total_expected, current_total); + return -EAGAIN; + } + + for (int i = 0; i < nr_returned ; i++) { + struct cxl_extent *extent = &extents->extent[i]; + + dev_dbg(dev, "Processing extent %d/%d\n", + current_index + i, total_expected); + + rc = validate_add_extent(mds, extent); + if (rc) + latched_rc = rc; + } + + current_index += nr_returned; + } while (total_expected > total_read); + + return latched_rc; +} + +#define CXL_READ_EXTENT_LIST_RETRY 10 + +/** + * cxl_process_extent_list() - Read existing extents + * @cxled: Endpoint decoder which is part of a region + * + * Issue the Get Dynamic Capacity Extent List command to the device + * and add existing extents if found. + * + * A retry of 10 is somewhat arbitrary, however, extent changes should be + * relatively rare while bringing up a region. So 10 should be plenty. + */ +int cxl_process_extent_list(struct cxl_endpoint_decoder *cxled) +{ + int retry = CXL_READ_EXTENT_LIST_RETRY; + int rc; + + do { + rc = __cxl_process_extent_list(cxled); + } while (rc == -EAGAIN && retry--); + + return rc; +} + static void add_part(struct cxl_dpa_info *info, u64 start, u64 size, enum cxl_partition_mode mode) { int i = info->nr_partitions; diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index eeabc5a6b18a..a43b43972bae 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -3196,6 +3196,26 @@ static int devm_cxl_add_pmem_region(struct cxl_region *cxlr) return rc; } +static int cxlr_add_existing_extents(struct cxl_region *cxlr) +{ + struct cxl_region_params *p = &cxlr->params; + int i, latched_rc = 0; + + for (i = 0; i < p->nr_targets; i++) { + struct device *dev = &p->targets[i]->cxld.dev; + int rc; + + rc = cxl_process_extent_list(p->targets[i]); + if (rc) { + dev_err(dev, "Existing extent processing failed %d\n", + rc); + latched_rc = rc; + } + } + + return latched_rc; +} + static void cxlr_dax_unregister(void *_cxlr_dax) { struct cxl_dax_region *cxlr_dax = _cxlr_dax; @@ -3231,6 +3251,11 @@ static int devm_cxl_add_dax_region(struct cxl_region *cxlr) dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), dev_name(dev)); + if (cxlr->mode == CXL_PARTMODE_DYNAMIC_RAM_A) + if (cxlr_add_existing_extents(cxlr)) + dev_err(&cxlr->dev, "Existing extent processing failed %d\n", + rc); + return devm_add_action_or_reset(&cxlr->dev, cxlr_dax_unregister, cxlr_dax); err: diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h index 63a38e449454..f80f70549c0b 100644 --- a/drivers/cxl/cxlmem.h +++ b/drivers/cxl/cxlmem.h @@ -600,6 +600,27 @@ struct cxl_mbox_dc_response { } __packed extent_list[]; } __packed; +/* + * Get Dynamic Capacity Extent List; Input Payload + * CXL rev 3.1 section 8.2.9.9.9.2; Table 8-166 + */ +struct cxl_mbox_get_extent_in { + __le32 extent_cnt; + __le32 start_extent_index; +} __packed; + +/* + * Get Dynamic Capacity Extent List; Output Payload + * CXL rev 3.1 section 8.2.9.9.9.2; Table 8-167 + */ +struct cxl_mbox_get_extent_out { + __le32 returned_extent_count; + __le32 total_extent_count; + __le32 generation_num; + u8 rsvd[4]; + struct cxl_extent extent[]; +} __packed; + struct cxl_mbox_get_supported_logs { __le16 entries; u8 rsvd[6];