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);