From patchwork Sun Apr 13 22:52:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 14049478 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.18]) (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 ABB79213240 for ; Sun, 13 Apr 2025 22:52:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.18 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584761; cv=fail; b=OQg3YaFIJDczZuAcg/B2FgnzQa6LzSidd0zBNHxBn2VzdAQJJDoF07xAn+XoEsmNG1VzUevimwlojHhQd+hGMN3tG/11pZEtA4//st8mB4WvhNTZFp1xC+g7exv7by76rNHzaR6WLVylmjvnk54pCzNq3UTRHSH8+x1LTGwhTuA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584761; c=relaxed/simple; bh=4NU5QcBmTRIniatpivsMmlMW2JwnAaCVv53nVVFrE/0=; h=From:Date:Subject:Content-Type:Message-ID:References:In-Reply-To: To:CC:MIME-Version; b=Oe/AY7fvUl+7D1lkPL3nfAyk5I3Lc4s2CSAodg1/BOia3liOEBAYbpBymXuqJwQEZ+RjaswB5MtIkzRjnHa3ODAViCAOixScrQzHWNZn3QxhXephB7C8GuSwI7p0hE2jGNrv07oD8wqbEoxZtRQAM5a45nay0yobZUKa5V6l1PU= 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=IiZhwLqb; arc=fail smtp.client-ip=192.198.163.18 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="IiZhwLqb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1744584760; x=1776120760; h=from:date:subject:content-transfer-encoding:message-id: references:in-reply-to:to:cc:mime-version; bh=4NU5QcBmTRIniatpivsMmlMW2JwnAaCVv53nVVFrE/0=; b=IiZhwLqbUVnVR16J6v+/7YfD7OtEAjk1PpKBFn01Uv1m7Qv6e+ChJD9i favFw3KPHU0jcxmSmW+wqDtawU3OVwky6cTVcLo+78c0QbSpsjteR4ARU 3wD7nwm0UEOxXXLjKxXeUK9uakOik0ZMtPD4VwMcVqVUGshSIkYTX4GvU g3Oc4duX7IctV1tbu8A+aySrpBN/medPJraLJlhYFL1nku5gikIISWnwT 1WKkDhKwJ9afM4tf0WM+uTvlGmuZ+k7Ypd3yQCHPu9dga+LM+TuY3uWcc NGOVdKo9kDuISehvih/Oe5GlFZjkPdIl8vj0I/7skWBqaszjg4idnD63K g==; X-CSE-ConnectionGUID: 9KIcnzS1Rb+IgP5Zs3IWxw== X-CSE-MsgGUID: Aj2C73j6TN+XmaoIp2Ju5A== X-IronPort-AV: E=McAfee;i="6700,10204,11402"; a="45280982" X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="45280982" Received: from fmviesa007.fm.intel.com ([10.60.135.147]) by fmvoesa112.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Apr 2025 15:52:40 -0700 X-CSE-ConnectionGUID: 32XDdKAFQvuM1lnJQayexQ== X-CSE-MsgGUID: c0mUkfPnSQmwX7QgxODi4Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="129657641" Received: from orsmsx902.amr.corp.intel.com ([10.22.229.24]) by fmviesa007.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Apr 2025 15:52:39 -0700 Received: from ORSMSX901.amr.corp.intel.com (10.22.229.23) 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.14; Sun, 13 Apr 2025 15:52:38 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) 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:38 -0700 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (104.47.57.44) by edgegateway.intel.com (134.134.137.100) 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:38 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SYRlR3kt9aXRQuoT/vDOoJ6sse6D3chaSag/q7nmINhj8lBHsBT4skC7a6rNotm6d+WbM7HNdKxqgCdNtPZnhm3qotFP7jGMksTQv/6xIZCXpcJNBijNpKnxX15ERczjfWQirL2NAvNkD8drG0oQt33n+6vrnuHntAKHHYg318lhJxm/tzDm+xHplbhnCOgTR+wBl7E4rg5W41pViArYSK8DV+xfzdIxj26BMtu1tP1o9uj9HWDjYW9VP+lQsFuzRblwhQgXgiv6EyN9vh3Ce2IfhSf+E1xPbzK9VGotgDPxId63p26FCNNIEd5dnBcA95thMZKgez5Ghsi7gpVhAw== 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=Mejpt3VvtggB127/vNXJ8EHLdh//zxOIBl0maqDyL+Q=; b=r3dWON2GFrFFd5bvQgGXrGU7Q0oipb2W7FviaX1gSuWyE/HsfwKpXkAEzmkI4+CnPbFzGY47QEp2IhGok53Po4EoF2qwOCSEndQf0tN7gDNiMieGMCtu1uCDyfEaVtFZRQYdrbgsZ4pUBoouYo0zGRKgSq0OOX6xLOljxq1wWYS+CIMjrSQzYUiVVv4nYACCU4va0vE8kGMTsKPhGofDozpDC9WZK+Qn0bwhsA3b88kwFDd8egdZEsxA834RkDUnQg9FVci2muRpJMYQnTaOaBCsrrv8GxtCOlIkBNsn7fRsRH4lvFabl5cWNT/SbW0pcXnp8ebPGjABE1tPIJv10A== 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:35 +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:35 +0000 From: Ira Weiny Date: Sun, 13 Apr 2025 17:52:58 -0500 Subject: [ndctl PATCH v5 1/5] libcxl: Add Dynamic RAM A partition mode support Message-ID: <20250413-dcd-region2-v5-1-fbd753a2e0e8@intel.com> References: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> In-Reply-To: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> To: Alison Schofield CC: Vishal Verma , Jonathan Cameron , Fan Ni , Sushant1 Kumar , Dan Williams , "Dave Jiang" , , , Ira Weiny X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1744584788; l=11469; i=ira.weiny@intel.com; s=20221211; h=from:subject:message-id; bh=4NU5QcBmTRIniatpivsMmlMW2JwnAaCVv53nVVFrE/0=; b=/HT0WjM/CSzx4Yx6awBokqg7cBehBof5dEOSybODPs7uyzM36+zecJ1CshE0ufxect/vzMOrO vIwPJ45DW7YD75WjtxM52AlFjsCnqVAA6yyD1U0naXTflk/PDpmk10R X-Developer-Key: i=ira.weiny@intel.com; a=ed25519; pk=noldbkG+Wp1qXRrrkfY1QJpDf7QsOEthbOT7vm0PqsE= X-ClientProxiedBy: MW2PR2101CA0016.namprd21.prod.outlook.com (2603:10b6:302:1::29) 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: 2d5f9696-c32c-435f-7566-08dd7adde209 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?utf-8?q?vKRtEtSp5sAtaItsa3iwUnMfjLoGDXj?= =?utf-8?q?YdrlWK3cr+YqVRCnL7CzdToePGeYxmh8L9+K7mFOuNQ1GLpAGdLu38h6KRxFzxlc9?= =?utf-8?q?tf6G3NOWQi8dm02sEqfM2xQviTBNmZNxOPsVRZX9RVXIjWl+eBWsNUmuXtVTWQpG5?= =?utf-8?q?dNEsM3NsXWJS7XLs1vr4MKsqsGndgEOrhzQ21DSRXTPV0S+BdO2Eri4PumL1TKQoo?= =?utf-8?q?sM2smM5nqYNNlc2DWkkibt8pwe2+AN8dwfluBzaK7gj+xWoXvFjdWLqxcB75VEz+0?= =?utf-8?q?2LBBsN0FKBKz0nABeQPMX7pbg5eybtt2BSby/3IEqrrKo3R0mE3QmPNlUKCSxpS6N?= =?utf-8?q?UDOt4iM4XAsCDGqCNMhOnDgvHVq4GzgI/IIYernNBXJ/bUFTYXyS3ANN5TWGmny5e?= =?utf-8?q?UwHCr1tS30eSCMrv9boIWTJudn+MbNeJm24J9IiZnDGfPHrSYWVnomXAnJX7SUA19?= =?utf-8?q?pyTeBfSakfaunj7Jhi9kLGbFS9Vda3BswkACIXb5AXUPMIrf8IfSQp/foAAKTLbbV?= =?utf-8?q?LjUn1CAvufmLJiIciqvPXbuXLFl86oCMxSGJKeAmpHZYeU6cJlAVDdWtdKUEzb+/A?= =?utf-8?q?cZ4Zv3aSV8PLp78uRGGHxtX7NCagVk6Ce4KmcNPgeQqOybYlJg+psvYAjKVXruhEr?= =?utf-8?q?zZt3WedcNQDE1+oEQWIdEV0cBFXEM8J9el9LaiA5aRy2KD29PELTq/X6KXmwa8IGa?= =?utf-8?q?50MYbl3cHnV/3hfXzO2y2oGfq9p2TZ2lCYCy4NQqXTORKFm1ZwDRkSOuLCg6ThA3W?= =?utf-8?q?rkRLSyNm8D/cAhIlJkgeND4J9R1a4+I/jDWpHLtRFxlG9wpK/CiTVBbvZTLKosb5+?= =?utf-8?q?sREXCbyNsFRWuXqzolOzgraFbxSqhUZcxeQEC5P3JTL7p6vu48ScXH6tO+gaW9RGu?= =?utf-8?q?3RhLwENrnPCtqoXtzuqPL1KyjQ7+fPLYBGjdd0Yg0dcgbGPjFlPe4MPvWPEHqHaUo?= =?utf-8?q?bWRBiEVxD6cEN+wKH/XWcCSZJHptDCTUmx4vKWip7Id5VxB0FskOwl0iEZZCwMbhl?= =?utf-8?q?DsInZW66DNTElcHTAO/a90ihsE/S0jslEQeGe4TudN2M7zGC62DFiCaf+RFd9ZyJH?= =?utf-8?q?fshqCSzP4be4rU+GTqnzd3dYRFTGbUiEg6FJQLegJhA95Ai4l6sfu/CfdN1ETayaj?= =?utf-8?q?YnWRVPqQSOVfk0FCDcZ/+OQK4e//19zkebrm/DR5twkRJTkGWyUFKzJXt+SwMHoUK?= =?utf-8?q?c7btRwbz3iKfLY2sN8V9+o4l0YWA/lENmn8fVIkZdvETDP5tyUleL0keeGtjmdYoV?= =?utf-8?q?S+2ILv03NeaKfll12Qsb+FblaX565UO2qkn3eMm9qRHJMMh6bwsyE3z94xXXEnFYM?= =?utf-8?q?OpMCOsV7O2GHywrKViLjRBE7f4mh/0uCYLjN3BLSdN3xPl9ho6LjvRw=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);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?9D36v6gzRciNPOhEm488wA15UcXg?= =?utf-8?q?PTgj90qBUy5fnDLNg3wWQWpefAlobUjj4FPbKv5L+/uPaQ3e+T6UPhon6zD8m8iNz?= =?utf-8?q?akM0VErZQ4FPgaU1Q+XsSD9koUjzfQ8hhwaiHUOj9cneJGf5qMxP94rOE4JNsAznk?= =?utf-8?q?PO7fk+wqktw64TZASLa75WOb5xZZ+58d5721OwkZj8ZeWHw9iE49w8oprTeQoHvig?= =?utf-8?q?ErUNSReqjoGGGgS6seQxwAGpSilTEApWBl7Z8uf0hCnalp8POJkNvJntdypReN7XZ?= =?utf-8?q?rW+rJyBAjuQR66jS4aRlZUVXfm6KJHwgHu91X4TWWctwXkWsK4a7xYXeDCuaNSaIp?= =?utf-8?q?4B152XKsFVheSrNn2lJBl5X9feB1m0WAelxn6Pe7mzD1KnQ0+FPbGIbLda7/E3vmL?= =?utf-8?q?Ucv1xXAkWnGuj04yWnw1mTpHLvBS1dj9ZWjq2nZZLhB77zzZYFV40ohl5DK7jGJ5h?= =?utf-8?q?zId9Y+B+p0BldzZfxEu2CwrSgv/HF0uh5oXrRYITh/IzqJxwU/3UylY89rAxMtYfM?= =?utf-8?q?k3GKWxam3JyvfNHw+HpUNmeuXKboKB8RQ9B5Ry5KyiVHJg1cVzvpqg76wQYCvkI0Z?= =?utf-8?q?Axac/v7YSDIcxZ9t8TJ7FU01mmoHRYrW1wXjfSCinEJJvtHhHCDzi521ZJQUXW+Mm?= =?utf-8?q?1R2rECuFc5yAzfLkd3NRHmYVCTuOb7ASTS2bhbPwdO8EDtBEwJ6HWqvMVSTcXr+Zk?= =?utf-8?q?LEoX4snxyX5DVOhOouj/1kPFl3KTJaGF/kQNx25rEIDl9grT8/HMzFr0Ue0y0zt37?= =?utf-8?q?QfEOTH6wwirjC3iI0YjCMTF+LjTrABl7i2BHpsmYdaijWLgFDUGxTAbZ2zBaSRxpU?= =?utf-8?q?8Dbk1W7Iy2Z2KXNCtqXYEdSwjgl6yPTqm72ryMRC1GhvHdbYpaK5pMbjIKTUv7BsA?= =?utf-8?q?oJkS51pl6JkjjfRopORJisC79uqvfUEXiEjGzbW/X433Rr7Xg3TQYw/DktjX9J+U6?= =?utf-8?q?hRpXSCk14XrQcsQ+qKkuC3S5mcTpvrnNrodyVwDSYOIp9FispDRKYhEolP8S8c0E1?= =?utf-8?q?7KabqOxbznlsDkfbac4L0bE4BluI+D/ptlKw5A2x638A2WEGYZQxlaTS6V7fMLoGF?= =?utf-8?q?VzrV+6hVj9KgX/GmgMqqLRF/JVmp71XhMAJY3RzskTecBh+sB6DzXkT4ZzyuLgPHs?= =?utf-8?q?AS2gkFBdZZt4E966QZumi3WTnTI/gY/X6N0RFfkxKuuIdpGcu2+TVO9CoNeaEQnbw?= =?utf-8?q?6QbqdOpXR1IfWrgHtSHZ3Sly9lRPAaSByqoOeHfA2130/rJLeb5F5tX1eLCwFLOjj?= =?utf-8?q?xfyolHfE6KTV//nwxYkDT/9wHjbhnn+TZTIa9FuSDDVAhTLzmQHYwlS2lSk24UfTK?= =?utf-8?q?nZYnS9YBK4q4EP9AFs6cxggqYCQ0SpSWWtRK9JHHHCDwXejOHt3B/fERonNCW/tB0?= =?utf-8?q?dssUhYpNuaQBSJfPWY/wyzCEt7hNh10GHahK9m2FoAYhmvpWPw60BmZA/xxdg6URw?= =?utf-8?q?BO8ekGhX8ZB2dn0u16co74ekdNpdcQiAXAMEIVDAG3EqMCpOCvk1wO2NeVWuyUZv8?= =?utf-8?q?YKA1nMvL0dVq?= X-MS-Exchange-CrossTenant-Network-Message-Id: 2d5f9696-c32c-435f-7566-08dd7adde209 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:35.6819 (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: G0pj7VSANnkmd4Q8r0A+KoxOhLHFUusRW0o4CjErJqZEPUNyxtnkrh5RaHYcVta9ZTW6if4Cql72/9Mj9RAI1g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR11MB7003 X-OriginatorOrg: intel.com Dynamic capacity partitions are exposed as a singular dynamic ram partition. Add CXL library support to read this partition information. Signed-off-by: Ira Weiny --- Documentation/cxl/lib/libcxl.txt | 6 ++++-- cxl/lib/libcxl.c | 43 ++++++++++++++++++++++++++++++++++++++++ cxl/lib/libcxl.sym | 4 ++++ cxl/lib/private.h | 3 +++ cxl/libcxl.h | 10 +++++++++- 5 files changed, 63 insertions(+), 3 deletions(-) diff --git a/Documentation/cxl/lib/libcxl.txt b/Documentation/cxl/lib/libcxl.txt index 40598a08b9f4..7e2136519229 100644 --- a/Documentation/cxl/lib/libcxl.txt +++ b/Documentation/cxl/lib/libcxl.txt @@ -68,6 +68,7 @@ int cxl_memdev_get_major(struct cxl_memdev *memdev); int cxl_memdev_get_minor(struct cxl_memdev *memdev); unsigned long long cxl_memdev_get_pmem_size(struct cxl_memdev *memdev); unsigned long long cxl_memdev_get_ram_size(struct cxl_memdev *memdev); +unsigned long long cxl_memdev_get_dynamic_ram_a_size(struct cxl_memdev *memdev); const char *cxl_memdev_get_firmware_version(struct cxl_memdev *memdev); size_t cxl_memdev_get_label_size(struct cxl_memdev *memdev); int cxl_memdev_nvdimm_bridge_active(struct cxl_memdev *memdev); @@ -87,8 +88,8 @@ The character device node for command submission can be found by default at /dev/cxl/mem%d, or created with a major / minor returned from cxl_memdev_get_{major,minor}(). -The 'pmem_size' and 'ram_size' attributes return the current -provisioning of DPA (Device Physical Address / local capacity) in the +The 'pmem_size', 'ram_size', and 'dynamic_ram_a_size' attributes return the +current provisioning of DPA (Device Physical Address / local capacity) in the device. cxl_memdev_get_numa_node() returns the affinitized CPU node number if @@ -422,6 +423,7 @@ enum cxl_decoder_mode { CXL_DECODER_MODE_MIXED, CXL_DECODER_MODE_PMEM, CXL_DECODER_MODE_RAM, + CXL_DECODER_MODE_DYNAMIC_RAM_A, }; enum cxl_decoder_mode cxl_decoder_get_mode(struct cxl_decoder *decoder); int cxl_decoder_set_mode(struct cxl_decoder *decoder, enum cxl_decoder_mode mode); diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c index 566870acb30a..81810a4ae862 100644 --- a/cxl/lib/libcxl.c +++ b/cxl/lib/libcxl.c @@ -437,6 +437,9 @@ CXL_EXPORT bool cxl_region_qos_class_mismatch(struct cxl_region *region) } else if (region->mode == CXL_DECODER_MODE_PMEM) { if (root_decoder->qos_class != memdev->pmem_qos_class) return true; + } else if (region->mode == CXL_DECODER_MODE_DYNAMIC_RAM_A) { + if (root_decoder->qos_class != memdev->dynamic_ram_a_qos_class) + return true; } } @@ -1351,6 +1354,10 @@ static void *add_cxl_memdev(void *parent, int id, const char *cxlmem_base) if (sysfs_read_attr(ctx, path, buf) == 0) memdev->ram_size = strtoull(buf, NULL, 0); + sprintf(path, "%s/dynamic_ram_a/size", cxlmem_base); + if (sysfs_read_attr(ctx, path, buf) == 0) + memdev->dynamic_ram_a_size = strtoull(buf, NULL, 0); + sprintf(path, "%s/pmem/qos_class", cxlmem_base); if (sysfs_read_attr(ctx, path, buf) < 0) memdev->pmem_qos_class = CXL_QOS_CLASS_NONE; @@ -1363,6 +1370,12 @@ static void *add_cxl_memdev(void *parent, int id, const char *cxlmem_base) else memdev->ram_qos_class = atoi(buf); + sprintf(path, "%s/dynamic_ram_a/qos_class", cxlmem_base); + if (sysfs_read_attr(ctx, path, buf) < 0) + memdev->dynamic_ram_a_qos_class = CXL_QOS_CLASS_NONE; + else + memdev->dynamic_ram_a_qos_class = atoi(buf); + sprintf(path, "%s/payload_max", cxlmem_base); if (sysfs_read_attr(ctx, path, buf) == 0) { memdev->payload_max = strtoull(buf, NULL, 0); @@ -1599,6 +1612,11 @@ CXL_EXPORT unsigned long long cxl_memdev_get_ram_size(struct cxl_memdev *memdev) return memdev->ram_size; } +CXL_EXPORT unsigned long long cxl_memdev_get_dynamic_ram_a_size(struct cxl_memdev *memdev) +{ + return memdev->dynamic_ram_a_size; +} + CXL_EXPORT int cxl_memdev_get_pmem_qos_class(struct cxl_memdev *memdev) { return memdev->pmem_qos_class; @@ -1609,6 +1627,11 @@ CXL_EXPORT int cxl_memdev_get_ram_qos_class(struct cxl_memdev *memdev) return memdev->ram_qos_class; } +CXL_EXPORT int cxl_memdev_get_dynamic_ram_a_qos_class(struct cxl_memdev *memdev) +{ + return memdev->dynamic_ram_a_qos_class; +} + CXL_EXPORT const char *cxl_memdev_get_firmware_verison(struct cxl_memdev *memdev) { return memdev->firmware_version; @@ -2348,6 +2371,8 @@ static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base) decoder->mode = CXL_DECODER_MODE_MIXED; else if (strcmp(buf, "none") == 0) decoder->mode = CXL_DECODER_MODE_NONE; + else if (strcmp(buf, "dynamic_ram_a") == 0) + decoder->mode = CXL_DECODER_MODE_DYNAMIC_RAM_A; else decoder->mode = CXL_DECODER_MODE_MIXED; } else @@ -2387,6 +2412,7 @@ static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base) case CXL_PORT_SWITCH: decoder->pmem_capable = true; decoder->volatile_capable = true; + decoder->dynamic_ram_a_capable = true; decoder->mem_capable = true; decoder->accelmem_capable = true; sprintf(path, "%s/locked", cxldecoder_base); @@ -2411,6 +2437,7 @@ static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base) { "cap_type3", &decoder->mem_capable }, { "cap_ram", &decoder->volatile_capable }, { "cap_pmem", &decoder->pmem_capable }, + { "cap_dynamic_ram_a", &decoder->dynamic_ram_a_capable }, { "locked", &decoder->locked }, }; @@ -2661,6 +2688,9 @@ CXL_EXPORT int cxl_decoder_set_mode(struct cxl_decoder *decoder, case CXL_DECODER_MODE_RAM: sprintf(buf, "ram"); break; + case CXL_DECODER_MODE_DYNAMIC_RAM_A: + sprintf(buf, "dynamic_ram_a"); + break; default: err(ctx, "%s: unsupported mode: %d\n", cxl_decoder_get_devname(decoder), mode); @@ -2712,6 +2742,11 @@ CXL_EXPORT bool cxl_decoder_is_volatile_capable(struct cxl_decoder *decoder) return decoder->volatile_capable; } +CXL_EXPORT bool cxl_decoder_is_dynamic_ram_a_capable(struct cxl_decoder *decoder) +{ + return decoder->dynamic_ram_a_capable; +} + CXL_EXPORT bool cxl_decoder_is_mem_capable(struct cxl_decoder *decoder) { return decoder->mem_capable; @@ -2786,6 +2821,8 @@ static struct cxl_region *cxl_decoder_create_region(struct cxl_decoder *decoder, sprintf(path, "%s/create_pmem_region", decoder->dev_path); else if (mode == CXL_DECODER_MODE_RAM) sprintf(path, "%s/create_ram_region", decoder->dev_path); + else if (mode == CXL_DECODER_MODE_DYNAMIC_RAM_A) + sprintf(path, "%s/create_dynamic_ram_a_region", decoder->dev_path); rc = sysfs_read_attr(ctx, path, buf); if (rc < 0) { @@ -2837,6 +2874,12 @@ cxl_decoder_create_ram_region(struct cxl_decoder *decoder) return cxl_decoder_create_region(decoder, CXL_DECODER_MODE_RAM); } +CXL_EXPORT struct cxl_region * +cxl_decoder_create_dynamic_ram_a_region(struct cxl_decoder *decoder) +{ + return cxl_decoder_create_region(decoder, CXL_DECODER_MODE_DYNAMIC_RAM_A); +} + CXL_EXPORT int cxl_decoder_get_nr_targets(struct cxl_decoder *decoder) { return decoder->nr_targets; diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym index ba82bc3da589..06f7d40344ab 100644 --- a/cxl/lib/libcxl.sym +++ b/cxl/lib/libcxl.sym @@ -293,4 +293,8 @@ global: cxl_bus_get_by_provider; cxl_memdev_get_fwctl_major; cxl_memdev_get_fwctl_minor; + cxl_memdev_get_dynamic_ram_a_size; + cxl_memdev_get_dynamic_ram_a_qos_class; + cxl_decoder_is_dynamic_ram_a_capable; + cxl_decoder_create_dynamic_ram_a_region; } LIBECXL_8; diff --git a/cxl/lib/private.h b/cxl/lib/private.h index 676bf1573487..57c9fa0b8f52 100644 --- a/cxl/lib/private.h +++ b/cxl/lib/private.h @@ -48,8 +48,10 @@ struct cxl_memdev { struct list_node list; unsigned long long pmem_size; unsigned long long ram_size; + unsigned long long dynamic_ram_a_size; int ram_qos_class; int pmem_qos_class; + int dynamic_ram_a_qos_class; int payload_max; size_t lsa_size; struct kmod_module *module; @@ -140,6 +142,7 @@ struct cxl_decoder { unsigned int interleave_granularity; bool pmem_capable; bool volatile_capable; + bool dynamic_ram_a_capable; bool mem_capable; bool accelmem_capable; bool locked; diff --git a/cxl/libcxl.h b/cxl/libcxl.h index 010ac0b78039..de66f2462311 100644 --- a/cxl/libcxl.h +++ b/cxl/libcxl.h @@ -74,8 +74,10 @@ int cxl_memdev_get_fwctl_minor(struct cxl_memdev *memdev); struct cxl_ctx *cxl_memdev_get_ctx(struct cxl_memdev *memdev); unsigned long long cxl_memdev_get_pmem_size(struct cxl_memdev *memdev); unsigned long long cxl_memdev_get_ram_size(struct cxl_memdev *memdev); +unsigned long long cxl_memdev_get_dynamic_ram_a_size(struct cxl_memdev *memdev); int cxl_memdev_get_pmem_qos_class(struct cxl_memdev *memdev); int cxl_memdev_get_ram_qos_class(struct cxl_memdev *memdev); +int cxl_memdev_get_dynamic_ram_a_qos_class(struct cxl_memdev *memdev); const char *cxl_memdev_get_firmware_verison(struct cxl_memdev *memdev); bool cxl_memdev_fw_update_in_progress(struct cxl_memdev *memdev); size_t cxl_memdev_fw_update_get_remaining(struct cxl_memdev *memdev); @@ -200,6 +202,7 @@ enum cxl_decoder_mode { CXL_DECODER_MODE_MIXED, CXL_DECODER_MODE_PMEM, CXL_DECODER_MODE_RAM, + CXL_DECODER_MODE_DYNAMIC_RAM_A, }; static inline const char *cxl_decoder_mode_name(enum cxl_decoder_mode mode) @@ -209,9 +212,10 @@ static inline const char *cxl_decoder_mode_name(enum cxl_decoder_mode mode) [CXL_DECODER_MODE_MIXED] = "mixed", [CXL_DECODER_MODE_PMEM] = "pmem", [CXL_DECODER_MODE_RAM] = "ram", + [CXL_DECODER_MODE_DYNAMIC_RAM_A] = "dynamic_ram_a", }; - if (mode < CXL_DECODER_MODE_NONE || mode > CXL_DECODER_MODE_RAM) + if (mode < CXL_DECODER_MODE_NONE || mode > CXL_DECODER_MODE_DYNAMIC_RAM_A) mode = CXL_DECODER_MODE_NONE; return names[mode]; } @@ -225,6 +229,8 @@ cxl_decoder_mode_from_ident(const char *ident) return CXL_DECODER_MODE_RAM; else if (strcmp(ident, "pmem") == 0) return CXL_DECODER_MODE_PMEM; + else if (strcmp(ident, "dynamic_ram_a") == 0) + return CXL_DECODER_MODE_DYNAMIC_RAM_A; return CXL_DECODER_MODE_NONE; } @@ -254,6 +260,7 @@ cxl_decoder_get_target_type(struct cxl_decoder *decoder); bool cxl_decoder_is_pmem_capable(struct cxl_decoder *decoder); bool cxl_decoder_is_volatile_capable(struct cxl_decoder *decoder); bool cxl_decoder_is_mem_capable(struct cxl_decoder *decoder); +bool cxl_decoder_is_dynamic_ram_a_capable(struct cxl_decoder *decoder); bool cxl_decoder_is_accelmem_capable(struct cxl_decoder *decoder); bool cxl_decoder_is_locked(struct cxl_decoder *decoder); unsigned int @@ -262,6 +269,7 @@ unsigned int cxl_decoder_get_interleave_ways(struct cxl_decoder *decoder); struct cxl_region *cxl_decoder_get_region(struct cxl_decoder *decoder); struct cxl_region *cxl_decoder_create_pmem_region(struct cxl_decoder *decoder); struct cxl_region *cxl_decoder_create_ram_region(struct cxl_decoder *decoder); +struct cxl_region *cxl_decoder_create_dynamic_ram_a_region(struct cxl_decoder *decoder); struct cxl_decoder *cxl_decoder_get_by_name(struct cxl_ctx *ctx, const char *ident); struct cxl_memdev *cxl_decoder_get_memdev(struct cxl_decoder *decoder); From patchwork Sun Apr 13 22:52:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 14049479 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 6328921480B for ; Sun, 13 Apr 2025 22:52:41 +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=1744584763; cv=fail; b=hIiTyi2tiot1JkHg6gGOWMOzpyUADx818W+MoNIA59FlSMcPod2ZxiDAR0q5dbC2Rt6r/taKCkSTUaxqSgsyIz7jPKF9zNg+ChxGsZnQalDQjANju8olpz6ec07h9szQZjTR0GGqLAC1M23qxIJn2uEbGt1dR32Sd1ZmFVglUdw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584763; c=relaxed/simple; bh=IXXz9ma+sLFTS3/AZjlqAxGNvG3+Lzvfiga4mSetDHA=; h=From:Date:Subject:Content-Type:Message-ID:References:In-Reply-To: To:CC:MIME-Version; b=MkfBTRxh0esnOFnCJwvu52blDE8B/y60j2ulKeWdIxSnwmWKwHRY2+Xs3w7WAUzzYYqu9uONgq67adRYgdW/3/zzGT/wRHFLYu00BEd2SYD46f9u6WMyOOUkpKfyyXjfjG1LUyhTiGy3MzdJr0RVRdj4NUXEkZvu9PlUsNu7OD0= 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=jKLDeBzQ; 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="jKLDeBzQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1744584761; x=1776120761; h=from:date:subject:content-transfer-encoding:message-id: references:in-reply-to:to:cc:mime-version; bh=IXXz9ma+sLFTS3/AZjlqAxGNvG3+Lzvfiga4mSetDHA=; b=jKLDeBzQGkTI0CaJOjmqA62Tu/PyBWWc3womVD00IaePqSvGElVyZ9sT z81xqR3JcLY0m42OScteDT/eaXdYoNIpozB+Glj9TCRQ5hD7tgc0ii9wB xDrsvA6TTBfKg8BD1ox6eS8tPoXAz4aqvb4lo536dLD++mFjLXGcVzLXk Z4gwCCHDwQJG4UBJ6G2GKRsVNQE4pU7XLZwMacCq7WnkwW/EDSlR4fUWB 6KKVAGaaVBb+sIZ4UU8PTK+IafL08PMpajfOCvt4P3UmUeFWS8j0RZpYF mfxZjA2LWK8qYp8ho6zsh3EUSBkRWa1tLH82ydEUocHZXrRYRvZVojKNA A==; X-CSE-ConnectionGUID: FaiC1Pf2QJSACkJ/gEHAdA== X-CSE-MsgGUID: 1gCMIjLVT6Ojr36ThUKWMA== X-IronPort-AV: E=McAfee;i="6700,10204,11402"; a="71431156" X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="71431156" 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:40 -0700 X-CSE-ConnectionGUID: 6K8XBdPBTJGRyzlEGkvZdw== X-CSE-MsgGUID: VVrMQQrFTtCTYCrUv63sNg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="134405598" 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:41 -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:40 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) 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:40 -0700 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (104.47.57.44) by edgegateway.intel.com (134.134.137.100) 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:39 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vZHfLNlsBrDQPI99YYkPR6EF/BW6R/qn8jV9Y0WDw8rHVxoiyb3mRc57WJmvnEcMeiZ3ltIP8IhWmdzwC/mOMBm0AYBBo/yo3qbfR/vBO6qLG4wiIlscfN3MbvNsM2WVgonGGhZQo0mUe41iUHTSYPOOBnsOgM/OBifeLiZHs00R/vHL8FxBjlVd5/MM6exWWubjU5VdcvzV4p0995VIlylz8QIV0rwswHFs6ujFHnMDxRoFPZI/BOIqNwCPxp46LEF8tj+/hQgLcAPJw9WaXgSMs2EZMiNfr0wOanReFYclgCjO6s54K/9lvgmrWg4k8dV7+n0I0cdrbGYUC6F+4g== 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=oZl4Vlki6bfQx7xxAH7vGT4mRBwehSOgPocHtpdgXgU=; b=uRYjfek9H6jRh+sSiyPf3TgiTiwYWU3oWutDpR+ivUSC4VyV18l31mB8qnNTCGwDQpQGM5BMKidLWJEpzNM8Op7Fd0F5Bu8dBNs5rAhgVths3swEPoLklycPn/Rp98lw0XBL7dRdN8+VkmzaBp7HdBgFxrc/SwfNVib1ETBpWgmPt7j6PdAB1GdYxFy6dUYnz1gG6qGJeBUh9Lt0U/vyf1VY3tmDOM4lVqtIbneJYgoF2qwHONT5V4sTTJ6R4g8WlYqu+0AgTN6cHetT5j2jV2caDBzAKsEMmwvE7BLdTbyFVdwkudZ7ytKTjjhQSTeECykyjNeBR67zxuUerROzUg== 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:37 +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:37 +0000 From: Ira Weiny Date: Sun, 13 Apr 2025 17:52:59 -0500 Subject: [ndctl PATCH v5 2/5] cxl/region: Add cxl-cli support for dynamic RAM A Message-ID: <20250413-dcd-region2-v5-2-fbd753a2e0e8@intel.com> References: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> In-Reply-To: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> To: Alison Schofield CC: Vishal Verma , Jonathan Cameron , Fan Ni , Sushant1 Kumar , Dan Williams , "Dave Jiang" , , , Ira Weiny X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1744584788; l=4916; i=ira.weiny@intel.com; s=20221211; h=from:subject:message-id; bh=IXXz9ma+sLFTS3/AZjlqAxGNvG3+Lzvfiga4mSetDHA=; b=g2oC7F7fvdFc4wtEIH1VSXIhOwdbScPQp9SZhHuzNI0jECqA7L1z9pXG1Gy3QGaihpFHAbeZf vs5exITZQBFBhu2TMHU2g8Ha4lklKbvqvSHsmzxId0jFfoTwe3pvnUy X-Developer-Key: i=ira.weiny@intel.com; a=ed25519; pk=noldbkG+Wp1qXRrrkfY1QJpDf7QsOEthbOT7vm0PqsE= X-ClientProxiedBy: MW2PR2101CA0016.namprd21.prod.outlook.com (2603:10b6:302:1::29) 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: 16b0440d-16c7-4fb3-23c8-08dd7adde2e3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?utf-8?q?MzmzuKivpih3ndkLatiYFCSofmKWWlL?= =?utf-8?q?oJwCdK+waujSubqjPR2QWk1IFxrE+dWo81a021mbn29Ob0HvBFzso3khbnxYPVkFW?= =?utf-8?q?3HO2DPfEUxX1T8bHwuU9DM1jL2QSjcwQvLD4xT3fsbBW+yaDI5j1ZutZNCMK1qV/5?= =?utf-8?q?5wrVSArvGhIAmJlJiypuKAoebaYHfFr9o9cpU9uATEcEvT5XU1g/ZYBrQ7MLAZeP6?= =?utf-8?q?i6/hR6V1yKfGulbiNl5LyZFVl74YqOvEFXZDgln4Cmlu7KtV6YGoCoQXV4NGibOHJ?= =?utf-8?q?vKU3SvMNgNfb6N+MEY7XvWBU1ksgTA508ghNkv5SO9mmZLkQ+un9rnAgvciicvGqY?= =?utf-8?q?+pqDrCwK6LGK4+SyBl4l1lKTfgOJl9XqJjZ0d6CdV0QiEdLft/52uNARSlc15Sx9M?= =?utf-8?q?YziWQJ2PCanTnKpznStKq8R6+Q966ipgCRZO936t4gbBsVPT1+A2pZt7UbQBrv10w?= =?utf-8?q?uP/+eiN/72tA0Jup0ZM2qNfQR91w/Tk0bH/C4zGfe3DO0+be2Da0kBj9s0vTudZ9L?= =?utf-8?q?1SLHl1OLXc++oLY92kTCENjLfkAxzdt1lx76Pg5M2pFFzo6tSP+uJc/1zAxk5zOuT?= =?utf-8?q?HwOhtJ7nUkurgDFE60RU7EHzEN54yp26d6E7t2oK3epconK/2WMxuadUNUKPwHPz6?= =?utf-8?q?e2eaVqyhOjwqI1NGKBTuYktWtAetae+/XWjnkCYJtPX6K8b+inYlrrFLrr/OGMWc0?= =?utf-8?q?tqglZIRHLl9D0j2bivmXodZ6H4hUkzf4myQ+8euV9Aj6R15ugGBUn8oFoTqR+EPWo?= =?utf-8?q?7BCblzv9l5OhS1UTtKN4Uj8VqLAYWczBhXvvstdwVR0Wac/OK2g/uUhhXsQSAjPDY?= =?utf-8?q?zIRnLq4JxquX+ENgfyMuQFyv8OkMZVrTgj1HSutys5KK3Epk75uKiq5U7W/suP8Jd?= =?utf-8?q?RCmovGdoIGqVDsfAnrK7UqY50TlNSoOjHD3/9dOLjcHJ0GdMNXQjFRUwdvxxGpavB?= =?utf-8?q?HQTAbjSvi7l1BPCxry9dw3yi2JRDGJxDYCT/B6xOZB1rv1yHoScw7wUnc3Lkc+dNS?= =?utf-8?q?JjkVRmgb/aKpjlM9cfbl1jwTThTIkm26wGW0ovnN240IsupM1+A1b2kbQm+ieJ81v?= =?utf-8?q?YWAGvqjb9olpsEqL1pH9wV/+R7iZ6iqQPYROveEemhSCrZk8Wo/d+KA+ViFKByaPv?= =?utf-8?q?F0O+zIsKR83ATM5Y9LUQbKPgnOA3XZtKfWfwUNKJtLeedAOv8yLPCWidXXtSsSyvk?= =?utf-8?q?GGVo/Wz/csA8IquLQcS3cwt0Q0OvuK/hDfWl9/5LWEFPMLK2dsJL9E5GftVpLRVcQ?= =?utf-8?q?yWA6YSte8r1tLIqiJXRfjDasE69s3p205ef570IISZQBAPTwiUUIjceH4nLntqcGV?= =?utf-8?q?1Xi/IvgwAtUru/9lJbFjFDDCE/+C78DcJ8pFNH8z0Rj6lt5+f95tNFU=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);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?/JF0xjdUvhh+u9kOfuFb0PHv9X7U?= =?utf-8?q?mNnm92D7/CfdV2/jiZHteP7N/EyVDO/1OETUaXb7gwJnHLEI6iL1Ic0cfamJaVuuX?= =?utf-8?q?Tgmmja+1KynctlbLPqXTGuqAsC3vdZFmbvwS5BzLDol5wtKOb4nDDJh/QmW+f1dLf?= =?utf-8?q?STTz8Hg9OcoV9Ed4vVXLfzpQnQ6bYlNgiYKl49KEmuHrhUIPH9VLrrjVzgqvgeNja?= =?utf-8?q?ucjfwuR7DOgJjElkF7sup9AfBoJTrx3J1ojhqETcFF5MW7GWD1R4yUzezCaX7LLk/?= =?utf-8?q?RzabLDCmzzxJQ3C1OwPEmtLoloPZMAZ1OzDH5bYUGxA2nZfSSYGkIAszmFQqaWted?= =?utf-8?q?w7SSjF5eYMk2sMbZIsw0X2s542fooCzLiYI8lnTw0A3moz7a43vvQjIb437qtdOae?= =?utf-8?q?6aPFKjD7geKUOB5CaZXZopy8Vwz5VR+qxj4AeDocmbxffQsmCgcRpbuGu/bTN9DlG?= =?utf-8?q?TAWOQVqrK5Rdx5zgYnMBJ0AIeRm25e/tKM/oVm1FO2gfFKkFeHGjvpnz6oUXLAGed?= =?utf-8?q?v7QVF7UT+iWfwZ2wlDBewziQ1HeagmXAEcc2738woco/oETz2f+QCK/cfXo75zPY7?= =?utf-8?q?/Bh6Dcutl7+rbtaqWDd4xgkVPFH+m11cZ1dZI9Drc75XFkN11r8fEv3BVDMrN3Z6d?= =?utf-8?q?54JRtggd/IXTCflmpojmWJT8OduYQerR0It0nvQTPSB6Zq+aJYMKQhZkr/Uupi6K5?= =?utf-8?q?cD9HLblP+Zf+cHqDrsjcDszJDptVpAZN+PcXtEWpAAPtg87sbBKRdMDUBsCsSYf7q?= =?utf-8?q?JtUTIxZ4/Pl8JqvBntiRvg8M5D32ryccs3liEu0KV7Dpf6+SQqCApFZyE29YmH2cX?= =?utf-8?q?Kq6k7TMKGWSaeIhTJdtf8eKR+4Nq3xtXoIfYgR2tuS1SDdF7kgU/92jpFF8OLAlYE?= =?utf-8?q?viulYVFfmga/YlABl86XVreRS87cu/OyKmS8UmKjuZBC1T6lIzb5RBrmA9W1KD91o?= =?utf-8?q?otIR12N0Vtg2kspNxfxD6Z1iZDYYlW2UviKNJycUwlU/SxZeVLQPvgXvojEZGPSop?= =?utf-8?q?81koF4BL1BsJAvbQ6NCN0bu1IUR9MuG2TFKbW6ioWqHnSuNqv6LOrsgEXTTRGXlEX?= =?utf-8?q?gsvxKAgA4CHhThtInmRKldWeFZY6uC458jPUrnpotEWuMDQ/VP00VIi44NR50QurM?= =?utf-8?q?SQ2fRiwkDBpTJwI7utaWlNlGbXeqBcunGxForhjhvc067Ui6Us56CI6Vl2e+GntKi?= =?utf-8?q?2UA9Tw/x+KcYKeDoPPtnOtzuoMKkOJSdFc8PQxblmkUswD/cFJvsxCMhLggNUiQCY?= =?utf-8?q?WCdgVzrueoY4uu4VvYmd6AcEO4AWbysoOOsdv6CJdqU4BTGs0XbDoLOH1CitfO5K1?= =?utf-8?q?oTbqA9m6+jqaXCdaqevIEMmwGRZPYEETYckvinr+bMzB38DwrAr1NTLb8mc0DCDad?= =?utf-8?q?lBASrsJUaQI23pv9bRRJSxhqp3bYeH7lww/0ZJ8p3iciG7DF8ja04F5vXdi1TrApD?= =?utf-8?q?haiTbjgve4LgeHuYY4hq+rDsBJf2ASkosXxaI1RjTh09v/J4XUPKFqk7Sgih0wnQL?= =?utf-8?q?ceUMqFE9o/1F?= X-MS-Exchange-CrossTenant-Network-Message-Id: 16b0440d-16c7-4fb3-23c8-08dd7adde2e3 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:37.1779 (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: 1lF+VGSoNPb53R05D+8uAi1XrF01BKW8bE4CyaczJ+PrszailyDwWvcfFnUtntgrGdQDC7gw5kFzDaCSNlJZsg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR11MB7003 X-OriginatorOrg: intel.com A singular Dynamic RAM partition is exposed via the kernel. Use this partition in cxl-cli. Signed-off-by: Ira Weiny --- Changes: [iweiny: New patch for decoder_ram_a] --- cxl/json.c | 20 ++++++++++++++++++++ cxl/memdev.c | 4 +++- cxl/region.c | 27 ++++++++++++++++++++++++--- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/cxl/json.c b/cxl/json.c index e65bd803b706..79b2b527f740 100644 --- a/cxl/json.c +++ b/cxl/json.c @@ -800,6 +800,20 @@ struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev, } } + size = cxl_memdev_get_dynamic_ram_a_size(memdev); + if (size) { + jobj = util_json_object_size(size, flags); + if (jobj) + json_object_object_add(jdev, "dynamic_ram_a_size", jobj); + + qos_class = cxl_memdev_get_dynamic_ram_a_qos_class(memdev); + if (qos_class != CXL_QOS_CLASS_NONE) { + jobj = json_object_new_int(qos_class); + if (jobj) + json_object_object_add(jdev, "dynamic_ram_a_qos_class", jobj); + } + } + if (flags & UTIL_JSON_HEALTH) { jobj = util_cxl_memdev_health_to_json(memdev, flags); if (jobj) @@ -1059,6 +1073,12 @@ struct json_object *util_cxl_decoder_to_json(struct cxl_decoder *decoder, json_object_object_add( jdecoder, "volatile_capable", jobj); } + if (cxl_decoder_is_dynamic_ram_a_capable(decoder)) { + jobj = json_object_new_boolean(true); + if (jobj) + json_object_object_add( + jdecoder, "dynamic_ram_a_capable", jobj); + } } if (cxl_port_is_root(port) && diff --git a/cxl/memdev.c b/cxl/memdev.c index 6e44d1578d03..bdcb008f1d73 100644 --- a/cxl/memdev.c +++ b/cxl/memdev.c @@ -269,8 +269,10 @@ static int __reserve_dpa(struct cxl_memdev *memdev, if (mode == CXL_DECODER_MODE_RAM) avail_dpa = cxl_memdev_get_ram_size(memdev); - else + else if (mode == CXL_DECODER_MODE_PMEM) avail_dpa = cxl_memdev_get_pmem_size(memdev); + else + avail_dpa = cxl_memdev_get_dynamic_ram_a_size(memdev); cxl_decoder_foreach(port, decoder) { size = cxl_decoder_get_dpa_size(decoder); diff --git a/cxl/region.c b/cxl/region.c index 207cf2d00314..824274e25ed8 100644 --- a/cxl/region.c +++ b/cxl/region.c @@ -303,7 +303,8 @@ static int parse_create_options(struct cxl_ctx *ctx, int count, if (param.type) { p->mode = cxl_decoder_mode_from_ident(param.type); - if (p->mode == CXL_DECODER_MODE_RAM && param.uuid) { + if ((p->mode == CXL_DECODER_MODE_RAM || + p->mode == CXL_DECODER_MODE_DYNAMIC_RAM_A) && param.uuid) { log_err(&rl, "can't set UUID for ram / volatile regions"); goto err; @@ -417,6 +418,9 @@ static void collect_minsize(struct cxl_ctx *ctx, struct parsed_params *p) case CXL_DECODER_MODE_PMEM: size = cxl_memdev_get_pmem_size(memdev); break; + case CXL_DECODER_MODE_DYNAMIC_RAM_A: + size = cxl_memdev_get_dynamic_ram_a_size(memdev); + break; default: /* Shouldn't ever get here */ ; } @@ -448,8 +452,10 @@ static int create_region_validate_qos_class(struct parsed_params *p) if (p->mode == CXL_DECODER_MODE_RAM) qos_class = cxl_memdev_get_ram_qos_class(memdev); - else + else if (p->mode == CXL_DECODER_MODE_PMEM) qos_class = cxl_memdev_get_pmem_qos_class(memdev); + else + qos_class = cxl_memdev_get_dynamic_ram_a_qos_class(memdev); /* No qos_class entries. Possibly no kernel support */ if (qos_class == CXL_QOS_CLASS_NONE) @@ -488,6 +494,12 @@ static int validate_decoder(struct cxl_decoder *decoder, return -EINVAL; } break; + case CXL_DECODER_MODE_DYNAMIC_RAM_A: + if (!cxl_decoder_is_dynamic_ram_a_capable(decoder)) { + log_err(&rl, "%s is not dynamic_ram_a capable\n", devname); + return -EINVAL; + } + break; default: log_err(&rl, "unknown type: %s\n", param.type); return -EINVAL; @@ -509,9 +521,11 @@ static void set_type_from_decoder(struct cxl_ctx *ctx, struct parsed_params *p) return; /* - * default to pmem if both types are set, otherwise the single + * default to pmem if all types are set, otherwise the single * capability dominates. */ + if (cxl_decoder_is_dynamic_ram_a_capable(p->root_decoder)) + p->mode = CXL_DECODER_MODE_DYNAMIC_RAM_A; if (cxl_decoder_is_volatile_capable(p->root_decoder)) p->mode = CXL_DECODER_MODE_RAM; if (cxl_decoder_is_pmem_capable(p->root_decoder)) @@ -699,6 +713,13 @@ static int create_region(struct cxl_ctx *ctx, int *count, param.root_decoder); return -ENXIO; } + } else if (p->mode == CXL_DECODER_MODE_DYNAMIC_RAM_A) { + region = cxl_decoder_create_dynamic_ram_a_region(p->root_decoder); + if (!region) { + log_err(&rl, "failed to create region under %s\n", + param.root_decoder); + return -ENXIO; + } } else { log_err(&rl, "region type '%s' is not supported\n", param.type); From patchwork Sun Apr 13 22:53:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 14049480 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.18]) (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 DCF0D214A76 for ; Sun, 13 Apr 2025 22:52:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.18 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584763; cv=fail; b=Mh6SbTEvWInAHYdh9VFLAk+Gu5YXMEIEjwmt4kSZMOPTPV2EC9azI0LCly9iHFYtsM+XBRX2eFSwInAZxb5U8xbWbU1pZhzVOu/Qi3QStXWU89A/xfcOYEiuDmOscauzV2sZV3FsLrt6IlRHidJ11LkASCOXA0lfJXpE/dlcz1E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584763; c=relaxed/simple; bh=v08CzPvwsIW/3cMosj4dQJdHClkLH7ghZffHXqhCmhA=; h=From:Date:Subject:Content-Type:Message-ID:References:In-Reply-To: To:CC:MIME-Version; b=idNUlbFdO6kiv2/BFdPVBwYdWBPYVlGiCMjiO0JfMHhL8wpWsZuFMJdOQFvEVrPdnsVauNhMH/fCnrB3/NE+8WcHnHiK8x+aPwZYu/fqdlTZROy9nwfy5Rp8/l8F732FQat8Vlns8G4fKmP3aZLfcLXpPSd4XjNzc/ht+ckjtmQ= 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=P/NmFzj7; arc=fail smtp.client-ip=192.198.163.18 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="P/NmFzj7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1744584762; x=1776120762; h=from:date:subject:content-transfer-encoding:message-id: references:in-reply-to:to:cc:mime-version; bh=v08CzPvwsIW/3cMosj4dQJdHClkLH7ghZffHXqhCmhA=; b=P/NmFzj7nE9K4J4xjmLNZs1HGNGg0D4bPzR+ipr+wAykXkCzpsxTrDIr StR56iGRIcur3QCNjoOdeY+klpjsxXDO+wWgm71Sw5Gf8NP5Eo+PNllPW /OXSDMHSruvlA5XNntwk6BQA47oL3ydogGSmkh0NVLgrn+jZXJOWApWgY VUkeSsjxx8s7uNXSsyeQpX4iTbEtpv7VYd/8ww16R+nxxUhJ1dMtMHdWb 6aW8aUkFEg9nft9epawJRLjIbXnUBhbA3jOPGZ041GQhEUHeNC/VZN0AU 6RdqYpAV+lOI66vjhTMRka+90RrCyB540nAO8/PC84NbuXW8SimBX+yBx A==; X-CSE-ConnectionGUID: 02kzIob1SO+iUcd1zLgntw== X-CSE-MsgGUID: xX1iCjSxSBm+G3FLIIDeKw== X-IronPort-AV: E=McAfee;i="6700,10204,11402"; a="45280987" X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="45280987" Received: from fmviesa007.fm.intel.com ([10.60.135.147]) by fmvoesa112.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Apr 2025 15:52:42 -0700 X-CSE-ConnectionGUID: KdaQ4WoyQUCi1S/+9fKA/w== X-CSE-MsgGUID: vWJM0oFZRaGP8JkixlF/cw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="129657644" Received: from orsmsx903.amr.corp.intel.com ([10.22.229.25]) by fmviesa007.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Apr 2025 15:52:41 -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.14; Sun, 13 Apr 2025 15:52:40 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) 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:40 -0700 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (104.47.57.44) by edgegateway.intel.com (134.134.137.100) 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:40 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ooYA/JWuSX46lKnnoaWF9YHIQyQGhM87n8Cwvw+GaS8Zut1FUQptGuQ00+GmPOraewi3XwD17sAlAhnbaNlhXHVplZv2nXQoGQTxTuX7PuvwqsemIYUZwkzwjGvxzK8irVH9fyoNeIOATMCcrsrNkztU5M22mNyJwGFnJQdZg8MQcUFQak45rWsxaAiWllKlTYj8f0jP7Fq2dr0LacKKJCFEP9Ptk1qBOhyw7DC6IZMVUv+XpSpjZcHp6A78v08E9k0tvxCAaDznr6ppgkaQhaiRxpP0yQm2Hl9gpho64vp5VWgKVl7DDN2hVoP1Xx5qYVAz9Vl8ASXINpo8iv7WGA== 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=oU8VHnoQLeoj8UGJVPUR011rbMDtdHIvG+2LUNPpCXg=; b=Z46SkVvRAu5f+nPZuZSPywjGKFuSzWLSkjeOjDswQXcRY+sqlFyQcZOUTixnu3vcN8xcsqpzQSnX3DouLC0aO4+fTuuYEXj66or8YxflkgOfImvVtKm98OvWN8c84m9MK7wf5s+zaPHXke5fva/BaI1rL1hkPHz88jiwLwpghCZYgo9y/UUyer8J8BKZ+/XGzKvu5DGpkXlHgd1ujVFn3MQM5625xK7axgDlYtWffoT6HJ+8T/eZiEZefO4YzR4sPiKiCjFbPq0nKcSm8kcMhGulo/YCHk43qI3EJUeaKyDs8M/AqES77Mtq2In550lrTPXWDIGjdY9j52i0jpSn9Q== 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:38 +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:38 +0000 From: Ira Weiny Date: Sun, 13 Apr 2025 17:53:00 -0500 Subject: [ndctl PATCH v5 3/5] libcxl: Add extent functionality to DC regions Message-ID: <20250413-dcd-region2-v5-3-fbd753a2e0e8@intel.com> References: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> In-Reply-To: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> To: Alison Schofield CC: Vishal Verma , Jonathan Cameron , Fan Ni , Sushant1 Kumar , Dan Williams , "Dave Jiang" , , , Ira Weiny X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1744584788; l=8746; i=ira.weiny@intel.com; s=20221211; h=from:subject:message-id; bh=v08CzPvwsIW/3cMosj4dQJdHClkLH7ghZffHXqhCmhA=; b=xaMFgB4JKIixVteVOlgNiJdHDgaeLHIPrsQ8l2MHsaC4mjK2AmYeESyB8uJTzHA3YpSvXjAOQ e5VrHqpqCjqBvzDHTmWy0/yktDfiDIUlYaw67D9xOm7S+SF5ezgMvvF X-Developer-Key: i=ira.weiny@intel.com; a=ed25519; pk=noldbkG+Wp1qXRrrkfY1QJpDf7QsOEthbOT7vm0PqsE= X-ClientProxiedBy: MW2PR2101CA0016.namprd21.prod.outlook.com (2603:10b6:302:1::29) 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: 492e38ec-ec6a-4152-8716-08dd7adde3be X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?utf-8?q?swsa8niwc24FS+YSOgp8OPIRQkGHgBy?= =?utf-8?q?wjaTyFQZ+x6MVVFRHozzNDoLsITdYgT/sLcWI8N4+6BsGVXgEnt0a10eykvkiM9Qy?= =?utf-8?q?gJBaAQr5Z8403zrdLDCdZFQvm1Km9JBMtYX/0Wui7PmvVyzbbxSZBCSCqap4/mbyT?= =?utf-8?q?ZAqjea/FoQ6/WIwt/h9WJJO863z5H+D23dpr6kw+ifgtZ+iwFDIBUmdtp13YvJ3Ab?= =?utf-8?q?Z3j2jsl32OVaPxBVWKA58tQOGFw5p101wTgWm0lB9mAGZ4VIfmLyEQemIBBbHFOnx?= =?utf-8?q?n5KJmViZjB/xDpFs5xqbbo2OA0AiiwdDqHxn9ob/PFyboj9tmAa8ffEKFZQojnXdc?= =?utf-8?q?S2TZoHUa3WIAk9KsknOCfN81e68Xmr20vLG6BjlQVwj2Rl0fy+9wu6GhTcFl6RgXH?= =?utf-8?q?m0l3Hbz5i110CaTEoPYu6UOP7UdP5tgXMrFjzWln1cCMY45G5TYyukpdyts4vC9AA?= =?utf-8?q?6nNj56lLFcBZCZBgiyLCqL+3nayM8dX1wDuXfRwYQa0rf3gfp1Acapwbee8gaOBmb?= =?utf-8?q?KswRaQTPCuN2W7lbsmZx6AWW8+K2bslT/PcYZ0yZppYMS+zU9FqeFN1mezMmlQS0c?= =?utf-8?q?VFIKR4J0zkFzl8t4SMRZDbI4J8bKJ9CXju6vHTYGTQTyxiNYi62pwsatZpgbZLkG6?= =?utf-8?q?UJFwYYL2HRBD8lNuzo82OQSGCIZ6Pr3ZR8Ex4U3tYLN9xMTRHtnO/BdYS3PfPVKx8?= =?utf-8?q?XPfwNE0Fuvxao9umZyMKyXNxTbaS9Qvc0xUNX1jjSxxmBF/TQTQzw6rBHxI03XZpC?= =?utf-8?q?wYTp3TKBl6jV3jdnqwVZ+qqEeT5qFh0SF1DcHpC4P5HdB67pWAeqeXhm7pY55TzLR?= =?utf-8?q?g6hot2jjkMlE3LmoElku66WDyBHA2qyQ/DnPcc66G9dio/hIVCCDxvNvXfFBfnSla?= =?utf-8?q?DyQ0hyYguQd1g2gFVOV75cmRlLnFy36AaLASKySTr580iFFFzruJUXhyu6A8aKZ+Q?= =?utf-8?q?CIuT4kIL3k2z4wspRKk8zFwK8C8OpE/FrMU9gf0HE3+Lq80mZJ1NHnfIOaH8YCVJ9?= =?utf-8?q?URd8/N8FPya+vonGXSD6FTKqjyQJTb22MJJosMvBHhi0OgqxgKONcdq1VySDRJb8b?= =?utf-8?q?HPoNurjPSYpVCGiLsPIU+EdAkkEp2bpKV6okzcpaplxctgSwd0CiJRPEC4fVj24Pr?= =?utf-8?q?GehQvinfwg/8ekMwDzAnW2Q7GnstDGO2KNib1Kw3rjQrrqn0q7sH0BBH2q/uGJhLE?= =?utf-8?q?bTbG3+moQkyMvIBIiu+6dy6XIKzEW9I3e7qiFF9tUftMc1eEfdfutqkkOlftSbBmX?= =?utf-8?q?OUyKEbVysu/nfk2BfieMkQjGhd5JKLVO0EEP3mchoFAoXzM4KKIWI4CqtwNeOA676?= =?utf-8?q?t+DrPZG8hes/TTIcZTA9oKq6qr2reFWc9mf8AoScGHX9DRTlFyY/OVc=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);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?XpNOrWSvm1MvUPLMk+l470RNveJR?= =?utf-8?q?scA8MqoMGtifnNlZsqPP+ZemG12DzpqrBr18Vsh14zf6Al4U+OrPZQjmJDPaqn6Hd?= =?utf-8?q?tH0DJHtTYokALD7sQ1WfFjGcdnYa/ctxz5fy/LlL0m7XxV5PEBG+OfszCM9YljcEo?= =?utf-8?q?qK8eyPkl20RTO/zERRIh9nV8l+ji+Gnv/Y8CXZz8NkqVaAGMCIIpbPThAB+9evWxA?= =?utf-8?q?HuBdWnA8OvRKLJgqmbzp59BNIidNJTGCkEUcNjSUt6m7qxbgC96plzMDFZPMay5py?= =?utf-8?q?aiXhoqUHNqbrInx/4xFYO26aZLQF4Zzwdfr5ITAH1JjdupWHK6kIHjbvhx5BJzT2Y?= =?utf-8?q?uBh1b/fNZschk1KYopWX19EHip/5PKMM7lL76HYOWnYNxGGRXITiitHGcV8AXJMWd?= =?utf-8?q?Y4MBeHMbUriU+VfsDxE5ujAa94ExeAgZpT1xvXcOJSRQIz5wOd7Z/FX2UGHgSvBjc?= =?utf-8?q?/psyKeoWdaEmPJ47/dR9c3ZWpmBJ7PT5VcmS68z59GxbFj55S/2VfbFr94Sy7e+AX?= =?utf-8?q?n4c8bra1waJPZEI0C0KZpORu6hfTbw86lUXutRzfMmvwIUGlZ+AOsa94KQ+soToZM?= =?utf-8?q?VXzkdDmYyAKfC4F4+guhNd9vX9DURkfqcSp3g7ObNRNy403snkGpq8dE/SQI8QhYq?= =?utf-8?q?2dX0oDuu3BnlqjXHGXFmzyf/0ktuWROHWihkWJUtc6v2xI+bZdrBJeXKWNmlFDOxb?= =?utf-8?q?qx85/aKStPgzgxvaXOFvdDAOJDwPfIvQdFx0Sf6UdSVhiWoFW9XaP7JrU/EX1nUMx?= =?utf-8?q?1STglb4mQKNupodepPVpRC+NA64FXqj/lw3NA4gohmA8rvn3cgaNaG+ZqjdXl92gV?= =?utf-8?q?qDnHj5HlUYvSAU9ZetaJ2IGya3uYhf0qHIhFqytagrfWuHB/0X496U5A3SGa0uFi/?= =?utf-8?q?U1Zd/HZl3bkD8DiC3WCH7+NjPP/z53P/CuvnjP7E01IHc9cfmbagLmaSu5gTTJxqS?= =?utf-8?q?/kYxiGMsrj1xHGz6d1gTMBoJKAfMiWI6zkzBqYYehjVGi2WJmj55hWSS0CAj/gCf9?= =?utf-8?q?Dcix7NTgZPHW09eZsIQaI8vV5gH+K9SruEemeU/Nsks/Y3b/ao4EFVfJx5MV+ratn?= =?utf-8?q?k5FmnC9mqximHCIMUMjBY6s0OjUp/SM33pdxCJRfvxv6G77dI7NNDlO3H7f1XCL3i?= =?utf-8?q?c1a+X1eMOWVDkHx5eNA6Zvi8RmqnlsNSPwyGqLVtxUsBPSSrndDGJV3qaFw0Bt3nT?= =?utf-8?q?yFZydlq+Kq7bu2r9k7nuepw9BD4rAyk4UmRk/4XZr/gN7RMSnQwJciIqmoBI2C3dx?= =?utf-8?q?/OOKZVm5zRfO3mKzHCKfkn9DnZQu70IAfRqeiaDoXv12sRGl/3/1UxIVLHvK94Xjh?= =?utf-8?q?NnYUv3EDBX09Y7AKe2g4QIh1UFw3JgA96Y8EgOXU1w3MKoTKgKPFBxDxzRJ7q8nFs?= =?utf-8?q?3+MzkfSiBP6umaXW4FmiH3gdHwyuWIvjPwHD/oj2mtAeSCKxIbfI9sMfCBvk93A1A?= =?utf-8?q?ZEs1/Bss0kKxw6i1WR3u5GuVl/WXd/Hgpv169cuygqRGWBLZCpyYSD9TUGkf6pYzM?= =?utf-8?q?VeryAb6jntYT?= X-MS-Exchange-CrossTenant-Network-Message-Id: 492e38ec-ec6a-4152-8716-08dd7adde3be 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:38.5376 (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: frUscTsUFrhBNzZi5o1YMuqKFbkKmXuh2SmMsS9MSC5uOGI/YZyXw0sfeoa17pnfpNhpg0YS6IM/iws4qWrhjg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR11MB7003 X-OriginatorOrg: intel.com DCD regions have 0 or more extents. The ability to list those and their properties is useful to end users. Add extent scanning and reporting functionality to libcxl. Signed-off-by: Ira Weiny --- Changes: [alison: s/tag/uuid/ for extents] --- Documentation/cxl/lib/libcxl.txt | 27 ++++++++ cxl/lib/libcxl.c | 138 +++++++++++++++++++++++++++++++++++++++ cxl/lib/libcxl.sym | 5 ++ cxl/lib/private.h | 11 ++++ cxl/libcxl.h | 11 ++++ 5 files changed, 192 insertions(+) diff --git a/Documentation/cxl/lib/libcxl.txt b/Documentation/cxl/lib/libcxl.txt index 7e2136519229..84f39d2eda6c 100644 --- a/Documentation/cxl/lib/libcxl.txt +++ b/Documentation/cxl/lib/libcxl.txt @@ -603,6 +603,33 @@ where its properties can be interrogated by daxctl. The helper cxl_region_get_daxctl_region() returns an 'struct daxctl_region *' that can be used with other libdaxctl APIs. +EXTENTS +------- + +=== EXTENT: Enumeration +---- +struct cxl_region_extent; +struct cxl_region_extent *cxl_extent_get_first(struct cxl_region *region); +struct cxl_region_extent *cxl_extent_get_next(struct cxl_region_extent *extent); +#define cxl_extent_foreach(region, extent) \ + for (extent = cxl_extent_get_first(region); \ + extent != NULL; \ + extent = cxl_extent_get_next(extent)) + +---- + +=== EXTENT: Attributes +---- +unsigned long long cxl_extent_get_offset(struct cxl_region_extent *extent); +unsigned long long cxl_extent_get_length(struct cxl_region_extent *extent); +void cxl_extent_get_uuid(struct cxl_region_extent *extent, uuid_t uuid); +---- + +Extents represent available memory within a dynamic capacity region. Extent +objects are available for informational purposes to aid in allocation of +memory. + + include::../../copyright.txt[] SEE ALSO diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c index 81810a4ae862..306a46682b71 100644 --- a/cxl/lib/libcxl.c +++ b/cxl/lib/libcxl.c @@ -571,6 +571,7 @@ static void *add_cxl_region(void *parent, int id, const char *cxlregion_base) region->ctx = ctx; region->decoder = decoder; list_head_init(®ion->mappings); + list_head_init(®ion->extents); region->dev_path = strdup(cxlregion_base); if (!region->dev_path) @@ -1176,6 +1177,143 @@ cxl_mapping_get_next(struct cxl_memdev_mapping *mapping) return list_next(®ion->mappings, mapping, list); } +static void cxl_extents_init(struct cxl_region *region) +{ + const char *devname = cxl_region_get_devname(region); + struct cxl_ctx *ctx = cxl_region_get_ctx(region); + char *extent_path, *dax_region_path; + struct dirent *de; + DIR *dir = NULL; + + if (region->extents_init) + return; + region->extents_init = 1; + + dax_region_path = calloc(1, strlen(region->dev_path) + 64); + if (!dax_region_path) { + err(ctx, "%s: allocation failure\n", devname); + return; + } + + extent_path = calloc(1, strlen(region->dev_path) + 100); + if (!extent_path) { + err(ctx, "%s: allocation failure\n", devname); + free(dax_region_path); + return; + } + + sprintf(dax_region_path, "%s/dax_region%d", + region->dev_path, region->id); + dir = opendir(dax_region_path); + if (!dir) { + err(ctx, "no extents found (%s): %s\n", + strerror(errno), dax_region_path); + free(extent_path); + free(dax_region_path); + return; + } + + while ((de = readdir(dir)) != NULL) { + struct cxl_region_extent *extent; + char buf[SYSFS_ATTR_SIZE]; + u64 offset, length; + int id, region_id; + + if (sscanf(de->d_name, "extent%d.%d", ®ion_id, &id) != 2) + continue; + + sprintf(extent_path, "%s/extent%d.%d/offset", + dax_region_path, region_id, id); + if (sysfs_read_attr(ctx, extent_path, buf) < 0) { + err(ctx, "%s: failed to read extent%d.%d/offset\n", + devname, region_id, id); + continue; + } + + offset = strtoull(buf, NULL, 0); + if (offset == ULLONG_MAX) { + err(ctx, "%s extent%d.%d: failed to read offset\n", + devname, region_id, id); + continue; + } + + sprintf(extent_path, "%s/extent%d.%d/length", + dax_region_path, region_id, id); + if (sysfs_read_attr(ctx, extent_path, buf) < 0) { + err(ctx, "%s: failed to read extent%d.%d/length\n", + devname, region_id, id); + continue; + } + + length = strtoull(buf, NULL, 0); + if (length == ULLONG_MAX) { + err(ctx, "%s extent%d.%d: failed to read length\n", + devname, region_id, id); + continue; + } + + sprintf(extent_path, "%s/extent%d.%d/tag", + dax_region_path, region_id, id); + buf[0] = '\0'; + if (sysfs_read_attr(ctx, extent_path, buf) != 0) + dbg(ctx, "%s extent%d.%d: failed to read uuid\n", + devname, region_id, id); + + extent = calloc(1, sizeof(*extent)); + if (!extent) { + err(ctx, "%s extent%d.%d: allocation failure\n", + devname, region_id, id); + continue; + } + if (strlen(buf) && uuid_parse(buf, extent->uuid) < 0) + err(ctx, "%s:%s\n", extent_path, buf); + extent->region = region; + extent->offset = offset; + extent->length = length; + + list_node_init(&extent->list); + list_add(®ion->extents, &extent->list); + dbg(ctx, "%s added extent%d.%d\n", devname, region_id, id); + } + free(dax_region_path); + free(extent_path); + closedir(dir); +} + +CXL_EXPORT struct cxl_region_extent * +cxl_extent_get_first(struct cxl_region *region) +{ + cxl_extents_init(region); + + return list_top(®ion->extents, struct cxl_region_extent, list); +} + +CXL_EXPORT struct cxl_region_extent * +cxl_extent_get_next(struct cxl_region_extent *extent) +{ + struct cxl_region *region = extent->region; + + return list_next(®ion->extents, extent, list); +} + +CXL_EXPORT unsigned long long +cxl_extent_get_offset(struct cxl_region_extent *extent) +{ + return extent->offset; +} + +CXL_EXPORT unsigned long long +cxl_extent_get_length(struct cxl_region_extent *extent) +{ + return extent->length; +} + +CXL_EXPORT void +cxl_extent_get_uuid(struct cxl_region_extent *extent, uuid_t uuid) +{ + memcpy(uuid, extent->uuid, sizeof(uuid_t)); +} + CXL_EXPORT struct cxl_decoder * cxl_mapping_get_decoder(struct cxl_memdev_mapping *mapping) { diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym index 06f7d40344ab..b9d99ec80cec 100644 --- a/cxl/lib/libcxl.sym +++ b/cxl/lib/libcxl.sym @@ -297,4 +297,9 @@ global: cxl_memdev_get_dynamic_ram_a_qos_class; cxl_decoder_is_dynamic_ram_a_capable; cxl_decoder_create_dynamic_ram_a_region; + cxl_extent_get_first; + cxl_extent_get_next; + cxl_extent_get_offset; + cxl_extent_get_length; + cxl_extent_get_uuid; } LIBECXL_8; diff --git a/cxl/lib/private.h b/cxl/lib/private.h index 57c9fa0b8f52..d5e0c0528c42 100644 --- a/cxl/lib/private.h +++ b/cxl/lib/private.h @@ -164,6 +164,7 @@ struct cxl_region { struct cxl_decoder *decoder; struct list_node list; int mappings_init; + int extents_init; struct cxl_ctx *ctx; void *dev_buf; size_t buf_len; @@ -179,6 +180,7 @@ struct cxl_region { struct daxctl_region *dax_region; struct kmod_module *module; struct list_head mappings; + struct list_head extents; }; struct cxl_memdev_mapping { @@ -188,6 +190,15 @@ struct cxl_memdev_mapping { struct list_node list; }; +#define CXL_REGION_EXTENT_TAG 0x10 +struct cxl_region_extent { + struct cxl_region *region; + u64 offset; + u64 length; + uuid_t uuid; + struct list_node list; +}; + enum cxl_cmd_query_status { CXL_CMD_QUERY_NOT_RUN = 0, CXL_CMD_QUERY_OK, diff --git a/cxl/libcxl.h b/cxl/libcxl.h index de66f2462311..3b3f6ae9a07d 100644 --- a/cxl/libcxl.h +++ b/cxl/libcxl.h @@ -373,6 +373,17 @@ unsigned int cxl_mapping_get_position(struct cxl_memdev_mapping *mapping); mapping != NULL; \ mapping = cxl_mapping_get_next(mapping)) +struct cxl_region_extent; +struct cxl_region_extent *cxl_extent_get_first(struct cxl_region *region); +struct cxl_region_extent *cxl_extent_get_next(struct cxl_region_extent *extent); +#define cxl_extent_foreach(region, extent) \ + for (extent = cxl_extent_get_first(region); \ + extent != NULL; \ + extent = cxl_extent_get_next(extent)) +unsigned long long cxl_extent_get_offset(struct cxl_region_extent *extent); +unsigned long long cxl_extent_get_length(struct cxl_region_extent *extent); +void cxl_extent_get_uuid(struct cxl_region_extent *extent, uuid_t uuid); + struct cxl_cmd; const char *cxl_cmd_get_devname(struct cxl_cmd *cmd); struct cxl_cmd *cxl_cmd_new_raw(struct cxl_memdev *memdev, int opcode); From patchwork Sun Apr 13 22:53:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 14049481 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.18]) (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 00063215075 for ; Sun, 13 Apr 2025 22:52:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.18 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584764; cv=fail; b=Qk7IF6bUDiCbeXTFumjlyx/jufkUC1XCKf4bG1qIHTGRcqgUWQ3lUt+Mh8fAmNVw+mwmH+5A8u7TEQwrM9/DYfrMKNdg9fVEzKWg9azyFG4f3xaSTUbgoA7uDZh35elFDfwEmM67DNQcI0S6GtnojUXF7M81meSKC0+u3svlbBQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584764; c=relaxed/simple; bh=dFdwKs0png9HOITFWXrcRB3D1JUC59zlUdaHmJQc6+I=; h=From:Date:Subject:Content-Type:Message-ID:References:In-Reply-To: To:CC:MIME-Version; b=gopomScrEey1BhKN55wOweCyTgLjUXHrsHRM7rQ/cVf3APJ3gAc3L1AcOCtayvU9/wi2ESzpi8o/JGjun54Ac3yB+dUSKELKbSCgDnQGo9VB4kKLCuoxfy/2RFhgooCpNizKQR8d5T2uF2/1LFYw4B+7WBSyLEZNQ6OfAvvAvsc= 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=R5+YBjj7; arc=fail smtp.client-ip=192.198.163.18 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="R5+YBjj7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1744584763; x=1776120763; h=from:date:subject:content-transfer-encoding:message-id: references:in-reply-to:to:cc:mime-version; bh=dFdwKs0png9HOITFWXrcRB3D1JUC59zlUdaHmJQc6+I=; b=R5+YBjj7nQH8yCBXoLGD1IeyX00fwqMnWqeWQ+wamDJI1iKuxaHFSsQV E2PCSvIbxrU5sUi153KsspshHOTQ5ecCvG+0/Pz2osz0vNelF6lwgL5ks girXxCSDNA3gNLV3OdsVkCTDc9+yLkqxol8csei1KSSEXJdYOg4U2bzRA pB+VhjHjshb1NbVtUflknWfjbAR7W1P3p6uRnHiL9yUDPnZaYVAZI7yWt 3FBT/aiC2O5tUUfS+TGVHrWBuRneUp4IrHi8CMid03jcjaBiImhgIcrAN yCmznUvg48TXOyrky0YmKiPeD2Uykh0rY7MO/n/dhL2Y7YZo9O4JTu3zT A==; X-CSE-ConnectionGUID: pyfEL464RRCv8TYXBJRQaw== X-CSE-MsgGUID: NQXliGw2SOyvoSgvCv9AWQ== X-IronPort-AV: E=McAfee;i="6700,10204,11402"; a="45280991" X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="45280991" Received: from fmviesa007.fm.intel.com ([10.60.135.147]) by fmvoesa112.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Apr 2025 15:52:43 -0700 X-CSE-ConnectionGUID: 7lTcAC3aT/eCjbwDMeIcHw== X-CSE-MsgGUID: yV/ZO9HLS8e0w0UwYKdXUQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="129657645" Received: from orsmsx903.amr.corp.intel.com ([10.22.229.25]) by fmviesa007.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Apr 2025 15:52:42 -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.14; Sun, 13 Apr 2025 15:52:42 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) 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:42 -0700 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (104.47.57.40) by edgegateway.intel.com (134.134.137.100) 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:41 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JMDF4rB/cZa4LAhLqqlpkus+DDBTdhwYiIDUqCAuDv/sQajv/cz7vjage4d1zNft6VQncXRd3XUO0zdOAmXrgZw5h7KE/6AvOy2Ys5CmYo+m8vETvRMwUeI0m3QJeCf/Q2HclfcnjQUP7XKkkLbHD1grKG2aDI53IVULD+RfOTiclhHMecppTY3xv6LmIKH+sFc5c9MTpUlbYTTACej4HKCcuGWh9aOfb2VBcyupTQKu3uRRaHhTfF/35T8IRZZWxx1OILOzpGKkNAAgFc98z2hc/XvB9wh1omWyLoszOA1EzSE05KIXR7Fki2nnU7rP5matkrIA0Xai0GypRqb27w== 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=qna0HqNONCD2fzhnPQVIjl+GxH4W0hRw8y2V2kT4o0c=; b=j29edv6ipj4hWkEmIV293cnD0vOV3R2aXOYQ9Es1jbJY4ya8egDomGuLA4jH7ylp8IKsKcnLkLtUbivdJsCUCreWHgzrUD8rZ87g9hN626+iXHGkc+8bFouPpRhMqBgZQtJGBiHXwzTQ0ILk/dGGTLu8SKzHMvomv0BXm73mVAHhexKIBtFs7gzE0eTyIlUyo3jXQPtgngNREexDlBwICfV4uaLA0YWxiBz7kymU0wMkfhWrKyNn2DAuwPHxv2xa4tabgWKY2v5cIkePxHYlIF38sEY/LZR7YZQiL3jWkQQXRVAU89oleyJKUL9R4jTFJNPJrvLAdSn1pXNaQOa7pw== 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:40 +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:40 +0000 From: Ira Weiny Date: Sun, 13 Apr 2025 17:53:01 -0500 Subject: [ndctl PATCH v5 4/5] cxl/region: Add extent output to region query Message-ID: <20250413-dcd-region2-v5-4-fbd753a2e0e8@intel.com> References: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> In-Reply-To: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> To: Alison Schofield CC: Vishal Verma , Jonathan Cameron , Fan Ni , Sushant1 Kumar , Dan Williams , "Dave Jiang" , , , Ira Weiny X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1744584788; l=6303; i=ira.weiny@intel.com; s=20221211; h=from:subject:message-id; bh=dFdwKs0png9HOITFWXrcRB3D1JUC59zlUdaHmJQc6+I=; b=Ew1zSf4QRDm9varIU/fjo4gi0mJLqICjqFm3SGvFbXeNs6WiYcP7gqzyUrvHz3eNF+RfK5jOY vhz9v+QKHJuB3V4/2EeVDsQD4aBQp5uiQTWrH4ARD2dJzoYpobubQKz X-Developer-Key: i=ira.weiny@intel.com; a=ed25519; pk=noldbkG+Wp1qXRrrkfY1QJpDf7QsOEthbOT7vm0PqsE= X-ClientProxiedBy: MW2PR2101CA0016.namprd21.prod.outlook.com (2603:10b6:302:1::29) 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: c2f675ad-17fe-41b2-677c-08dd7adde49b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?utf-8?q?nJL+2YYee5xuu99eQwQPGGxz//pwEhI?= =?utf-8?q?/oqHV3tDZjwFN+ySlmXAL1U3GHYSlaWFGOL4ugN4MFMmGmOlPXI6erFVDbK6csmz3?= =?utf-8?q?yBHgDJUrLW5PRr5dZrw333N8rdmE6bXJBj+NKqhJgDF9c0a7sAuKDE57VuoV3Xj/4?= =?utf-8?q?MN+wIVYVuh05dnYYV9kdT7n6K+bjMuZQicKsO47Iqyii0JkjFO2u1GPD1L0+Ibfph?= =?utf-8?q?0K1XrZLgykVnqnYiDvy2mai5VgPyjHAvdtrgQMzqdF9KjTk3/iWMOu/g1bDF/lA82?= =?utf-8?q?R0GYYpsrj0VtUpIIHqIUgCD89JnseZ2TptQPhWo/EBVKAAZcmhEDyK5tgP/1v1kVM?= =?utf-8?q?puo2e/4VJguwnkr+bcGXKSJXga70/YzAN6YzW7UpGDvzO170bcr31rhT+cklUEopD?= =?utf-8?q?z/XQ/DtimbKoSMBJObCAAGdgYxHEGsctNFEIp4WpYLvqw99xgTWYIVOr/MaUlr5/B?= =?utf-8?q?9d0FqW81PD/jWFDbDDXZVRvceExERhfh7YoBUaF8zPeKuhwHXEUev7cuo28EI9xva?= =?utf-8?q?4URfp+bEHllTOetDjamarAQOuPSUdUm4M66jHOnwCjjZrL+9FlGGYgP6BIwI1neF8?= =?utf-8?q?4kzkkbeRGhlqHEEnfIHti1kWz3c59R0WFVhNrH9nAPThxDI+ianjyBk+A3RU/CAZE?= =?utf-8?q?oQJQjpCmHhmGsxYESY4MhG5g5Hp2xJUTdgxe+IKe0ZnZEq1x/nVC6HDFrzmdFwc3U?= =?utf-8?q?r+gN0NMjI8V7orje5yCVNLwpID+88+fIME/ndf6BWfaJGRVpZ2GRuS2bGDulApelU?= =?utf-8?q?v+odtc+RAekPgKcVLqjFCsSNFDXUJU8M1IFaxGxtokcDJ6x5m9YnalCOt3P4fILjt?= =?utf-8?q?gXhRZ3/c/DTXITH5hCEP4G5GZ0D598RhbC+xqModk8+2c/VLFGFECjgpFMzPhF1yX?= =?utf-8?q?X4dr1giSUjvIrRfaPagBu56Q2i70UXFiJOHVGDeU2wGsOA8dayw6/3IO43RM6g8C6?= =?utf-8?q?ei461z0mKWI5wumSvAbriQN/8yYqpdLB2sWsIQHVieCVSTROaZOBHaPu+4wDGlbgD?= =?utf-8?q?J9sz/S/2AIfZ4rP3oYrqOIsjNRn5YGW+3pZvhk+WDRvUu0DNpiKXTbIaJwArFa+sb?= =?utf-8?q?REZ/gXfAUhmRrOIpgAMfI4/bXEGlqQ63JVOXE5ac+iP4QuO2FZ3+2VpDw2UyZmiT4?= =?utf-8?q?yPYDia7iK3jXalltMNZlFVpyiDQLJSvyqY/IErj8CMbh9WY4qx3pAUy4urnUScNjJ?= =?utf-8?q?YX/pGx9CyfzSUFzvp5mImnaUHo8oaNJzGTOTg2Zh3Ill9HbSYiDK6A7SvVczP1JcE?= =?utf-8?q?9v56wPTH7Giin+qf07qfH0GWpCF2Tc64B3p9F0yk3WEiqHDsaPVQ77Z5spO7yLLC7?= =?utf-8?q?ByBBueP01aOfbUKHWD7jcXDeQ2koA+fB6MSvm39JIC20jUOAyemamZI=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);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?dQAsjKIox14T0KJkBRsjMNhtqVlw?= =?utf-8?q?ygkoV1A+hfEFcgocia8nwGWtvaMsblFen1m/KytGKK+UH3rAvTloaIjF/TleuwUuP?= =?utf-8?q?8VNMvEWONejGbhlA4LyHmLz65Dhca0QKRaOCg592mb0tTLI5F+6aWb7pZ43X6HPst?= =?utf-8?q?BHQQZqi3kZ3B8yhZyaUaGF/zTM3PfJhzfjm2YQnLsy1on3mmIU7f/2waLrguLWZYW?= =?utf-8?q?Odp//H6Q/ovTXC3huAT+NgdQNtpCdwosLdqCpPisNrZPjwqLlral3m+xoCQYpIMPu?= =?utf-8?q?4m/0F1M1+b787d9xnZqFbUC2v7h+UPhJqQqGxjg6ztnX0JbQRzFk2Haz9nuzkvZe3?= =?utf-8?q?D5S6IuDHHq1OjV7TyUzRdiQXRbHstAiiOyK5oN29zgwZ9+vvoHhxh+dEarN3XwB7U?= =?utf-8?q?9TDLth1spCSCAp5wsQ+d5TNE7SCAEy2Zwj7552337dSxbbZ5UPbVBcUhNXIJAkXPI?= =?utf-8?q?4KmLrU8O3yHWsCAvmXAqUQB9BOWgpSoEpOunTnv+x5UjlFaa8kyX/uZ9KP+keAS4w?= =?utf-8?q?3JhtQ42ZPNNJZ422Uh2vPH6jZWrupAAFUQd1McyyLdZYu/xf1vLQ6GAbt8W7aSGa+?= =?utf-8?q?DDx8PVWc/U4FY6ayZGGlJwSqdqi2NR6hCl3DgBDLyDE0HYs8ub+IKnujsCcGOy2Zy?= =?utf-8?q?r1yrILJ2gbgGJFS7hvogWzWszcrtiegIpaLwU1x+8TWDcrv69xcZ94Sq/7DVi9HVY?= =?utf-8?q?u8O8arEbjEML15i51D5SyCuleilJNtYhWBOzZsy3v3YpDEnQXwDbOoT6VJQDPic5W?= =?utf-8?q?FfGDA9CjPrLiOdpJeC/34gZZV3HjRVitBAVE/ZbCbHJlKlFnEQGqAag/lSVTqMRjx?= =?utf-8?q?HnWXZJh8vJyY7AGFdkbDt32zCIPzR8ACwMtbePTDOvL1hDbi5Mag33jOqoDoGTO/A?= =?utf-8?q?NO6KM5oD70JGq07PxGNVwTAZ4AcYe1gzbUUDilA/SIKz1BciLwcgAyogTXBED9I14?= =?utf-8?q?5CTFcYh1HZQ/B4y33GRpdYpI89JiOqjFOvxS3u8pzAeweiz9fwslrqR0bAyEd/NSA?= =?utf-8?q?H6nfAKEJqtC1zw04Y6yfHB/9xaMnFnYUzFLwX/rrPGPP0btPQO6JUe/gp5y3U0vHc?= =?utf-8?q?ju/Yj3DgDh8p/3gwZirPe6PO3M7F+uhYD+8gpBEX+N7V0ykttM+MUfSFi1tWlhbIQ?= =?utf-8?q?P4P7BlyAIKsApHtZQFm2D92yjlYWz3Na7lFCcuNVerrC9pBZXKRtxUc8sjmy9AcP9?= =?utf-8?q?iDWgKkMEAPXlwMrBKGKTnLv001jiTmYtSi902MJJE7+ORywRsICY1+7r1l9McZJjL?= =?utf-8?q?dRucw6YWPhhHq0gSi9vXaSPNm6KV/nkV33ITMvh8pWs+qDy9p9O8u4ycqI/X71aI6?= =?utf-8?q?2TK9Wars2uIytv7DbtmyOq0ekRVWjLFRhh1hHPRJNC0E6NnQoB65Nb0Q85ZkaTpCW?= =?utf-8?q?fCKH2J5eBEnWB9Ehx+L/6GRo0pI0wLCk+x+dieUcU+n1lhbP8UWHVIcoiGQUfM5cF?= =?utf-8?q?OcPQ/b2UYf8KBq7+DF3Npi3axRaLc20WaASvYXa6Rm6uLoyQA2g8HOki0Gn/FylJ+?= =?utf-8?q?4l+CsbwiRdgy?= X-MS-Exchange-CrossTenant-Network-Message-Id: c2f675ad-17fe-41b2-677c-08dd7adde49b 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:40.0309 (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: kelD7U839Yywf5JHmsZ1KSiBTXiN4/BIU6u2/ty187CxkRUZ2sJa4xPWBslwWkK8tiQJI3qhY67eXU1AKMt+nw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR11MB7003 X-OriginatorOrg: intel.com DCD regions have 0 or more extents. The ability to list those and their properties is useful to end users. Add an option for extent output to region queries. An example of this is: $ ./build/cxl/cxl list -r 8 -Nu { "region":"region8", ... "type":"dc", ... "extents":[ { "offset":"0x10000000", "length":"64.00 MiB (67.11 MB)", "tag":"00000000-0000-0000-0000-000000000000" }, { "offset":"0x8000000", "length":"64.00 MiB (67.11 MB)", "tag":"00000000-0000-0000-0000-000000000000" } ] } Signed-off-by: Ira Weiny --- Changes: [iweiny: s/tag/uuid/] --- Documentation/cxl/cxl-list.txt | 29 ++++++++++++++++++++++++++ cxl/filter.h | 3 +++ cxl/json.c | 47 ++++++++++++++++++++++++++++++++++++++++++ cxl/json.h | 3 +++ cxl/list.c | 3 +++ util/json.h | 1 + 6 files changed, 86 insertions(+) diff --git a/Documentation/cxl/cxl-list.txt b/Documentation/cxl/cxl-list.txt index 9a9911e7dd9b..82e703620136 100644 --- a/Documentation/cxl/cxl-list.txt +++ b/Documentation/cxl/cxl-list.txt @@ -411,6 +411,35 @@ OPTIONS } ---- +-N:: +--extents:: + Append Dynamic Capacity extent information. +---- +13:34:28 > ./build/cxl/cxl list -r 8 -Nu +{ + "region":"region8", + "resource":"0xf030000000", + "size":"512.00 MiB (536.87 MB)", + "type":"dc", + "interleave_ways":1, + "interleave_granularity":256, + "decode_state":"commit", + "extents":[ + { + "offset":"0x10000000", + "length":"64.00 MiB (67.11 MB)", + "uuid":"00000000-0000-0000-0000-000000000000" + }, + { + "offset":"0x8000000", + "length":"64.00 MiB (67.11 MB)", + "uuid":"00000000-0000-0000-0000-000000000000" + } + ] +} +---- + + -r:: --region:: Specify CXL region device name(s), or device id(s), to filter the listing. diff --git a/cxl/filter.h b/cxl/filter.h index 956a46e0c7a9..a31b80c87cca 100644 --- a/cxl/filter.h +++ b/cxl/filter.h @@ -31,6 +31,7 @@ struct cxl_filter_params { bool alert_config; bool dax; bool media_errors; + bool extents; int verbose; struct log_ctx ctx; }; @@ -91,6 +92,8 @@ static inline unsigned long cxl_filter_to_flags(struct cxl_filter_params *param) flags |= UTIL_JSON_DAX | UTIL_JSON_DAX_DEVS; if (param->media_errors) flags |= UTIL_JSON_MEDIA_ERRORS; + if (param->extents) + flags |= UTIL_JSON_EXTENTS; return flags; } diff --git a/cxl/json.c b/cxl/json.c index 79b2b527f740..0c47550ff440 100644 --- a/cxl/json.c +++ b/cxl/json.c @@ -1164,6 +1164,50 @@ void util_cxl_mappings_append_json(struct json_object *jregion, json_object_object_add(jregion, "mappings", jmappings); } +void util_cxl_extents_append_json(struct json_object *jregion, + struct cxl_region *region, + unsigned long flags) +{ + struct json_object *jextents; + struct cxl_region_extent *extent; + + jextents = json_object_new_array(); + if (!jextents) + return; + + cxl_extent_foreach(region, extent) { + struct json_object *jextent, *jobj; + unsigned long long val; + char uuid_str[40]; + uuid_t uuid; + + jextent = json_object_new_object(); + if (!jextent) + continue; + + val = cxl_extent_get_offset(extent); + jobj = util_json_object_hex(val, flags); + if (jobj) + json_object_object_add(jextent, "offset", jobj); + + val = cxl_extent_get_length(extent); + jobj = util_json_object_size(val, flags); + if (jobj) + json_object_object_add(jextent, "length", jobj); + + cxl_extent_get_uuid(extent, uuid); + uuid_unparse(uuid, uuid_str); + jobj = json_object_new_string(uuid_str); + if (jobj) + json_object_object_add(jextent, "uuid", jobj); + + json_object_array_add(jextents, jextent); + json_object_set_userdata(jextent, extent, NULL); + } + + json_object_object_add(jregion, "extents", jextents); +} + struct json_object *util_cxl_region_to_json(struct cxl_region *region, unsigned long flags) { @@ -1250,6 +1294,9 @@ struct json_object *util_cxl_region_to_json(struct cxl_region *region, } } + if (flags & UTIL_JSON_EXTENTS) + util_cxl_extents_append_json(jregion, region, flags); + if (cxl_region_qos_class_mismatch(region)) { jobj = json_object_new_boolean(true); if (jobj) diff --git a/cxl/json.h b/cxl/json.h index eb7572be4106..f9c07ab41a33 100644 --- a/cxl/json.h +++ b/cxl/json.h @@ -20,6 +20,9 @@ struct json_object *util_cxl_region_to_json(struct cxl_region *region, void util_cxl_mappings_append_json(struct json_object *jregion, struct cxl_region *region, unsigned long flags); +void util_cxl_extents_append_json(struct json_object *jregion, + struct cxl_region *region, + unsigned long flags); void util_cxl_targets_append_json(struct json_object *jdecoder, struct cxl_decoder *decoder, const char *ident, const char *serial, diff --git a/cxl/list.c b/cxl/list.c index 0b25d78248d5..47d135166212 100644 --- a/cxl/list.c +++ b/cxl/list.c @@ -59,6 +59,8 @@ static const struct option options[] = { "include alert configuration information"), OPT_BOOLEAN('L', "media-errors", ¶m.media_errors, "include media-error information "), + OPT_BOOLEAN('N', "extents", ¶m.extents, + "include extent information (Dynamic Capacity regions only)"), OPT_INCR('v', "verbose", ¶m.verbose, "increase output detail"), #ifdef ENABLE_DEBUG OPT_BOOLEAN(0, "debug", &debug, "debug list walk"), @@ -135,6 +137,7 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx *ctx) param.decoders = true; param.targets = true; param.regions = true; + param.extents = true; /*fallthrough*/ case 0: break; diff --git a/util/json.h b/util/json.h index 560f845c6753..79ae3240e7ce 100644 --- a/util/json.h +++ b/util/json.h @@ -21,6 +21,7 @@ enum util_json_flags { UTIL_JSON_TARGETS = (1 << 11), UTIL_JSON_PARTITION = (1 << 12), UTIL_JSON_ALERT_CONFIG = (1 << 13), + UTIL_JSON_EXTENTS = (1 << 14), }; void util_display_json_array(FILE *f_out, struct json_object *jarray, From patchwork Sun Apr 13 22:53:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 14049482 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 3C8001F429C for ; Sun, 13 Apr 2025 22:52:46 +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=1744584768; cv=fail; b=jXq2ZVs67sBkb2XJzs7zn2uvwRFI722XVc5uw0A8YN72DUWzp4HLR9c+nOKATi19fMC6NMF/CVfa8CznnW7J+aIMT1JOAVNPBNPdp2NuPW2M496nP99aOLpRpiCmQemKS8y2FQnE0CUvFd/B+JtsmEMEGTAy0B0p2inQmXCKVEw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744584768; c=relaxed/simple; bh=vCsTE83fdNfeVNuwKX2KWw7xMLNX9HXu9+6894nCXTY=; h=From:Date:Subject:Content-Type:Message-ID:References:In-Reply-To: To:CC:MIME-Version; b=JR9XkwWWiwjxuqKMqma50GlE27Uw2oKOwIjIq8k5g+Z89/Y7QsLn32C/WKIJSKnioVj6Z6Urnb4VSX6di2S9BsEaNsuYSKhWL2sCax1zTWS9Fh9n3H9x/9ufId3uOCc6r8wwh6tMxgeMiCzan2v9KPNf3Ax6g0NpMsEM6GJ/jJk= 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=ZawyZVti; 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="ZawyZVti" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1744584766; x=1776120766; h=from:date:subject:content-transfer-encoding:message-id: references:in-reply-to:to:cc:mime-version; bh=vCsTE83fdNfeVNuwKX2KWw7xMLNX9HXu9+6894nCXTY=; b=ZawyZVtiodKRzBMIjz1bpEuqtm5W6PUEpG647YgzwUzBseWvWDUsqYHK ONs0o6wlDzKUCQqfjip+KRpEQRg/vM/nKaPwFd3wWQdsi/iLDX4HErrfs g3HYC42oCOiGkAaY1qon9xjB90PRo05rQAZD/b5tdDXX5sJyAuwmA9Da2 RprQe524eB/8vqtvIve8VIP0WzNFEnq7D+0BsoHeGNU5U7G18zagPLEvB zZ2AiSilLQkdD3ZjXOzsBM4GjRLkPTRmp3oXMobmJ28j0qK32PxkE1AYw 6Q9PxOo+gWEWOwhiKvTCE4GX1tI2CPhw/EiyiF2gc05AWnK3y5/BoREIE A==; X-CSE-ConnectionGUID: SL6BZ4YITLmmBR1OqyIpig== X-CSE-MsgGUID: CQ6Pr88oRimpbrE0/NX9hw== X-IronPort-AV: E=McAfee;i="6700,10204,11402"; a="71431167" X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="71431167" 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:46 -0700 X-CSE-ConnectionGUID: F2G9Je9rTn+w8FxK6WfK1g== X-CSE-MsgGUID: HBGtTI9aTxeMZWogxlrECw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.15,211,1739865600"; d="scan'208";a="134405604" 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:46 -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:45 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) 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:45 -0700 Received: from NAM02-BN1-obe.outbound.protection.outlook.com (104.47.51.40) by edgegateway.intel.com (134.134.137.100) 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:44 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IC2v5MEbGQ+8ubPCDsFY5wd2vpVQ6A6BwWQSIvOA9EHAa3PMKFD5MvG/IYOm2i7oEhrtaSMCqhHuDL9EuxwAiyI7Aom4cdoNJFxVMAfV+JFbNZPDdiO4UdUtp7pnbM50Zv6AH5xYFRn7szXObGBo1/evFuRKDPYsqJVjOQMnWuDXkETwVsdQ6Sm5PwBpfkET2MY9rfyluyhQaF9fde2/gEhO3KTMt4u1/8IvK9pHnM479/ytyIe7wTbPqWgBfmelaNmm0auXt8EhhVEVivV1xt7mDWLg2jY5xfK5dRpNrkL0ZpoOocvq/4KT7WW66LoC6iG9TUcshIEAwBzCiMKhig== 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=eOKhk80tXgP6EzR0094AIo7xPG4XqMMt8BhS/YWgFlo=; b=SJsKqJ4ccay4Xhy8/M3JT5nggnTxtiQVGxB3lyuxL2jfu7CJ7TckI2lJOZHWIc5SPa+Fnq+0hdI04RT8mpEwAmcAxCBhYsMo80J+4ZBHr0hq+k03Hl5/RgBMrDwRc5PnWmj3lx5mBKtMeV/gYiTj15XXNN2A8AjhD5MvyOAjSSMYcTyF7l4c9aIl4Akf67QaLenmPqxRJctgob7p9LckkJuusN9umUJIcE92MrSQF3EBfRPoRT8xJxA+Ob3l6Jg3EWVu/b8w0ICZuaCQjJ3jMiEy86zVLDS271n15hclRqI3GVdLFJtdCfJruCxQYMfv+9kdx8iLIrBCgKi3XAdt9g== 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:41 +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:41 +0000 From: Ira Weiny Date: Sun, 13 Apr 2025 17:53:02 -0500 Subject: [ndctl PATCH v5 5/5] cxl/test: Add Dynamic Capacity tests Message-ID: <20250413-dcd-region2-v5-5-fbd753a2e0e8@intel.com> References: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> In-Reply-To: <20250413-dcd-region2-v5-0-fbd753a2e0e8@intel.com> To: Alison Schofield CC: Vishal Verma , Jonathan Cameron , Fan Ni , Sushant1 Kumar , Dan Williams , "Dave Jiang" , , , Ira Weiny X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1744584788; l=29343; i=ira.weiny@intel.com; s=20221211; h=from:subject:message-id; bh=vCsTE83fdNfeVNuwKX2KWw7xMLNX9HXu9+6894nCXTY=; b=jDbeHZLOJUkkCjWKhriHP+21cJvAfQpDmP5nx+giMDTc/dgfrr/63aW/mqXrmmQATy2xpneIM dZ/pII65z5rDA3N7S74t/os6JqY50HASXQYzu0cVLB3m3gXunkfYScY X-Developer-Key: i=ira.weiny@intel.com; a=ed25519; pk=noldbkG+Wp1qXRrrkfY1QJpDf7QsOEthbOT7vm0PqsE= X-ClientProxiedBy: MW2PR2101CA0016.namprd21.prod.outlook.com (2603:10b6:302:1::29) 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: e3376a59-4b85-4f7a-4907-08dd7adde586 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?utf-8?q?VhAvTWJcAXZgucOnDJkxx4EQ4DMsh53?= =?utf-8?q?oQ/TpDrJutA/5tJrnccl5n8zm0Sz4guzxhMuT1xprobwkjBl3h/z643jsTLtw3jgy?= =?utf-8?q?FH9cyNw8rOXZ7N4PgwnSYwcPzt3B+Tv0PBHOyCfhsmfOktHQRUV3tr141dVNlGs3x?= =?utf-8?q?SujV/KUK1v4y5v1MpRYb5FHyorFfcAAuqNpCknBpIO/z4uyEwVq7lhgh+XQmSecYB?= =?utf-8?q?ioI+orm04+NIhq35XeuHQAMbpmbPdc0EPQdw5Ts8JVW2TTI6c1RFX6p1fJxjGP/iX?= =?utf-8?q?p+MqRkvFY/X2OUQSY576jVgVd2RyzRJZoFVU/+LCWNr3zqxzBUnGe+2zFutXH1dPB?= =?utf-8?q?SEHOikvMfzmjlS05EWqMjWVHXzLBZcON57kSRh8BstF7Bxz2jLSRaCf/KsmBXsvJ9?= =?utf-8?q?9AWP+1eA0wnx9LLRKWJ/Q6kkgJnNDIXuo2h/oByWRTR+J/dWjMgnKNaZ7lw8OCfdX?= =?utf-8?q?Xk2yrki/I+4r8Tu5rPAoIZBX6nVnDSkxS9bEfZgWpEQgsrcCKgGJ5GB4VHtUOQEfp?= =?utf-8?q?h6xllPWzaXkrVOR1plIsVq6FQCI6vkCcTQS7/qZRQhN3MYwLqYSPGDeWeYAMmh4r/?= =?utf-8?q?5yRMKtn0h3pAGGmNI898HsIWKf6SMtJGqHuvECXWtHZGF9hp23CrCQHsALcIybcGF?= =?utf-8?q?PGnwJXZicKYYx2xssCMwbj1N6Vnk1sWiObtCF4yswtODAgPClJddSncw1FTyQ3PuJ?= =?utf-8?q?HgESL8kSfu9wCKZSMUod8b+ymOaDHui+snvFECpe2q1yC0N1CtmhEUdwpTpIo/skH?= =?utf-8?q?A7/67jxBOwbY39khnIirptptMYrmUqsgK8W9f3mlffrFPZe/4AdLb/pbFAy21u1Y1?= =?utf-8?q?SMNNBHjbjeC4UOXV2ofOJMurPFhkJS1y1DPMG7ZPmbxJJNgn+/Mm9dHKA7Mgr1Ktk?= =?utf-8?q?1iByhcZCEIAcfZ2OMR3seDAW7yh7s2pBOqbxP7QHY1CKYR/dQMoDccK0vgMFF4dFo?= =?utf-8?q?jpccK1kbsOxFKv44Dv95G/9KOy1F/hEeJp0+iVqfXSuQbQGRXototWwW0tM7wdqMq?= =?utf-8?q?w5AiQzm5QT9Xy0Rt6B1RN7lkL6F/s4Fo/sdR5bp+aHHRO1xFBbl5+qMQxTjLRUR8V?= =?utf-8?q?gARRYaQQ8RXUle4Q/R5094NEUf+ic+2GKf3wludn4g3w4igKxLnhpa2e9mvtPuZEa?= =?utf-8?q?gXVxGzWWv+sKUW+BT+TuVRCfT/Sbu5zb4pg22gv1OtPH3zLIOvX451RhmVTiXTl2c?= =?utf-8?q?RX1ZclLFoM4NBdFek7Kq3Hx3nT+NKgqIfbJNfKcvl/ZdlSaSPCRpteR9p+eeZ3pJ3?= =?utf-8?q?zVxYDpb4wOkeIOnCnPhEEOIXW9/o1vF5UkMQ8N0JxXaQ3sXcuWO0tuokdXq3MXRny?= =?utf-8?q?f7NuU/bHy3whzKzKaSdPwGzlOGM8qQXJE7zB0Nnat3TrgHeU3OEHcN4=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);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?VtHY5DEMInzZfs+DoU1NE5zCbqLi?= =?utf-8?q?606MXrkGVGl1byEKKh042Vq9V3qwYHisTzqoeRlGzRKgDvYcic7hJjzkqTQR9zMmN?= =?utf-8?q?Rr6fxD7w7IVNxj5V+hK4OuZ1Nso+4db2E1w8Bw2RJEwgd2FoOhi4cPVQI+MeDZIQ6?= =?utf-8?q?5mXKlUdYEUQC1v5xZYDW6k7VWon8skexpRUn6gpSUkwaL2g/Hv2++r0IZZ3OCUpzQ?= =?utf-8?q?trnE7bbpJWU0GvA4q6UW1BjhA6tnlYvXoD1BZWvsUf1Y5eehBfscsjgrZNyLUX+wz?= =?utf-8?q?nVjv+KyOM6POh+1qZaXAvErALL9xZrxbJkB0S7ibHOHUt/sOFwA2P6WrxAB+k1LYi?= =?utf-8?q?fR7zVJtMlhRh8l4SrdOdOdqwS+KouKc/M221DXwWnIzizdxdszOg1UkBFQ2wEzENn?= =?utf-8?q?z66kneWD14c+ccnIx5S+1DyLhpd2qbLKBRMnMq5gsj+du1I0ec36c3ZQhDVDR9ohR?= =?utf-8?q?LvAKj5Z3/Konyn8URYjdjAGwZ/D1T3DhTaNzQVRRcdeE9MRQvVwV/2SpkoFzc09gt?= =?utf-8?q?h7HiIjvQhCcFsTVfPaG6PgElVRjlJajc3dXu0CHWtRFCGXGi4ZeBHn53OxI5RUnzN?= =?utf-8?q?9wfic8e+86V/Ds//nzg1pbqsJKcSKudKPJ7CrRK8inC/qAcvxh+QNcf9Ue2s2B90a?= =?utf-8?q?X4xEI5A6D4L7fqkTvgcDQD8pBmImH9OvAG9HUXXG/Ew4UqFl3AHdTR4kQI+f1VgbB?= =?utf-8?q?mLUXUBznWH6TBLGEXN7oa50f5VxwRp5V8MQiVsdSSMru/V5pfIyMEUSMfwe5wqpWV?= =?utf-8?q?HT5XbMdiS+H4iMlMdSuuEQ5vlojn2txjd5Xe7VSkold1p4LIZIJsuJ5hmyN2cjFuf?= =?utf-8?q?21nCTdU9aKj7O0+Reck+1OMMA5Gfggq3bpLNRyeXh1UJPwhs/DHR9wK0hG0vGG9iK?= =?utf-8?q?26pFLTMjhzcSM+cdFg2c91/WkA10rvZwSUbEViWyrPr6xEiFNk9JhGQVOsu3rQwLY?= =?utf-8?q?aFKSDnqVfH23v8BgCuBlP/cTIB6ljvW9CocO9WSVsPIBprgfcnq28kbDSYpGZPgjE?= =?utf-8?q?i/bowmrCWMygpcYld4Thaxdk+ih7CfZkW2YFJe1tDyZ5nZMI0d5xHR/qwrOlyxG/A?= =?utf-8?q?NVxJgbNCil0ZSujphqEp2wCj4XsUdv+GCV/SyPD5byK0uNh36HacMeyJUbXRE7bML?= =?utf-8?q?Tc6iLRjfUpdaUvQ7hUxqIfFHrGoXJp1lHW7ssBTnL3iEOFor+y6zGDSRENFD7ct01?= =?utf-8?q?BHB4jUpQMN56aTQ4aA2OaI0XnfJq9hgKcYhYrqHO48zpv8znA4vzbAYk/iTLFRS7w?= =?utf-8?q?+5N/zRh9czXn6pImt6OvjVqy5COYSavFbEk4wUaKz5xrym3qCOQDRBZ7KOOVZxW1+?= =?utf-8?q?7k2kxCGJoBs1ZAXbqH/R6Z2P4gneoxG8n1jUtlNPcDc+KSG91NV0nbP60wS2jbYpO?= =?utf-8?q?ndiKF0gJxg6rYNgbL8RFblDitBoSk4GUMg9I9nfhpaHhLjjqKUpOKdWUK0AYh2niC?= =?utf-8?q?XTpHTi07jxbfbMJq9zKwPi+bhVWxOimDRoYahvKD+HIuRfU4/hxsVZKO/JkAjoyo7?= =?utf-8?q?XKKm/2S/9A5j?= X-MS-Exchange-CrossTenant-Network-Message-Id: e3376a59-4b85-4f7a-4907-08dd7adde586 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:41.5482 (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: 4UjiXWa32eojzNvKpTuRG1adQY59z1PTgUaFvSMopSNg3cMf/jsGVYunjDZWHLEALZfGvDhqcDVvB0tS9d5k/w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR11MB7003 X-OriginatorOrg: intel.com cxl_test provides a good way to ensure quick smoke and regression testing. The complexity of DCD and the new sparse DAX regions required to use them benefits greatly with a series of smoke tests. The only part of the kernel stack which must be bypassed is the actual irq of DCD events. However, the event processing itself can be tested via cxl_test calling directly into the event processing. In this way the rest of the stack; management of sparse regions, the extent device lifetimes, and the dax device operations can be tested. Add Dynamic Capacity Device tests for kernels which have DCD support. Signed-off-by: Ira Weiny --- Changes: [iweiny: Fix checks for dax devices] [iweiny: Fix documentation on tests] [iweiny: remove second DCD partition testing; use only dynamic_ram_a] --- test/cxl-dcd.sh | 863 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/meson.build | 2 + 2 files changed, 865 insertions(+) diff --git a/test/cxl-dcd.sh b/test/cxl-dcd.sh new file mode 100644 index 000000000000..c83d5e4f172a --- /dev/null +++ b/test/cxl-dcd.sh @@ -0,0 +1,863 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2024 Intel Corporation. All rights reserved. + +. "$(dirname "$0")/common" + +rc=77 +set -ex + +trap 'err $LINENO' ERR + +check_prereq "jq" + +rc=1 + +dev_path="/sys/bus/platform/devices" +cxl_path="/sys/bus/cxl/devices" + +# a test extent tag +test_tag=dc-test-tag + +# +# The test devices have 2G of non DC capacity. A single DC reagion of 1G is +# added beyond that. +# +# The testing centers around 3 extents. Two are "pre-existing" on test load +# called pre-ext and pre2-ext. The other is created within this script alone +# called base. + +# +# | 2G non- | DC region (1G) | +# | DC cap | | +# | ... |-------------------------------------------------------| +# | |--------| |----------| |----------| | +# | | (base) | |(pre-ext) | |(pre2-ext)| | + +dra_size="" + +base_dpa=0x80000000 + +# base extent at dpa 2G - 64M long +base_ext_offset=0x0 +base_ext_dpa=$(($base_dpa + $base_ext_offset)) +base_ext_length=0x4000000 + +# pre existing extent base + 128M, 64M length +# 0x00000088000000-0x0000008bffffff +pre_ext_offset=0x8000000 +pre_ext_dpa=$(($base_dpa + $pre_ext_offset)) +pre_ext_length=0x4000000 + +# pre2 existing extent base + 256M, 64M length +# 0x00000090000000-0x00000093ffffff +pre2_ext_offset=0x10000000 +pre2_ext_dpa=$(($base_dpa + $pre2_ext_offset)) +pre2_ext_length=0x4000000 + +mem="" +bus="" +device="" +decoder="" + +# ======================================================================== +# Support functions +# ======================================================================== + +create_dcd_region() +{ + mem="$1" + decoder="$2" + reg_size_string="" + if [ "$3" != "" ]; then + reg_size_string="-s $3" + fi + + # create region + rc=$($CXL create-region -t dynamic_ram_a -d "$decoder" -m "$mem" ${reg_size_string} | jq -r ".region") + + if [[ ! $rc ]]; then + echo "create-region failed for $decoder / $mem" + err "$LINENO" + fi + + echo ${rc} +} + +check_region() +{ + search=$1 + region_size=$2 + + result=$($CXL list -r "$search" | jq -r ".[].region") + if [ "$result" != "$search" ]; then + echo "check region failed to find $search" + err "$LINENO" + fi + + result=$($CXL list -r "$search" | jq -r ".[].size") + if [ "$result" != "$region_size" ]; then + echo "check region failed invalid size $result != $region_size" + err "$LINENO" + fi +} + +check_not_region() +{ + search=$1 + + result=$($CXL list -r "$search" | jq -r ".[].region") + if [ "$result" == "$search" ]; then + echo "check not region failed; $search found" + err "$LINENO" + fi +} + +destroy_region() +{ + local region=$1 + $CXL disable-region $region + $CXL destroy-region $region +} + +inject_extent() +{ + device="$1" + dpa="$2" + length="$3" + tag="$4" + + more="0" + if [ "$5" != "" ]; then + more="1" + fi + + echo ${dpa}:${length}:${tag}:${more} > "${dev_path}/${device}/dc_inject_extent" +} + +remove_extent() +{ + device="$1" + dpa="$2" + length="$3" + + echo ${dpa}:${length} > "${dev_path}/${device}/dc_del_extent" +} + +create_dax_dev() +{ + reg="$1" + + dax_dev=$($DAXCTL create-device -r $reg | jq -er '.[].chardev') + + echo ${dax_dev} +} + +fail_create_dax_dev() +{ + reg="$1" + + set +e + result=$($DAXCTL create-device -r $reg) + set -e + if [ "$result" == "0" ]; then + echo "FAIL device created" + err "$LINENO" + fi +} + +shrink_dax_dev() +{ + dev="$1" + new_size="$2" + + $DAXCTL disable-device $dev + $DAXCTL reconfigure-device $dev -s $new_size + $DAXCTL enable-device $dev +} + +destroy_dax_dev() +{ + dev="$1" + + $DAXCTL disable-device $dev + $DAXCTL destroy-device $dev +} + +check_dax_dev() +{ + search="$1" + size=$(($2)) + + result=$($DAXCTL list -d $search | jq -er '.[].chardev') + if [ "$result" != "$search" ]; then + echo "check dax device failed to find $search" + err "$LINENO" + fi + result=$($DAXCTL list -d $search | jq -er '.[].size') + if [ "$result" -ne "$size" ]; then + echo "check dax device failed incorrect size $result; exp $size" + err "$LINENO" + fi +} + +# check that the dax device is not there. +check_not_dax_dev() +{ + reg="$1" + search="$2" + result=$($DAXCTL list -r $reg -D | jq -r '.[].chardev') + if [ "$result" == "$search" ]; then + echo "FAIL found $search" + err "$LINENO" + fi +} + +check_extent() +{ + region=$1 + offset=$(($2)) + length=$(($3)) + + result=$($CXL list -r "$region" -N | jq -r ".[].extents[] | select(.offset == ${offset}) | .length") + if [[ $result != $length ]]; then + echo "FAIL region $1 could not find extent @ $offset ($length)" + err "$LINENO" + fi +} + +check_extent_cnt() +{ + region=$1 + count=$(($2)) + + result=$($CXL list -r $region -N | jq -r '.[].extents[].offset' | wc -l) + if [[ $result != $count ]]; then + echo "FAIL region $1: found wrong number of extents $result; expect $count" + err "$LINENO" + fi +} + + +# ======================================================================== +# Tests +# ======================================================================== + +# testing pre existing extents must be called first as the extents were created +# by cxl-test being loaded +test_pre_existing_extents() +{ + echo "" + echo "Test: pre-existing extent" + echo "" + region=$(create_dcd_region ${mem} ${decoder}) + + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + # | | |----------| |----------| | + # | | |(pre-ext) | |(pre2-ext)| | + check_region ${region} ${dra_size} + # should contain pre-created extents + check_extent ${region} ${pre_ext_offset} ${pre_ext_length} + check_extent ${region} ${pre2_ext_offset} ${pre2_ext_length} + + dax_dev=$(create_dax_dev ${region}) + ext_sum_length="$(($pre_ext_length + $pre2_ext_length))" + check_dax_dev ${dax_dev} $ext_sum_length + destroy_dax_dev ${dax_dev} + + remove_extent ${device} $pre_ext_dpa $pre_ext_length + # | | |----------| | + # | | |(pre2-ext)| | + remove_extent ${device} $pre2_ext_dpa $pre2_ext_length + # | | | + # | | | + check_extent_cnt ${region} 0 + destroy_region ${region} + check_not_region ${region} +} + +test_remove_extent_under_dax_device() +{ + # Remove the pre-created test extent out from under dax device + # stack should hold ref until dax device deleted + echo "" + echo "Test: Remove extent from under DAX dev" + echo "" + + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + # | | | + # | | | + + + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + # | | |----------| | + # | | |(pre-ext) | | + check_extent ${region} ${pre_ext_offset} ${pre_ext_length} + + dax_dev=$(create_dax_dev ${region}) + # | | |----------| | + # | | |(pre-ext) | | + # | | | daxX.1 | | + check_extent_cnt ${region} 1 + remove_extent ${device} $pre_ext_dpa $pre_ext_length + # In-use extents are not released. + check_dax_dev ${dax_dev} $pre_ext_length + + check_extent_cnt ${region} 1 + destroy_dax_dev ${dax_dev} + # | | |----------| | + # | | |(pre-ext) | | + check_not_dax_dev ${region} ${dax_dev} + + check_extent_cnt ${region} 1 + # Remove after use + remove_extent ${device} $pre_ext_dpa $pre_ext_length + # | | | + # | | | + check_extent_cnt ${region} 0 + destroy_region ${region} + check_not_region ${region} +} + +test_remove_extents_in_use() +{ + echo "" + echo "Test: Remove extents under sparse dax device" + echo "" + remove_extent ${device} $base_ext_dpa $base_ext_length + check_extent_cnt ${region} 2 + remove_extent ${device} $pre_ext_dpa $pre_ext_length + check_extent_cnt ${region} 2 +} + +test_create_dax_dev_spanning_two_extents() +{ + echo "" + echo "Test: Create dax device spanning 2 extents" + echo "" + + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + check_extent ${region} ${pre_ext_offset} ${pre_ext_length} + # | | |----------| | + # | | |(pre-ext) | | + inject_extent ${device} $base_ext_dpa $base_ext_length "" + check_extent ${region} ${base_ext_offset} ${base_ext_length} + # | |--------| |----------| | + # | | (base) | |(pre-ext) | | + + check_extent_cnt ${region} 2 + dax_dev=$(create_dax_dev ${region}) + # | |--------| |----------| | + # | | (base) | |(pre-ext) | | + # | | daxX.1 | | daxX.1 | | + + echo "Checking if dev dax is spanning sparse extents" + ext_sum_length="$(($base_ext_length + $pre_ext_length))" + check_dax_dev ${dax_dev} $ext_sum_length + + test_remove_extents_in_use + + destroy_dax_dev ${dax_dev} + check_not_dax_dev ${region} ${dax_dev} + + # In-use extents were not released. Check they can be removed after the + # dax device is removed. + check_extent_cnt ${region} 2 + remove_extent ${device} $base_ext_dpa $base_ext_length + remove_extent ${device} $pre_ext_dpa $pre_ext_length + check_extent_cnt ${region} 0 + destroy_region ${region} + check_not_region ${region} +} + +test_inject_tag_support() +{ + echo "" + echo "Test: inject without/with tag" + echo "" + + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + check_extent ${region} ${pre_ext_offset} ${pre_ext_length} + inject_extent ${device} $base_ext_dpa $base_ext_length "ira" + + # extent with tag should be rejected + check_extent_cnt ${region} 1 + remove_extent ${device} $pre_ext_dpa $pre_ext_length + check_extent_cnt ${region} 0 + + destroy_region ${region} + check_not_region ${region} +} + +test_partial_extent_remove () +{ + echo "" + echo "Test: partial extent remove" + echo "" + + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + + inject_extent ${device} $base_ext_dpa $base_ext_length "" + # | ... |-------------------------------------------------------| + # | |--------| | + # | | (base) | | + + dax_dev=$(create_dax_dev ${region}) + + # | ... |-------------------------------------------------------| + # | |--------| | + # | | (base) | | + # | | daxX.1 | | + + partial_ext_dpa="$(($base_ext_dpa + ($base_ext_length / 2)))" + partial_ext_length="$(($base_ext_length / 2))" + echo "Removing Partial : $partial_ext_dpa $partial_ext_length" + + # | | |---| | + # Partial + + remove_extent ${device} $partial_ext_dpa $partial_ext_length + # In-use extents are not released. + check_extent_cnt ${region} 1 + + # | ... |-------------------------------------------------------| + # | |--------| | + # | | (base) | | + # | | daxX.1 | | + + destroy_dax_dev ${dax_dev} + check_not_dax_dev ${region} ${dax_dev} + + # | ... |-------------------------------------------------------| + # | |--------| | + # | | (base) | | + + # Partial results in whole extent removal + check_extent_cnt ${region} 1 + remove_extent ${device} $partial_ext_dpa $partial_ext_length + # | | |---| | + # Partial + check_extent_cnt ${region} 0 + + # | ... |-------------------------------------------------------| + destroy_region ${region} + check_not_region ${region} +} + +test_multiple_extent_remove () +{ + # Test multiple extent remove + echo "" + echo "Test: multiple extent remove with single extent remove command" + echo "" + + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + inject_extent ${device} $base_ext_dpa $base_ext_length "" + # | ... |-------------------------------------------------------| + # | |--------| |-------------------| | + # | | (base) | | (pre)-existing | | + + check_extent_cnt ${region} 2 + dax_dev=$(create_dax_dev ${region}) + + # | ... |-------------------------------------------------------| + # | |--------| |-------------------| | + # | | (base) | | (pre)-existing | | + # | | daxX.1 | | daxX.1 | | + + partial_ext_dpa="$(($base_ext_dpa + ($base_ext_length / 2)))" + partial_ext_length="$(($pre_ext_dpa - $base_ext_dpa))" + echo "Removing multiple in span : $partial_ext_dpa $partial_ext_length" + # |------------------| + # Partial + remove_extent ${device} $partial_ext_dpa $partial_ext_length + + # | ... |-------------------------------------------------------| + # | |--------| |-------------------| | + # | | (base) | | (pre)-existing | | + # | | daxX.1 | | daxX.1 | | + + # In-use extents are not released. + check_extent_cnt ${region} 2 + + destroy_dax_dev ${dax_dev} + check_not_dax_dev ${region} ${dax_dev} + + # | ... |-------------------------------------------------------| + # | |--------| |-------------------| | + # | | (base) | | (pre)-existing | | + + # Remove both extents + check_extent_cnt ${region} 2 + # |------------------| + # Partial + remove_extent ${device} $partial_ext_dpa $partial_ext_length + # | ... |-------------------------------------------------------| + check_extent_cnt ${region} 0 + + destroy_region ${region} + check_not_region ${region} +} + +test_destroy_region_without_extent_removal () +{ + echo "" + echo "Test: Destroy region without extent removal" + echo "" + + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + inject_extent ${device} $base_ext_dpa $base_ext_length "" + check_extent_cnt ${region} 2 + destroy_region ${region} + check_not_region ${region} +} + +test_destroy_with_extent_and_dax () +{ + echo "" + echo "Test: Destroy region with extents and dax devices" + echo "" + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + check_extent_cnt ${region} 0 + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + # | | |----------| | + # | | |(pre-ext) | | + + check_extent_cnt ${region} 1 + dax_dev=$(create_dax_dev ${region}) + # | | | | | + check_dax_dev ${dax_dev} ${pre_ext_length} + destroy_region ${region} + check_not_region ${region} + + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + # | | | + + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + check_extent_cnt ${region} 0 + destroy_region ${region} + check_not_region ${region} +} + +test_dax_device_ops () +{ + echo "" + echo "Test: Fail sparse dax dev creation without space" + echo "" + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + # | | |-------------------| | + # | | | (pre)-existing | | + + check_extent_cnt ${region} 1 + + # | | | daxX.1 | | + + dax_dev=$(create_dax_dev ${region}) + check_dax_dev ${dax_dev} $pre_ext_length + fail_create_dax_dev ${region} + + echo "" + echo "Test: Resize sparse dax device" + echo "" + + # Shrink + # | | | daxX.1 | | + resize_ext_length=$(($pre_ext_length / 2)) + shrink_dax_dev ${dax_dev} $resize_ext_length + check_dax_dev ${dax_dev} $resize_ext_length + + # Fill + # | | | daxX.1 | daxX.2 | | + dax_dev=$(create_dax_dev ${region}) + check_dax_dev ${dax_dev} $resize_ext_length + destroy_region ${region} + check_not_region ${region} + + + # 2 extent + # create dax dev + # resize into 1st extent + # create dev on rest of 1st and all of second + # Ensure both devices are correct + + echo "" + echo "Test: Resize sparse dax device across extents" + echo "" + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + inject_extent ${device} $base_ext_dpa $base_ext_length "" + + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + # | |--------| |-------------------| | + # | | (base) | | (pre)-existing | | + + check_extent_cnt ${region} 2 + dax_dev=$(create_dax_dev ${region}) + ext_sum_length="$(($base_ext_length + $pre_ext_length))" + + # | | daxX.1 | | daxX.1 | | + + check_dax_dev ${dax_dev} $ext_sum_length + resize_ext_length=33554432 # 32MB + + # | | D1 | | + + shrink_dax_dev ${dax_dev} $resize_ext_length + check_dax_dev ${dax_dev} $resize_ext_length + + # | | D1 | D2| | daxX.2 | | + + dax_dev=$(create_dax_dev ${region}) + remainder_length=$((ext_sum_length - $resize_ext_length)) + check_dax_dev ${dax_dev} $remainder_length + + # | | D1 | D2| | daxX.2 | | + + remainder_length=$((remainder_length / 2)) + shrink_dax_dev ${dax_dev} $remainder_length + check_dax_dev ${dax_dev} $remainder_length + + # | | D1 | D2| | daxX.2 | daxX.3 | | + + dax_dev=$(create_dax_dev ${region}) + check_dax_dev ${dax_dev} $remainder_length + destroy_region ${region} + check_not_region ${region} +} + +test_reject_overlapping () +{ + echo "" + echo "Test: Rejecting overlapping extents" + echo "" + + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + + # | 2G non- | DC region | + # | DC cap | | + # | ... |-------------------------------------------------------| + # | | |-------------------| | + # | | | (pre)-existing | | + + check_extent_cnt ${region} 1 + + # Attempt overlapping extent + # + # | | |-----------------| | + # | | | overlapping | | + + partial_ext_dpa="$(($base_ext_dpa + ($pre_ext_dpa / 2)))" + partial_ext_length=$pre_ext_length + inject_extent ${device} $partial_ext_dpa $partial_ext_length "" + + # Should only see the original ext + check_extent_cnt ${region} 1 + destroy_region ${region} + check_not_region ${region} +} + +test_two_regions() +{ + echo "" + echo "Test: create 2 regions in the same DC partition" + echo "" + region_size=$(($dra_size / 2)) + region=$(create_dcd_region ${mem} ${decoder} ${region_size}) + check_region ${region} ${region_size} + + region_two=$(create_dcd_region ${mem} ${decoder} ${region_size}) + check_region ${region_two} ${region_size} + + destroy_region ${region_two} + check_not_region ${region_two} + destroy_region ${region} + check_not_region ${region} +} + +test_more_bit() +{ + echo "" + echo "Test: More bit" + echo "" + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" 1 + # More bit should hold off surfacing extent until the more bit is 0 + check_extent_cnt ${region} 0 + inject_extent ${device} $base_ext_dpa $base_ext_length "" + check_extent_cnt ${region} 2 + destroy_region ${region} + check_not_region ${region} +} + +test_driver_tear_down() +{ + echo "" + echo "Test: driver remove tear down" + echo "" + region=$(create_dcd_region ${mem} ${decoder}) + check_region ${region} ${dra_size} + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + check_extent ${region} ${pre_ext_offset} ${pre_ext_length} + dax_dev=$(create_dax_dev ${region}) + # remove driver releases extents + modprobe -r dax_cxl + check_extent_cnt ${region} 0 +} + +test_driver_bring_up() +{ + # leave region up, driver removed. + echo "" + echo "Test: no driver inject ok" + echo "" + check_region ${region} ${dra_size} + inject_extent ${device} $pre_ext_dpa $pre_ext_length "" + check_extent_cnt ${region} 1 + + modprobe dax_cxl + check_extent_cnt ${region} 1 + + destroy_region ${region} + check_not_region ${region} +} + +test_driver_reload() +{ + test_driver_tear_down + test_driver_bring_up +} + +test_event_reporting() +{ + # Test event reporting + # results expected + num_dcd_events_expected=2 + + echo "Test: Prep event trace" + echo "" > /sys/kernel/tracing/trace + echo 1 > /sys/kernel/tracing/events/cxl/enable + echo 1 > /sys/kernel/tracing/tracing_on + + inject_extent ${device} $base_ext_dpa $base_ext_length "" + remove_extent ${device} $base_ext_dpa $base_ext_length + + echo 0 > /sys/kernel/tracing/tracing_on + + echo "Test: Events seen" + trace_out=$(cat /sys/kernel/tracing/trace) + + # Look for DCD events + num_dcd_events=$(grep -c "cxl_dynamic_capacity" <<< "${trace_out}") + echo " LOG (Expected) : (Found)" + echo " DCD events ($num_dcd_events_expected) : $num_dcd_events" + + if [ "$num_dcd_events" -ne $num_dcd_events_expected ]; then + err "$LINENO" + fi +} + + +# ======================================================================== +# main() +# ======================================================================== + +modprobe -r cxl_test +modprobe cxl_test + +readarray -t memdevs < <("$CXL" list -b cxl_test -Mi | jq -r '.[].memdev') + +for mem in ${memdevs[@]}; do + dra_size=$($CXL list -m $mem | jq -r '.[].dynamic_ram_a_size') + if [ "$dra_size" == "null" ]; then + continue + fi + decoder=$($CXL list -b cxl_test -D -d root -m "$mem" | + jq -r ".[] | + select(.volatile_capable == true) | + select(.nr_targets == 1) | + select(.max_available_extent >= ${dra_size}) | + .decoder") + if [[ $decoder ]]; then + bus=`"$CXL" list -b cxl_test -m ${mem} | jq -r '.[].bus'` + device=$($CXL list -m $mem | jq -r '.[].host') + break + fi +done + +echo "TEST: DCD test device bus:${bus} decoder:${decoder} mem:${mem} device:${device} size:${dra_size}" + +if [ "$decoder" == "" ] || [ "$device" == "" ] || [ "$dra_size" == "" ]; then + echo "No mem device/decoder found with DCD support" + exit 77 +fi + +# testing pre existing extents must be called first as the extents were created +# by cxl-test being loaded +test_pre_existing_extents +test_remove_extent_under_dax_device +test_create_dax_dev_spanning_two_extents +test_inject_tag_support +test_partial_extent_remove +test_multiple_extent_remove +test_destroy_region_without_extent_removal +test_destroy_with_extent_and_dax +test_dax_device_ops +test_reject_overlapping +test_two_regions +test_more_bit +test_driver_reload +test_event_reporting + +modprobe -r cxl_test + +check_dmesg "$LINENO" + +exit 0 diff --git a/test/meson.build b/test/meson.build index 476f4ba6c97c..a2ed28c5eab1 100644 --- a/test/meson.build +++ b/test/meson.build @@ -195,6 +195,7 @@ cxl_sanitize = find_program('cxl-sanitize.sh') cxl_destroy_region = find_program('cxl-destroy-region.sh') cxl_qos_class = find_program('cxl-qos-class.sh') cxl_poison = find_program('cxl-poison.sh') +cxl_dcd = find_program('cxl-dcd.sh') if feat_hdrs_exist cxl_features = find_program('cxl-features.sh') @@ -232,6 +233,7 @@ tests = [ [ 'cxl-destroy-region.sh', cxl_destroy_region, 'cxl' ], [ 'cxl-qos-class.sh', cxl_qos_class, 'cxl' ], [ 'cxl-poison.sh', cxl_poison, 'cxl' ], + [ 'cxl-dcd.sh', cxl_dcd, 'cxl' ], ] if feat_hdrs_exist