From nobody Sun Feb 8 19:12:51 2026 Received: from mail-qk1-f196.google.com (mail-qk1-f196.google.com [209.85.222.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EC23835C195 for ; Thu, 29 Jan 2026 21:04:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.196 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720696; cv=none; b=csFwUfu7JGxnreSvQk1IsY2/t9AdHhnmf11b0vLszQ3/TjzC0rac+HyPd41ICvY7MkYNSDC27C+JDcyXMbFUfpWHVkkRCxifnTvnRQEqpgFVOlUP7wg1HrvpA3QbZfv364z784nBUnxl1rkBAqvncU9YcnigBvSFYfeuEPF6zxY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720696; c=relaxed/simple; bh=V3jcetw4D8mN0UQEcroE5IaVeGXsJTloPdOskFdLl70=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lkx0mCaPAsvdxbD1/6IvqigpUtu9EOTvNmRVIilLpF66lzkQT/Q1OGSZYTC7wWKIY2cdgnKWwGTU6wsKs4P9xzj2EnjoU6uhnjbgwxVE9cMcSnH31TKMRmj0bdUn9LSbc/nT0ZNuyklwswedkETczjL28ZIq6/MnihcePwrgsCk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=qC+QQ2Bf; arc=none smtp.client-ip=209.85.222.196 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="qC+QQ2Bf" Received: by mail-qk1-f196.google.com with SMTP id af79cd13be357-8c532d8be8cso144850785a.2 for ; Thu, 29 Jan 2026 13:04:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1769720691; x=1770325491; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jFORCx/4rWXlwM5MWzZ4y2ZhtVTmicaaxzmL4W2ym48=; b=qC+QQ2BfI5LPjX/qao3rzwQhsN2mA3Hl5tspU/p8ra1TKa08jShwmEd13jhZBGrJLT dC9WoER48g/QzZ3u68huExwm8c/iX4Qq/q9AuqFSw0t+22UY+4bKmw/8vYVjL59dU0hq sgMPKidtkVAzGkUvSQOMERNFdcHFdtglcIPWxebfBSvbHamvffoUJdJmm0CBarsOPh7u VzuZwq5W502DJxVv33LFq2/tGFxwwI2FAe3JRIMwS5D1i9qk1vLoTdTJjOFaAbl1NFEx z+a2EBi/qNQ1pO14qLwlKxAL9x+zGT7QEPcCUe3V3NxbVbx2OlchfR695JYBppJUGp0Z vMfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769720691; x=1770325491; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=jFORCx/4rWXlwM5MWzZ4y2ZhtVTmicaaxzmL4W2ym48=; b=mwiQzS3roZvi7TchPLQLq42H4EBljVBQNGn+5hrnjIZ0tsE6iYhApUhdb6d9U1xeSC yxGa73al7vwVV2gJtdGsyk57i2mVDdeNpmF2n2RlYHurzetdpgosH9BjgybKyovdrapH VitLZ/wFT9JAu3Jah/efakdL+hqh9L3/YVCrncZBo6mlfaPm7mWceBsb3dJzdTLrliHe nyBKoc7xmTXR1FLtp3rLYNRcuW8rP5//ngj8riLSeAiIwbKv/uekVgJ0TKQ22i8BG8V8 ODTm0cpBu+QVopqq1Y01X+zgZ6AYIYJmPOhUelvnxFIqHg5joygTMbKuVWeB+Xs/VcBK s+hQ== X-Forwarded-Encrypted: i=1; AJvYcCXSzL+uYs3ZqTUFCx8S6WQQvhSK90uhq7F1Y+Rk1CN5dwUtEDxIEGrEVhMjeXLcnb0cEUhggHbmkWhqcEk=@vger.kernel.org X-Gm-Message-State: AOJu0YymJwGHu6coJVDNyZbpuFWGzFuow8pmmeldEbGFBeyZKPxfqLgB /StKJv1wLcYZ4g2LTyD/GvV1yG3gLH3gzfUhrV/bvs9w308pLjEbWuwT13IsXSyQFDc= X-Gm-Gg: AZuq6aJ9jdn7xQKmEBiH54fLgT0ECCadYQr6PDrDgD0IipjWihEDdjzHuElPzc4u46r f7jS5x1ilmBYKkc2Cwlx7/vWCJC6xCV8774OaSMTKBN/ycyhQ2BLKHRwEDTZTrSgTAV/7odlnJ1 rhMp0hZN7p6R/2KIZywfuAb3tmhscDoBYFSNeHe/quM45crvsodjxzabh38D8uJ/+kSUXP+ZCgB 8VfKIpLjNF6JweVXKft0Hp+IujNjIhjux8rq0qjTlKtG8TL7hZRfS+Jfck7NLcSxvRCrSU6bqNp OR+QHqN8LN+bFnZimppvwiPjg1/RpXur8u422fNUvweWnuIKTt6czUqxAYSa/9hetqyAIeBtOTF 02KtqrzxKqRAAcJCTayOE6o7r7Dhm0qUwbOwnZdNyhLWvVQ8hzs/UoLAi42ki9m/G9tw12Q0kRm +2Ne6T31wJvLmfHEuuXPYpqRg8aVHqHjVhGa2ikSnBV6tT784OZ4jZKuo3BcKmtiUd5q2gQomt6 uA= X-Received: by 2002:a05:620a:298d:b0:8c5:391f:1db7 with SMTP id af79cd13be357-8c9eb3119c3mr144724885a.64.1769720690713; Thu, 29 Jan 2026 13:04:50 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8c71b859eaesm282041685a.46.2026.01.29.13.04.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 13:04:50 -0800 (PST) From: Gregory Price To: linux-mm@kvack.org Cc: linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, willy@infradead.org, jack@suse.cz, terry.bowman@amd.com, john@jagalactic.com, Oscar Salvador , Andrew Morton , "David Hildenbrand (Red Hat)" Subject: [PATCH 1/9] mm/memory_hotplug: pass online_type to online_memory_block() via arg Date: Thu, 29 Jan 2026 16:04:34 -0500 Message-ID: <20260129210442.3951412-2-gourry@gourry.net> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260129210442.3951412-1-gourry@gourry.net> References: <20260129210442.3951412-1-gourry@gourry.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Modify online_memory_block() to accept the online type through its arg parameter rather than calling mhp_get_default_online_type() internally. This prepares for allowing callers to specify explicit online types. Update the caller in add_memory_resource() to pass the default online type via a local variable. No functional change. Cc: Oscar Salvador Cc: Andrew Morton Acked-by: David Hildenbrand (Red Hat) Signed-off-by: Gregory Price Reviewed-by: Jonathan Cameron --- mm/memory_hotplug.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index bc805029da51..87796b617d9e 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1337,7 +1337,9 @@ static int check_hotplug_memory_range(u64 start, u64 = size) =20 static int online_memory_block(struct memory_block *mem, void *arg) { - mem->online_type =3D mhp_get_default_online_type(); + int *online_type =3D arg; + + mem->online_type =3D *online_type; return device_online(&mem->dev); } =20 @@ -1578,8 +1580,12 @@ int add_memory_resource(int nid, struct resource *re= s, mhp_t mhp_flags) merge_system_ram_resource(res); =20 /* online pages if requested */ - if (mhp_get_default_online_type() !=3D MMOP_OFFLINE) - walk_memory_blocks(start, size, NULL, online_memory_block); + if (mhp_get_default_online_type() !=3D MMOP_OFFLINE) { + int online_type =3D mhp_get_default_online_type(); + + walk_memory_blocks(start, size, &online_type, + online_memory_block); + } =20 return ret; error: --=20 2.52.0 From nobody Sun Feb 8 19:12:51 2026 Received: from mail-qk1-f177.google.com (mail-qk1-f177.google.com [209.85.222.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6FFAF356A22 for ; Thu, 29 Jan 2026 21:04:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720696; cv=none; b=i5DRCUUxn5k+wbzPlIXSy+zUIQSy+pTLe89uzO3u79LlrIq1SPCxngFz7JDbwuXWMdSS0NugXK2dAwK9df4epG05jPxVFm+544Gyj5YikOvenSrX0LqyrJF72kmFNrQspJUKhy84yywkMsvVDUbuMAVR+A11e3MvzDPGTMzimkQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720696; c=relaxed/simple; bh=VOKzczjoSR9IzZunD6EwkPNtZXVw3ooO/qAH8uc28p8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cpqIjfL5IF8Jaz/HVqw9lGn/ulHY+jk/kI2+GkBr/75bTkMikAV2mGfU/xNRaba/IafTorrOXDcHFyJ/Xy7CLvY1fNfnmQ6dl0H5ah7ZZyUPWlvmjpCFBwUc6HvjwEuGoK2XIayWDFGzo+xQoZOKheJOV6iOVtqwziJiBx2nfiM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=K3maD3fP; arc=none smtp.client-ip=209.85.222.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="K3maD3fP" Received: by mail-qk1-f177.google.com with SMTP id af79cd13be357-8c0f13e4424so177297785a.1 for ; Thu, 29 Jan 2026 13:04:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1769720693; x=1770325493; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Szb3YY2E1e7FJPUVmrsEdEEkJjq+khES1iOhgbFItPA=; b=K3maD3fPWKjqycB32xVyDJpUSYwMM3Vjmb4iYAYEaZHxJdFCNfxSrBbO7su67plOb1 OMQvwZRq1ygO+ak2+eXOq1Fo6KoKUo0ALOMHMpnoD+zbSz/y8qVi8oYfm74qgORuwUdV TvTsn7xicNcJvd88UdzSOVLRSjRgRTnKLh6/M5XzOEVmWYHHkoCBMXewPEA2uArYE29m zzpYu2n3HAcXk40xWGCyPJnjTZtiBbrjIJoucOwe37HEhthpMUFLvC9cadsyq8BLyPBU 8rMPV7rto8slekx4cdkDFg9SSmuH/qDp3UIq/7knhkSDma7om1ArfEVeGEp0COoSBoXi SBUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769720693; x=1770325493; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Szb3YY2E1e7FJPUVmrsEdEEkJjq+khES1iOhgbFItPA=; b=CMoCoS+5pPP2baoYiCKvZnAGXigRtRyg+40bYrpOu5+DEyAnHU8SU4jYm8cEpKjXuS QKiUl4ws/LoPHnHaY8hja4rI28KAt+tDZ/94msmGjYE1LzWkoohkmkTqd9J9wgu4MZu1 5JKen2yar59XUYZLPUIJqe+C9L9zQNaZqBJ3hLCq/aT1Ju+oXfrbZ5Drnlv0Rx9mSnMz ASFKBZWFiekdKRWL6Q2u41BvZarMS/C1fhD+eEeL2JPS70F6m5NXdkA3CdU6k5vIdxSB 7Ogo2EGOTLxMW8duF+qsV6Mt/5/wBQkv144mxeLibZAJvLhQxsbNofBzJJSgU4YUw9GN leLg== X-Forwarded-Encrypted: i=1; AJvYcCU02660TgvXYvFntg7ARoMchsPK4cFKlh3xPCKi1nVD0jvM6b0bGmtLOjLLrKh7f+g4umrF37AJWOAgKkE=@vger.kernel.org X-Gm-Message-State: AOJu0YwGiQbBDBBa+cGhZYhw4e/8DYcnNIvUFpwhbWzf+8K7y/ZJKvY2 gp8DAunwqk+srRNSo94OPFsK/9tc8tCa9Xszd//KqX/q2C8F5eP1y0Cx5hSmVTe5WwA= X-Gm-Gg: AZuq6aLIeHiaivrVBmrOhhJSqR7exbAlRtd+72SqnxWvCXa6CFglB8pqtNaKskIZXOT FvEIEInYKeUPiINUCOwh6fQmNt4cNvh7rTN40O7idhzGUQguurv8ewmeR/qBRHqNUhZZ9UXl2d7 VwjQYh3OJErY6Fmkx7QsUoPxvWJX+J+1QOiTrxYtnTEtApAUydMmmQHnHGbffZM38UqiZYWNZhT E+OPO2PMIJUjr9Amv+o0a9n+A9iKc1PAexfXXI8xpp78II9N0DIoatad6UxphNZW1P7SfybQc6d VKHcdmUAuS4OGi+58Su5IPsSNUKi+An/bAXJWR3OveY8ZDqxGDDodRZey9GTAj4Sw6CWdMwf1b3 aQcH+xQ4O7Ez9b890LBGMcG8w2ZVuuTGN3rG2KSaop8CQ4pzey493nlisQeM3sPAzlkvLtiIV+5 C29j8U5SobBH1Gb+SOExc7+P4bN0zUMLtcsD3syBekLgHHqUq3jT7h1UaC1XbKgQnLRxtfh1ArA ok/vlRujvuGMQ== X-Received: by 2002:a05:620a:690d:b0:8c9:ea1c:f21c with SMTP id af79cd13be357-8c9eb2fd583mr157489485a.63.1769720693221; Thu, 29 Jan 2026 13:04:53 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8c71b859eaesm282041685a.46.2026.01.29.13.04.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 13:04:52 -0800 (PST) From: Gregory Price To: linux-mm@kvack.org Cc: linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, willy@infradead.org, jack@suse.cz, terry.bowman@amd.com, john@jagalactic.com, David Hildenbrand , Oscar Salvador , Andrew Morton Subject: [PATCH 2/9] mm/memory_hotplug: add __add_memory_driver_managed() with online_type arg Date: Thu, 29 Jan 2026 16:04:35 -0500 Message-ID: <20260129210442.3951412-3-gourry@gourry.net> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260129210442.3951412-1-gourry@gourry.net> References: <20260129210442.3951412-1-gourry@gourry.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Enable dax kmem driver to select how to online the memory rather than implicitly depending on the system default. This will allow users of dax to plumb through a preferred auto-online policy for their region. Refactor and new interface: Add __add_memory_driver_managed() which accepts an explicit online_type and export mhp_get_default_online_type() so callers can pass it when they want the default behavior. Refactor: Extract __add_memory_resource() to take an explicit online_type parameter, and update add_memory_resource() to pass the system default. No functional change for existing users. Cc: David Hildenbrand Cc: Oscar Salvador Cc: Andrew Morton Signed-off-by: Gregory Price --- include/linux/memory_hotplug.h | 3 ++ mm/memory_hotplug.c | 91 ++++++++++++++++++++++++---------- 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index f2f16cdd73ee..1eb63d1a247d 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -293,6 +293,9 @@ extern int __add_memory(int nid, u64 start, u64 size, m= hp_t mhp_flags); extern int add_memory(int nid, u64 start, u64 size, mhp_t mhp_flags); extern int add_memory_resource(int nid, struct resource *resource, mhp_t mhp_flags); +int __add_memory_driver_managed(int nid, u64 start, u64 size, + const char *resource_name, mhp_t mhp_flags, + int online_type); extern int add_memory_driver_managed(int nid, u64 start, u64 size, const char *resource_name, mhp_t mhp_flags); diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 87796b617d9e..d3ca95b872bd 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -239,6 +239,7 @@ int mhp_get_default_online_type(void) =20 return mhp_default_online_type; } +EXPORT_SYMBOL_GPL(mhp_get_default_online_type); =20 void mhp_set_default_online_type(int online_type) { @@ -1490,7 +1491,8 @@ static int create_altmaps_and_memory_blocks(int nid, = struct memory_group *group, * * we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */ -int add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags) +static int __add_memory_resource(int nid, struct resource *res, mhp_t mhp_= flags, + int online_type) { struct mhp_params params =3D { .pgprot =3D pgprot_mhp(PAGE_KERNEL) }; enum memblock_flags memblock_flags =3D MEMBLOCK_NONE; @@ -1580,12 +1582,9 @@ int add_memory_resource(int nid, struct resource *re= s, mhp_t mhp_flags) merge_system_ram_resource(res); =20 /* online pages if requested */ - if (mhp_get_default_online_type() !=3D MMOP_OFFLINE) { - int online_type =3D mhp_get_default_online_type(); - + if (online_type !=3D MMOP_OFFLINE) walk_memory_blocks(start, size, &online_type, online_memory_block); - } =20 return ret; error: @@ -1601,7 +1600,13 @@ int add_memory_resource(int nid, struct resource *re= s, mhp_t mhp_flags) return ret; } =20 -/* requires device_hotplug_lock, see add_memory_resource() */ +int add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags) +{ + return __add_memory_resource(nid, res, mhp_flags, + mhp_get_default_online_type()); +} + +/* requires device_hotplug_lock, see __add_memory_resource() */ int __add_memory(int nid, u64 start, u64 size, mhp_t mhp_flags) { struct resource *res; @@ -1629,29 +1634,24 @@ int add_memory(int nid, u64 start, u64 size, mhp_t = mhp_flags) } EXPORT_SYMBOL_GPL(add_memory); =20 -/* - * Add special, driver-managed memory to the system as system RAM. Such - * memory is not exposed via the raw firmware-provided memmap as system - * RAM, instead, it is detected and added by a driver - during cold boot, - * after a reboot, and after kexec. - * - * Reasons why this memory should not be used for the initial memmap of a - * kexec kernel or for placing kexec images: - * - The booting kernel is in charge of determining how this memory will be - * used (e.g., use persistent memory as system RAM) - * - Coordination with a hypervisor is required before this memory - * can be used (e.g., inaccessible parts). +/** + * __add_memory_driver_managed - add driver-managed memory with explicit o= nline_type + * @nid: NUMA node ID where the memory will be added + * @start: Start physical address of the memory range + * @size: Size of the memory range in bytes + * @resource_name: Resource name in format "System RAM ($DRIVER)" + * @mhp_flags: Memory hotplug flags + * @online_type: Online behavior (MMOP_ONLINE, MMOP_ONLINE_KERNEL, + * MMOP_ONLINE_MOVABLE, or MMOP_OFFLINE) * - * For this memory, no entries in /sys/firmware/memmap ("raw firmware-prov= ided - * memory map") are created. Also, the created memory resource is flagged - * with IORESOURCE_SYSRAM_DRIVER_MANAGED, so in-kernel users can special-c= ase - * this memory as well (esp., not place kexec images onto it). + * Add driver-managed memory with explicit online_type specification. + * The resource_name must have the format "System RAM ($DRIVER)". * - * The resource_name (visible via /proc/iomem) has to have the format - * "System RAM ($DRIVER)". + * Return: 0 on success, negative error code on failure. */ -int add_memory_driver_managed(int nid, u64 start, u64 size, - const char *resource_name, mhp_t mhp_flags) +int __add_memory_driver_managed(int nid, u64 start, u64 size, + const char *resource_name, mhp_t mhp_flags, + int online_type) { struct resource *res; int rc; @@ -1661,6 +1661,9 @@ int add_memory_driver_managed(int nid, u64 start, u64= size, resource_name[strlen(resource_name) - 1] !=3D ')') return -EINVAL; =20 + if (online_type < 0 || online_type > MMOP_ONLINE_MOVABLE) + return -EINVAL; + lock_device_hotplug(); =20 res =3D register_memory_resource(start, size, resource_name); @@ -1669,7 +1672,7 @@ int add_memory_driver_managed(int nid, u64 start, u64= size, goto out_unlock; } =20 - rc =3D add_memory_resource(nid, res, mhp_flags); + rc =3D __add_memory_resource(nid, res, mhp_flags, online_type); if (rc < 0) release_memory_resource(res); =20 @@ -1677,6 +1680,40 @@ int add_memory_driver_managed(int nid, u64 start, u6= 4 size, unlock_device_hotplug(); return rc; } +EXPORT_SYMBOL_FOR_MODULES(__add_memory_driver_managed, "kmem"); + +/* + * Add special, driver-managed memory to the system as system RAM. Such + * memory is not exposed via the raw firmware-provided memmap as system + * RAM, instead, it is detected and added by a driver - during cold boot, + * after a reboot, and after kexec. + * + * Reasons why this memory should not be used for the initial memmap of a + * kexec kernel or for placing kexec images: + * - The booting kernel is in charge of determining how this memory will be + * used (e.g., use persistent memory as system RAM) + * - Coordination with a hypervisor is required before this memory + * can be used (e.g., inaccessible parts). + * + * For this memory, no entries in /sys/firmware/memmap ("raw firmware-prov= ided + * memory map") are created. Also, the created memory resource is flagged + * with IORESOURCE_SYSRAM_DRIVER_MANAGED, so in-kernel users can special-c= ase + * this memory as well (esp., not place kexec images onto it). + * + * The resource_name (visible via /proc/iomem) has to have the format + * "System RAM ($DRIVER)". + * + * Memory will be onlined using the system default online type. + * + * Returns 0 on success, negative error code on failure. + */ +int add_memory_driver_managed(int nid, u64 start, u64 size, + const char *resource_name, mhp_t mhp_flags) +{ + return __add_memory_driver_managed(nid, start, size, resource_name, + mhp_flags, + mhp_get_default_online_type()); +} EXPORT_SYMBOL_GPL(add_memory_driver_managed); =20 /* --=20 2.52.0 From nobody Sun Feb 8 19:12:51 2026 Received: from mail-qk1-f170.google.com (mail-qk1-f170.google.com [209.85.222.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C16335C1B8 for ; Thu, 29 Jan 2026 21:04:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720699; cv=none; b=fm0StUEPHP1jWFPBTZ6V/d19Ksz1P9ZlVeH8wESGcHAxwkTlenwfnWdT0tKKLo0qejmYTWVNZiIA+TFQX6qaQBfvcFX/Y4/zE9wqUtrRxuNwH4R7OnOREJ2NdT5iA4UWWJYzX+L+4YPKtnACsJa1B4PzFt5LAuSjLMiWfFRfTPc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720699; c=relaxed/simple; bh=JnLujJWDw0BcQgi5wBFcpc/5Wt50jW8kOx4fggwynCI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VUXuTQJ/jfQ/quOF/od4uh5wOBgwxU5mX3uLwZ2pk+2+qxdNPAtkwYEa5kUxRTXgaTD6CVKEYzeC+t7C92QHWWfAaHrx6EgQ6Uvwul86GWsF/+HTKr8ZEA4JiCsx1YAeAr1RQANQW0AOx40QsjfIuyvlzzvKTSgJAje6+AxoRR8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=g9vz+XDJ; arc=none smtp.client-ip=209.85.222.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="g9vz+XDJ" Received: by mail-qk1-f170.google.com with SMTP id af79cd13be357-8c6aaf3cd62so151113585a.3 for ; Thu, 29 Jan 2026 13:04:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1769720695; x=1770325495; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+CRGF+/n1V2R5uGEqix6U/LES5Uojp7M/qLfKImGPj8=; b=g9vz+XDJot6ZFC3/rlZpZoVtoDv7/BHlydoBPk4WOrXSZ7rbCPGdE7bjR84cc5TfFw FGRBeB0jfBp/4CIWM27d+Nmzw2KAaIf6B8nD5ab9YNjC74gxENyJmEbcTdP7P4sD96uM Jm0+M5Y6m3llk1gJTKX/WLXQN5sQwdruuSTymv/qD5rE4XtXgrM6B9C2Z9gtGW2fNcFI DLPPqOL2TAQdWrldEPX4DySh+VZLjqjrjl5uKywZHRdBlumuq7DnM7E5CuZRZXZZZSpn QjOlaM+pNa2o4ZhUa6IVZEahwdfwbu4HPYm5K/AvWHjY4/fWiY3JUXO+6Y+VLAkqVRBS 44oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769720695; x=1770325495; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+CRGF+/n1V2R5uGEqix6U/LES5Uojp7M/qLfKImGPj8=; b=pA2d7AQ8MlSyKGOCP9R7ZX9WDPS2ynlJbwvVRoDo6nasQdHxbaUhnn6VPDe04wMX83 kGoE4kanxZe6d/SDQDzOPm5IdwJ3zcVHSBq4uguFasB8HRZfFfLxAPE3UJ4uHrn5kl/q bCeFHP1UwexvlHIugdkyfGt/Kka1/XYIwLtPc+SgXH76rhTsAtI/P4+M/Lm61FzgUsji lYu0IdvChBdCOplt9xgYGFkeEbfNalE2HrONjPY60+O14hN2obxzuCYlej8KMFtiEqqK jTwL/FPCH1BHHlku1B8Q27CGaIIAehhrIgMpQlOIO9dqXikURBFGT5eM8pTifn4DonWP eWxg== X-Forwarded-Encrypted: i=1; AJvYcCUDxy9jyjRFwdRGhBgc2hvkR5OFNPuAVE3XZDoVcX0hA8wbunzzpe/XkwTqyPtnrRARIiUV84A9qKYL/+0=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7cY8zqwUfJivYN0yaFxBH2ItilJkJAwSD/Qmthqqn1QKbCbyl lg/AcqgDdbESvYkKKCCT0SKuvjdZHKU1grMf1OyaQjiyzGyAmUz1X5zLkfp7ux6iwME= X-Gm-Gg: AZuq6aJ6LBpRR2OCj73z6eiUt3OdpxHGvi7QovtH3K8QXqM0w8H3/KorMwEdq6WNOoM u/YwfM3i2WXp2b9zGriGxuMk2Po//jBhyMVE2q4r1veoS3cWKdOT7xTqgdLqOb+ssxVYU9iah39 kudmThyDRuuJ1BQtpkstnNyICe4MHyl9hOGp1cKfjCwT3fWzOrC4BUVNPo/GlgvI/A5wLek3+bJ gyq0f7EdDSPz9+wA08omHYsQ14S7Whl9/+Kz+3blgh3Jnhd2O0wdlDqBorQDZ1zwwdXDUrIHUuV lQNofLhyzXiMCWRhjhF4AUjb0FyyrnmDk3//aO8Lz5xIMAjgZQCCsJRkNMWkN0wOBkq9c2ntzID kIIIStdqK5o36Irqn+b+RCq4XOu8LePp7RwKVx80WLxCtClfuvAnVHwqHrT2XaIu4ctd9uOWPJk FIWzsJdCdYBokbXHk/EkMr2HSzA1ODO+FChOV0h+4iAH4vTiQUWvfdG5Ig79NVa8vqOFBXyjQgY 8E= X-Received: by 2002:a05:620a:17aa:b0:8c6:b2ce:f46 with SMTP id af79cd13be357-8c9eb1fc03cmr152696085a.14.1769720695300; Thu, 29 Jan 2026 13:04:55 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8c71b859eaesm282041685a.46.2026.01.29.13.04.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 13:04:54 -0800 (PST) From: Gregory Price To: linux-mm@kvack.org Cc: linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, willy@infradead.org, jack@suse.cz, terry.bowman@amd.com, john@jagalactic.com Subject: [PATCH 3/9] dax: plumb online_type from dax_kmem creators to hotplug Date: Thu, 29 Jan 2026 16:04:36 -0500 Message-ID: <20260129210442.3951412-4-gourry@gourry.net> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260129210442.3951412-1-gourry@gourry.net> References: <20260129210442.3951412-1-gourry@gourry.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" There is no way for drivers leveraging dax_kmem to plumb through a preferred auto-online policy - the system default policy is forced. Add online_type field to DAX device creation path to allow drivers to specify an auto-online policy when using the kmem driver. Current callers initialize online_type to mhp_get_default_online_type() which resolves to the system default (memhp_default_online_type). No functional change to existing drivers. Cc:David Hildenbrand Signed-off-by: Gregory Price --- drivers/cxl/core/region.c | 2 ++ drivers/cxl/cxl.h | 1 + drivers/dax/bus.c | 3 +++ drivers/dax/bus.h | 1 + drivers/dax/cxl.c | 1 + drivers/dax/dax-private.h | 2 ++ drivers/dax/hmem/hmem.c | 2 ++ drivers/dax/kmem.c | 13 +++++++++++-- drivers/dax/pmem.c | 2 ++ 9 files changed, 25 insertions(+), 2 deletions(-) diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 5bd1213737fa..eef5d5fe3f95 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright(c) 2022 Intel Corporation. All rights reserved. */ #include +#include #include #include #include @@ -3459,6 +3460,7 @@ static int devm_cxl_add_dax_region(struct cxl_region = *cxlr) if (IS_ERR(cxlr_dax)) return PTR_ERR(cxlr_dax); =20 + cxlr_dax->online_type =3D mhp_get_default_online_type(); dev =3D &cxlr_dax->dev; rc =3D dev_set_name(dev, "dax_region%d", cxlr->id); if (rc) diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index ba17fa86d249..07d57d13f4c7 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -591,6 +591,7 @@ struct cxl_dax_region { struct device dev; struct cxl_region *cxlr; struct range hpa_range; + int online_type; /* MMOP_ value for kmem driver */ }; =20 /** diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c index fde29e0ad68b..121a6dd0afe7 100644 --- a/drivers/dax/bus.c +++ b/drivers/dax/bus.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 /* Copyright(c) 2017-2018 Intel Corporation. All rights reserved. */ #include +#include #include #include #include @@ -395,6 +396,7 @@ static ssize_t create_store(struct device *dev, struct = device_attribute *attr, .size =3D 0, .id =3D -1, .memmap_on_memory =3D false, + .online_type =3D mhp_get_default_online_type(), }; struct dev_dax *dev_dax =3D __devm_create_dev_dax(&data); =20 @@ -1494,6 +1496,7 @@ static struct dev_dax *__devm_create_dev_dax(struct d= ev_dax_data *data) ida_init(&dev_dax->ida); =20 dev_dax->memmap_on_memory =3D data->memmap_on_memory; + dev_dax->online_type =3D data->online_type; =20 inode =3D dax_inode(dax_dev); dev->devt =3D inode->i_rdev; diff --git a/drivers/dax/bus.h b/drivers/dax/bus.h index cbbf64443098..4ac92a4edfe7 100644 --- a/drivers/dax/bus.h +++ b/drivers/dax/bus.h @@ -24,6 +24,7 @@ struct dev_dax_data { resource_size_t size; int id; bool memmap_on_memory; + int online_type; /* MMOP_ value for kmem driver */ }; =20 struct dev_dax *devm_create_dev_dax(struct dev_dax_data *data); diff --git a/drivers/dax/cxl.c b/drivers/dax/cxl.c index 13cd94d32ff7..856a0cd24f3b 100644 --- a/drivers/dax/cxl.c +++ b/drivers/dax/cxl.c @@ -27,6 +27,7 @@ static int cxl_dax_region_probe(struct device *dev) .id =3D -1, .size =3D range_len(&cxlr_dax->hpa_range), .memmap_on_memory =3D true, + .online_type =3D cxlr_dax->online_type, }; =20 return PTR_ERR_OR_ZERO(devm_create_dev_dax(&data)); diff --git a/drivers/dax/dax-private.h b/drivers/dax/dax-private.h index c6ae27c982f4..9559718cc988 100644 --- a/drivers/dax/dax-private.h +++ b/drivers/dax/dax-private.h @@ -77,6 +77,7 @@ struct dev_dax_range { * @dev: device core * @pgmap: pgmap for memmap setup / lifetime (driver owned) * @memmap_on_memory: allow kmem to put the memmap in the memory + * @online_type: MMOP_* online type for memory hotplug * @nr_range: size of @ranges * @ranges: range tuples of memory used */ @@ -91,6 +92,7 @@ struct dev_dax { struct device dev; struct dev_pagemap *pgmap; bool memmap_on_memory; + int online_type; int nr_range; struct dev_dax_range *ranges; }; diff --git a/drivers/dax/hmem/hmem.c b/drivers/dax/hmem/hmem.c index c18451a37e4f..119914b08fd9 100644 --- a/drivers/dax/hmem/hmem.c +++ b/drivers/dax/hmem/hmem.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #include +#include #include #include #include @@ -36,6 +37,7 @@ static int dax_hmem_probe(struct platform_device *pdev) .id =3D -1, .size =3D region_idle ? 0 : range_len(&mri->range), .memmap_on_memory =3D false, + .online_type =3D mhp_get_default_online_type(), }; =20 return PTR_ERR_OR_ZERO(devm_create_dev_dax(&data)); diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index c036e4d0b610..550dc605229e 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -16,6 +16,11 @@ #include "dax-private.h" #include "bus.h" =20 +/* Internal function exported only to kmem module */ +extern int __add_memory_driver_managed(int nid, u64 start, u64 size, + const char *resource_name, + mhp_t mhp_flags, int online_type); + /* * Default abstract distance assigned to the NUMA node onlined * by DAX/kmem if the low level platform driver didn't initialize @@ -72,6 +77,7 @@ static int dev_dax_kmem_probe(struct dev_dax *dev_dax) struct dax_kmem_data *data; struct memory_dev_type *mtype; int i, rc, mapped =3D 0; + int online_type; mhp_t mhp_flags; int numa_node; int adist =3D MEMTIER_DEFAULT_DAX_ADISTANCE; @@ -134,6 +140,8 @@ static int dev_dax_kmem_probe(struct dev_dax *dev_dax) goto err_reg_mgid; data->mgid =3D rc; =20 + online_type =3D dev_dax->online_type; + for (i =3D 0; i < dev_dax->nr_range; i++) { struct resource *res; struct range range; @@ -174,8 +182,9 @@ static int dev_dax_kmem_probe(struct dev_dax *dev_dax) * Ensure that future kexec'd kernels will not treat * this as RAM automatically. */ - rc =3D add_memory_driver_managed(data->mgid, range.start, - range_len(&range), kmem_name, mhp_flags); + rc =3D __add_memory_driver_managed(data->mgid, range.start, + range_len(&range), kmem_name, mhp_flags, + online_type); =20 if (rc) { dev_warn(dev, "mapping%d: %#llx-%#llx memory add failed\n", diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c index bee93066a849..a5925146b09f 100644 --- a/drivers/dax/pmem.c +++ b/drivers/dax/pmem.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* Copyright(c) 2016 - 2018 Intel Corporation. All rights reserved. */ +#include #include #include #include "../nvdimm/pfn.h" @@ -63,6 +64,7 @@ static struct dev_dax *__dax_pmem_probe(struct device *de= v) .pgmap =3D &pgmap, .size =3D range_len(&range), .memmap_on_memory =3D false, + .online_type =3D mhp_get_default_online_type(), }; =20 return devm_create_dev_dax(&data); --=20 2.52.0 From nobody Sun Feb 8 19:12:51 2026 Received: from mail-qk1-f170.google.com (mail-qk1-f170.google.com [209.85.222.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DDFB33382C6 for ; Thu, 29 Jan 2026 21:04:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720711; cv=none; b=PlWWARVNmlB4IZSiB/ExaLyg04+mO/s/QybJU5/5ycXPRvy2MBZ1wJCSgwjFE7Buhvt5pf0pyyo72zVq9C2iBIOzL6+SOXLynbWMrIaDIY/7htMHfEWXx7pYUh2mnIjILPHF7oGV49M6DzIlRSm45xPHze2PW7bxD+xlGHFrhhQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720711; c=relaxed/simple; bh=QNsY4J+Tc0rw1kzVfyOgqVGbBo/47Sd9HfuK48nkDOE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vr6TcAPrgU5+j1NeI/MD7sud0K9Gur5hJkGmhP6SvyTtehj44FzT7Pjyj07o2wWkP7vAKI1YnHeg5Ad685xM+ytq16KtoZlMxt7+yQNxWtP7lhqbphFL+4hvpy2mTI5lTw+0PeAN5Skb0SY7OvMfK2RmmjwNAbIUH2jAHGzsUmc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=XGOgVsGE; arc=none smtp.client-ip=209.85.222.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="XGOgVsGE" Received: by mail-qk1-f170.google.com with SMTP id af79cd13be357-8c532d8be8cso144860785a.2 for ; Thu, 29 Jan 2026 13:04:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1769720697; x=1770325497; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=alwv4SGOFS63mWmVzbrgd9Xf0He8PRBJ686/YkdtOI4=; b=XGOgVsGE7lEH2jvTzMPTXM6VTcQCg0Fg1rN6+diAOZtBaxaAOARbZhqQQ6OqVTORFM u6tk6WVBLAPnaGrIC9yLob0RiedBLUU/acXRCKjpZbNlp9IiDInS0k6WJ5jwq3bfM5H8 TBXMHljBw+bbfmoSAsHHMnV4gZLdAIsnNuIjYJuOI0MtCeY4IOn2S+4GwB0GP0C4HJfq 8ee0hrWR2NifSyj7NiNZzWgko8u+1EyXK/J108U/LfXkMEqMm4cRroaB6ga2BvaXLQcT scFuuwo/PKMwy/snL/fvWEC7rqm992HmD28II3GxdtfS8V3LwfitDnXnR9W9GoVeKV2k XkTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769720697; x=1770325497; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=alwv4SGOFS63mWmVzbrgd9Xf0He8PRBJ686/YkdtOI4=; b=OxcMk+euxiTEa8UiYT7NEmcAIGGPvcPZjKTIY5ZU58WYpHU3gZ1sE+/vrj/tyBSCII 5lHdkfIAFkwJ8ZXGoLbdZcxzvIdc5kg4ArBv8bUoEojSbONsejRYXVq5VxgnTI950VEe imgy0mROMVfPaBB3BxYXS46Zf1FA1g8K9IuXYSqVMW+7eMPwB9er3XcPF4Is6BWdlTQz qYEbCgqpdvA/IAQhVKOCmaULrzOKzTo2I6g28hYNb/KHCfVrbERQtolJrJIn4pklle2r mLPRddc5E8h2n1HpKfPHP90yBsEIL4pPNgYSx+/E62wLxXCZYT+yi2BcRuA8OMkcAMWq qujA== X-Forwarded-Encrypted: i=1; AJvYcCWvNefG7IiqbhbCDBpQvsEc4zqvt8pRaMCpzNEwYuU3Y+h93IH+eBC4P5YSvy8oLyZRoWr1Mi9beyU9YL4=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8vrsjxTIr4+nrbv+OTCRFaDklMwRem/ccd2ULBoq/q/xMCMdx EwbyUeTKjI694+jTV0mzNMcEKvOhNEditW9hlgwzBiX1j/iicgSe7h192bBJCgim/u4= X-Gm-Gg: AZuq6aIPo6k80jc+ukIqhMmjR9e/PzSZcB4jPW3KGCEFCccIrJ7UtPZ+iY78Jjz2Vf+ KD20MogRcNjIzUqqFEC5zcg7JIY5EI0xeKxrBR1YNawf+RSbjz1Iz0mPSvCckhWj5zFOkPWKBlh 9+nstO6Dsh9dAw5bzZfQ0fiEcjH8+U/SaxpLoPO3m5I58FltnpeBKwdpCdUVCm58prwHbWI9V36 XmWksjJwhnsxXLriZKXcHhFSgqOO009R9XRIFM1E9e9n/r3D83Oo4AxcK82g7qxcd8YeDMVCI2Q QfqZ6DYkricTYs5Hp5kT0HKaQpDFPHiFwTv7vQByioy6ON+/Ppo+nYGLoeLJ05VwniFKizuanZT X6PaXW5dFSLIEvcTtAot0dQwiVGDrdzKP2Sj/rCnYj2SEB7Sch4oxBJ6XIupo9LO1snxCZh/pNp nqr/A9SUYxUjPzFddCykXW93ud3Sy6IalEr9AljBzmzuzKCZh4Z/sUWG2hh6Fr1Mq4cKRbYqzgU VY= X-Received: by 2002:a05:620a:254e:b0:8c2:faed:ded3 with SMTP id af79cd13be357-8c9eb349005mr136193485a.89.1769720697462; Thu, 29 Jan 2026 13:04:57 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8c71b859eaesm282041685a.46.2026.01.29.13.04.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 13:04:57 -0800 (PST) From: Gregory Price To: linux-mm@kvack.org Cc: linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, willy@infradead.org, jack@suse.cz, terry.bowman@amd.com, john@jagalactic.com Subject: [PATCH 4/9] drivers/cxl,dax: add dax driver mode selection for dax regions Date: Thu, 29 Jan 2026 16:04:37 -0500 Message-ID: <20260129210442.3951412-5-gourry@gourry.net> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260129210442.3951412-1-gourry@gourry.net> References: <20260129210442.3951412-1-gourry@gourry.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" CXL regions may wish not to auto-configure their memory as dax kmem, but the current plumbing defaults all cxl-created dax devices to the kmem driver. This exposes them to hotplug policy, even if the user intends to use the memory as a dax device. Add plumbing to allow CXL drivers to select whether a DAX region should default to kmem (DAXDRV_KMEM_TYPE) or device (DAXDRV_DEVICE_TYPE). Add a 'dax_driver' field to struct cxl_dax_region and update devm_cxl_add_dax_region() to take a dax_driver_type parameter. In drivers/dax/cxl.c, the IORESOURCE_DAX_KMEM flag used by dax driver matching code is now set conditionally based on dax_region->dax_driver. Exports `enum dax_driver_type` to linux/dax.h for use in the cxl driver. All current callers pass DAXDRV_KMEM_TYPE for backward compatibility. Cc: John Groves Signed-off-by: Gregory Price Reviewed-by: Jonathan Cameron --- drivers/cxl/core/core.h | 1 + drivers/cxl/core/region.c | 6 ++++-- drivers/cxl/cxl.h | 2 ++ drivers/dax/bus.h | 6 +----- drivers/dax/cxl.c | 6 +++++- include/linux/dax.h | 5 +++++ 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 1fb66132b777..dd987ef2def5 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -6,6 +6,7 @@ =20 #include #include +#include =20 extern const struct device_type cxl_nvdimm_bridge_type; extern const struct device_type cxl_nvdimm_type; diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index eef5d5fe3f95..e4097c464ed3 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -3450,7 +3450,8 @@ static void cxlr_dax_unregister(void *_cxlr_dax) device_unregister(&cxlr_dax->dev); } =20 -static int devm_cxl_add_dax_region(struct cxl_region *cxlr) +static int devm_cxl_add_dax_region(struct cxl_region *cxlr, + enum dax_driver_type dax_driver) { struct cxl_dax_region *cxlr_dax; struct device *dev; @@ -3461,6 +3462,7 @@ static int devm_cxl_add_dax_region(struct cxl_region = *cxlr) return PTR_ERR(cxlr_dax); =20 cxlr_dax->online_type =3D mhp_get_default_online_type(); + cxlr_dax->dax_driver =3D dax_driver; dev =3D &cxlr_dax->dev; rc =3D dev_set_name(dev, "dax_region%d", cxlr->id); if (rc) @@ -3994,7 +3996,7 @@ static int cxl_region_probe(struct device *dev) p->res->start, p->res->end, cxlr, is_system_ram) > 0) return 0; - return devm_cxl_add_dax_region(cxlr); + return devm_cxl_add_dax_region(cxlr, DAXDRV_KMEM_TYPE); default: dev_dbg(&cxlr->dev, "unsupported region mode: %d\n", cxlr->mode); diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 07d57d13f4c7..c06a239c0008 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -12,6 +12,7 @@ #include #include #include +#include =20 extern const struct nvdimm_security_ops *cxl_security_ops; =20 @@ -592,6 +593,7 @@ struct cxl_dax_region { struct cxl_region *cxlr; struct range hpa_range; int online_type; /* MMOP_ value for kmem driver */ + enum dax_driver_type dax_driver; }; =20 /** diff --git a/drivers/dax/bus.h b/drivers/dax/bus.h index 4ac92a4edfe7..9144593b4029 100644 --- a/drivers/dax/bus.h +++ b/drivers/dax/bus.h @@ -2,6 +2,7 @@ /* Copyright(c) 2016 - 2018 Intel Corporation. All rights reserved. */ #ifndef __DAX_BUS_H__ #define __DAX_BUS_H__ +#include #include #include =20 @@ -29,11 +30,6 @@ struct dev_dax_data { =20 struct dev_dax *devm_create_dev_dax(struct dev_dax_data *data); =20 -enum dax_driver_type { - DAXDRV_KMEM_TYPE, - DAXDRV_DEVICE_TYPE, -}; - struct dax_device_driver { struct device_driver drv; struct list_head ids; diff --git a/drivers/dax/cxl.c b/drivers/dax/cxl.c index 856a0cd24f3b..b13ecc2f9806 100644 --- a/drivers/dax/cxl.c +++ b/drivers/dax/cxl.c @@ -11,14 +11,18 @@ static int cxl_dax_region_probe(struct device *dev) struct cxl_dax_region *cxlr_dax =3D to_cxl_dax_region(dev); int nid =3D phys_to_target_node(cxlr_dax->hpa_range.start); struct cxl_region *cxlr =3D cxlr_dax->cxlr; + unsigned long flags =3D 0; struct dax_region *dax_region; struct dev_dax_data data; =20 + if (cxlr_dax->dax_driver =3D=3D DAXDRV_KMEM_TYPE) + flags |=3D IORESOURCE_DAX_KMEM; + if (nid =3D=3D NUMA_NO_NODE) nid =3D memory_add_physaddr_to_nid(cxlr_dax->hpa_range.start); =20 dax_region =3D alloc_dax_region(dev, cxlr->id, &cxlr_dax->hpa_range, nid, - PMD_SIZE, IORESOURCE_DAX_KMEM); + PMD_SIZE, flags); if (!dax_region) return -ENOMEM; =20 diff --git a/include/linux/dax.h b/include/linux/dax.h index bf103f317cac..e62f92d0ace1 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -19,6 +19,11 @@ enum dax_access_mode { DAX_RECOVERY_WRITE, }; =20 +enum dax_driver_type { + DAXDRV_KMEM_TYPE, + DAXDRV_DEVICE_TYPE, +}; + struct dax_operations { /* * direct_access: translate a device-relative --=20 2.52.0 From nobody Sun Feb 8 19:12:51 2026 Received: from mail-qk1-f182.google.com (mail-qk1-f182.google.com [209.85.222.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A520135CBD6 for ; Thu, 29 Jan 2026 21:05:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720704; cv=none; b=p+mAKtSAHMlNRjwldKDzNgE8S30SRWPxwWZZ2z4yuqw9bQ8o46akCDp1sVbiGHj+WuIsXZdkNQxrJAVCCsR3kXPkNfXtoMVEvf0/IZwYsv8mi+F8RCpqBfJKeMBfrJshOCvMs7j0IUoa2vdQQUzTN5wP1d7/KW0ff/5rQALZrGQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720704; c=relaxed/simple; bh=c99ew5/U2ROZr/ddOc62AYyxyE5STejoR0DEktJNssc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L/SGXiXUSBGlA12Kza4/FZR2pnrAt4Fh44WpULK5BDipMCUo8VCwaP6ZhQIJ83evQspBLLyjy7bV+KBRVzz6MUpE57FRcnETbqTKkk9UUNlkou5N8/EoQL+0YRQUAJ6h4giBpE5uNOR6+MROTYH06M56R1WOwR9gdJ1yElOzEow= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=pr29mWfp; arc=none smtp.client-ip=209.85.222.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="pr29mWfp" Received: by mail-qk1-f182.google.com with SMTP id af79cd13be357-8c6d8751c88so150742685a.2 for ; Thu, 29 Jan 2026 13:05:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1769720700; x=1770325500; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=M5ShTIweYFg1/ZuxvW60BAtA8gMRBxv7vwbNQNJLoKA=; b=pr29mWfp7Ek0laGua5f7qJCbLen5McW5TbpGOzein5yA0gCxXCulCmmIwWpAItbBJh 2qeJI7rzGxSqoI2usLRwN2oP6mU8sHq6LIR0bjcgyLKTBQfaBxpJ7DR9vJOY3b1YEw2X un7+07IaK7qifin+manL7+Cvov1a8BHReDUedxdkzqPSFxmbnNzUWr/cZgvlLnBpS9Tb CKUE0ODEXFldb44/VrAcATEAGFuvpijAqLFtpRSFq3ex8hl3RbiAxFrxhIzWoWpm05eM 2nw1IYw74XH6oAkXnJBKDhco84XR013gyBODuc3XaLf3qaH3t0WiXjub9KERG/orgitC tXDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769720700; x=1770325500; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=M5ShTIweYFg1/ZuxvW60BAtA8gMRBxv7vwbNQNJLoKA=; b=OC8JSHu3kjBLQKCHmi48b+CISc7IZrDAjtNjNyEQDSxMROdjJTS54ytklA0dNOI74a af+Qy9fvxuMfzrGySfOMHNUlSJFAg5qXgiyNDaaEe6L0MpIaW3NncJGrfl6QcgUD03PJ xvzJHcPO9vZnklDIZpurHkj8djks1ZzKKitDShwTGWNsUdn1Ks+PGTwiNKIrXnVOcYNt nvq6qQHtMOXbmApB7VZ2JN+WiKnYEzRExZwY+VGJZLyYlQQygqjsHFez5yHTCR+5MX8E lPt2UNTA1qvWFkwz+zt9ILeUi5co4C/gpZQrvx93FxB0P1gsmm+w7jEiTHtVn44Y4r29 Y4Uw== X-Forwarded-Encrypted: i=1; AJvYcCWAauMhVo4/VSbK0OMQtyQN4EJLwb9r8VHMXT1wuPrArlePzF941lusjeLOlT0/zH3GgyPA/4eRWc4kqIQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yw2BhTUZ7cRUGAxhI3MSl35EmG3vX33xCW0Uw+Dv/0Aq6gKBR+1 m91MMcDRyLoSpLhnLd+y9HAfUieo+p8xaGAswBDw+DMaRssXOZdmw8sp47g9oV1htWw= X-Gm-Gg: AZuq6aKTmx6W0NzBlMz/akRciPlXXzQ1SoV/xe5iWC2Sf2VIJVX8GeNSBbVVbZGCAdC /Psbp4mFMFMRZHEhVnALM2G8i4SPNNKVRkKmuxj+K0l45vynLwCOFAfxFKgEU3bzSOgtQg2bvrY vbL8y9SounCuxRhc3OhkcdYTVGwG2PitZm6ct2wahkoqGuvwMat6+nv7Wpxm9ehmfGPotBGG8sm eTSxARWVR3Tfo6n77S9EoD3eDt+2kOs62ywRGtLrI6105swQKi49FVhQL/xg1qyNjJixNCQ2EqY PT0enbwKD4oFuKVmGkp+HX1JOIT37xBOc4imJq0SOURvYJ2Ht2QcqZdEnHzk6OmoM6E9gYJpW7+ /2rA0h1AadNtWBUbq40cMayp6stO12LA1LfDikq5KI1BMcShEL89vkO4z2qSbrgfIqAb5dj3Zrd mxDwQfcpylxfd4YxGytfo2QlyKM6uOWn1MCG/ihutuLLMMwA0uDrqTl82ecKvtV8ldI41c4CgsM G4= X-Received: by 2002:ac8:7d4b:0:b0:501:47f8:982d with SMTP id d75a77b69052e-505d223dfcbmr11826491cf.52.1769720699550; Thu, 29 Jan 2026 13:04:59 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8c71b859eaesm282041685a.46.2026.01.29.13.04.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 13:04:59 -0800 (PST) From: Gregory Price To: linux-mm@kvack.org Cc: linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, willy@infradead.org, jack@suse.cz, terry.bowman@amd.com, john@jagalactic.com Subject: [PATCH 5/9] cxl/core/region: move pmem region driver logic into pmem_region Date: Thu, 29 Jan 2026 16:04:38 -0500 Message-ID: <20260129210442.3951412-6-gourry@gourry.net> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260129210442.3951412-1-gourry@gourry.net> References: <20260129210442.3951412-1-gourry@gourry.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the pmem region driver logic from region.c into pmem_region.c. No functional changes. Signed-off-by: Gregory Price --- drivers/cxl/core/Makefile | 1 + drivers/cxl/core/core.h | 1 + drivers/cxl/core/pmem_region.c | 191 +++++++++++++++++++++++++++++++++ drivers/cxl/core/region.c | 184 ------------------------------- 4 files changed, 193 insertions(+), 184 deletions(-) create mode 100644 drivers/cxl/core/pmem_region.c diff --git a/drivers/cxl/core/Makefile b/drivers/cxl/core/Makefile index 5ad8fef210b5..23269c81fd44 100644 --- a/drivers/cxl/core/Makefile +++ b/drivers/cxl/core/Makefile @@ -17,6 +17,7 @@ cxl_core-y +=3D cdat.o cxl_core-y +=3D ras.o cxl_core-$(CONFIG_TRACING) +=3D trace.o cxl_core-$(CONFIG_CXL_REGION) +=3D region.o +cxl_core-$(CONFIG_CXL_REGION) +=3D pmem_region.o cxl_core-$(CONFIG_CXL_MCE) +=3D mce.o cxl_core-$(CONFIG_CXL_FEATURES) +=3D features.o cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) +=3D edac.o diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index dd987ef2def5..26991de12d76 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -43,6 +43,7 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port); struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 d= pa); u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa); +int devm_cxl_add_pmem_region(struct cxl_region *cxlr); =20 #else static inline u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, diff --git a/drivers/cxl/core/pmem_region.c b/drivers/cxl/core/pmem_region.c new file mode 100644 index 000000000000..81b66e548bb5 --- /dev/null +++ b/drivers/cxl/core/pmem_region.c @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright(c) 2022 Intel Corporation. All rights reserved. */ +#include +#include +#include +#include +#include "core.h" + +static void cxl_pmem_region_release(struct device *dev) +{ + struct cxl_pmem_region *cxlr_pmem =3D to_cxl_pmem_region(dev); + int i; + + for (i =3D 0; i < cxlr_pmem->nr_mappings; i++) { + struct cxl_memdev *cxlmd =3D cxlr_pmem->mapping[i].cxlmd; + + put_device(&cxlmd->dev); + } + + kfree(cxlr_pmem); +} + +static const struct attribute_group *cxl_pmem_region_attribute_groups[] = =3D { + &cxl_base_attribute_group, + NULL, +}; + +const struct device_type cxl_pmem_region_type =3D { + .name =3D "cxl_pmem_region", + .release =3D cxl_pmem_region_release, + .groups =3D cxl_pmem_region_attribute_groups, +}; +bool is_cxl_pmem_region(struct device *dev) +{ + return dev->type =3D=3D &cxl_pmem_region_type; +} +EXPORT_SYMBOL_NS_GPL(is_cxl_pmem_region, "CXL"); + +struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev) +{ + if (dev_WARN_ONCE(dev, !is_cxl_pmem_region(dev), + "not a cxl_pmem_region device\n")) + return NULL; + return container_of(dev, struct cxl_pmem_region, dev); +} +EXPORT_SYMBOL_NS_GPL(to_cxl_pmem_region, "CXL"); +static struct lock_class_key cxl_pmem_region_key; + +static int cxl_pmem_region_alloc(struct cxl_region *cxlr) +{ + struct cxl_region_params *p =3D &cxlr->params; + struct cxl_nvdimm_bridge *cxl_nvb; + struct device *dev; + int i; + + guard(rwsem_read)(&cxl_rwsem.region); + if (p->state !=3D CXL_CONFIG_COMMIT) + return -ENXIO; + + struct cxl_pmem_region *cxlr_pmem __free(kfree) =3D + kzalloc(struct_size(cxlr_pmem, mapping, p->nr_targets), GFP_KERNEL); + if (!cxlr_pmem) + return -ENOMEM; + + cxlr_pmem->hpa_range.start =3D p->res->start; + cxlr_pmem->hpa_range.end =3D p->res->end; + + /* Snapshot the region configuration underneath the cxl_rwsem.region */ + cxlr_pmem->nr_mappings =3D p->nr_targets; + for (i =3D 0; i < p->nr_targets; i++) { + struct cxl_endpoint_decoder *cxled =3D p->targets[i]; + struct cxl_memdev *cxlmd =3D cxled_to_memdev(cxled); + struct cxl_pmem_region_mapping *m =3D &cxlr_pmem->mapping[i]; + + /* + * Regions never span CXL root devices, so by definition the + * bridge for one device is the same for all. + */ + if (i =3D=3D 0) { + cxl_nvb =3D cxl_find_nvdimm_bridge(cxlmd->endpoint); + if (!cxl_nvb) + return -ENODEV; + cxlr->cxl_nvb =3D cxl_nvb; + } + m->cxlmd =3D cxlmd; + get_device(&cxlmd->dev); + m->start =3D cxled->dpa_res->start; + m->size =3D resource_size(cxled->dpa_res); + m->position =3D i; + } + + dev =3D &cxlr_pmem->dev; + device_initialize(dev); + lockdep_set_class(&dev->mutex, &cxl_pmem_region_key); + device_set_pm_not_required(dev); + dev->parent =3D &cxlr->dev; + dev->bus =3D &cxl_bus_type; + dev->type =3D &cxl_pmem_region_type; + cxlr_pmem->cxlr =3D cxlr; + cxlr->cxlr_pmem =3D no_free_ptr(cxlr_pmem); + + return 0; +} + +static void cxlr_pmem_unregister(void *_cxlr_pmem) +{ + struct cxl_pmem_region *cxlr_pmem =3D _cxlr_pmem; + struct cxl_region *cxlr =3D cxlr_pmem->cxlr; + struct cxl_nvdimm_bridge *cxl_nvb =3D cxlr->cxl_nvb; + + /* + * Either the bridge is in ->remove() context under the device_lock(), + * or cxlr_release_nvdimm() is cancelling the bridge's release action + * for @cxlr_pmem and doing it itself (while manually holding the bridge + * lock). + */ + device_lock_assert(&cxl_nvb->dev); + cxlr->cxlr_pmem =3D NULL; + cxlr_pmem->cxlr =3D NULL; + device_unregister(&cxlr_pmem->dev); +} + +static void cxlr_release_nvdimm(void *_cxlr) +{ + struct cxl_region *cxlr =3D _cxlr; + struct cxl_nvdimm_bridge *cxl_nvb =3D cxlr->cxl_nvb; + + scoped_guard(device, &cxl_nvb->dev) { + if (cxlr->cxlr_pmem) + devm_release_action(&cxl_nvb->dev, cxlr_pmem_unregister, + cxlr->cxlr_pmem); + } + cxlr->cxl_nvb =3D NULL; + put_device(&cxl_nvb->dev); +} + +/** + * devm_cxl_add_pmem_region() - add a cxl_region-to-nd_region bridge + * @cxlr: parent CXL region for this pmem region bridge device + * + * Return: 0 on success negative error code on failure. + */ +int devm_cxl_add_pmem_region(struct cxl_region *cxlr) +{ + struct cxl_pmem_region *cxlr_pmem; + struct cxl_nvdimm_bridge *cxl_nvb; + struct device *dev; + int rc; + + rc =3D cxl_pmem_region_alloc(cxlr); + if (rc) + return rc; + cxlr_pmem =3D cxlr->cxlr_pmem; + cxl_nvb =3D cxlr->cxl_nvb; + + dev =3D &cxlr_pmem->dev; + rc =3D dev_set_name(dev, "pmem_region%d", cxlr->id); + if (rc) + goto err; + + rc =3D device_add(dev); + if (rc) + goto err; + + dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), + dev_name(dev)); + + scoped_guard(device, &cxl_nvb->dev) { + if (cxl_nvb->dev.driver) + rc =3D devm_add_action_or_reset(&cxl_nvb->dev, + cxlr_pmem_unregister, + cxlr_pmem); + else + rc =3D -ENXIO; + } + + if (rc) + goto err_bridge; + + /* @cxlr carries a reference on @cxl_nvb until cxlr_release_nvdimm */ + return devm_add_action_or_reset(&cxlr->dev, cxlr_release_nvdimm, cxlr); + +err: + put_device(dev); +err_bridge: + put_device(&cxl_nvb->dev); + cxlr->cxl_nvb =3D NULL; + return rc; +} + + diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index e4097c464ed3..fc56f8f03805 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2747,46 +2747,6 @@ static ssize_t delete_region_store(struct device *de= v, } DEVICE_ATTR_WO(delete_region); =20 -static void cxl_pmem_region_release(struct device *dev) -{ - struct cxl_pmem_region *cxlr_pmem =3D to_cxl_pmem_region(dev); - int i; - - for (i =3D 0; i < cxlr_pmem->nr_mappings; i++) { - struct cxl_memdev *cxlmd =3D cxlr_pmem->mapping[i].cxlmd; - - put_device(&cxlmd->dev); - } - - kfree(cxlr_pmem); -} - -static const struct attribute_group *cxl_pmem_region_attribute_groups[] = =3D { - &cxl_base_attribute_group, - NULL, -}; - -const struct device_type cxl_pmem_region_type =3D { - .name =3D "cxl_pmem_region", - .release =3D cxl_pmem_region_release, - .groups =3D cxl_pmem_region_attribute_groups, -}; - -bool is_cxl_pmem_region(struct device *dev) -{ - return dev->type =3D=3D &cxl_pmem_region_type; -} -EXPORT_SYMBOL_NS_GPL(is_cxl_pmem_region, "CXL"); - -struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev) -{ - if (dev_WARN_ONCE(dev, !is_cxl_pmem_region(dev), - "not a cxl_pmem_region device\n")) - return NULL; - return container_of(dev, struct cxl_pmem_region, dev); -} -EXPORT_SYMBOL_NS_GPL(to_cxl_pmem_region, "CXL"); - struct cxl_poison_context { struct cxl_port *port; int part; @@ -3236,64 +3196,6 @@ static int region_offset_to_dpa_result(struct cxl_re= gion *cxlr, u64 offset, return -ENXIO; } =20 -static struct lock_class_key cxl_pmem_region_key; - -static int cxl_pmem_region_alloc(struct cxl_region *cxlr) -{ - struct cxl_region_params *p =3D &cxlr->params; - struct cxl_nvdimm_bridge *cxl_nvb; - struct device *dev; - int i; - - guard(rwsem_read)(&cxl_rwsem.region); - if (p->state !=3D CXL_CONFIG_COMMIT) - return -ENXIO; - - struct cxl_pmem_region *cxlr_pmem __free(kfree) =3D - kzalloc(struct_size(cxlr_pmem, mapping, p->nr_targets), GFP_KERNEL); - if (!cxlr_pmem) - return -ENOMEM; - - cxlr_pmem->hpa_range.start =3D p->res->start; - cxlr_pmem->hpa_range.end =3D p->res->end; - - /* Snapshot the region configuration underneath the cxl_rwsem.region */ - cxlr_pmem->nr_mappings =3D p->nr_targets; - for (i =3D 0; i < p->nr_targets; i++) { - struct cxl_endpoint_decoder *cxled =3D p->targets[i]; - struct cxl_memdev *cxlmd =3D cxled_to_memdev(cxled); - struct cxl_pmem_region_mapping *m =3D &cxlr_pmem->mapping[i]; - - /* - * Regions never span CXL root devices, so by definition the - * bridge for one device is the same for all. - */ - if (i =3D=3D 0) { - cxl_nvb =3D cxl_find_nvdimm_bridge(cxlmd->endpoint); - if (!cxl_nvb) - return -ENODEV; - cxlr->cxl_nvb =3D cxl_nvb; - } - m->cxlmd =3D cxlmd; - get_device(&cxlmd->dev); - m->start =3D cxled->dpa_res->start; - m->size =3D resource_size(cxled->dpa_res); - m->position =3D i; - } - - dev =3D &cxlr_pmem->dev; - device_initialize(dev); - lockdep_set_class(&dev->mutex, &cxl_pmem_region_key); - device_set_pm_not_required(dev); - dev->parent =3D &cxlr->dev; - dev->bus =3D &cxl_bus_type; - dev->type =3D &cxl_pmem_region_type; - cxlr_pmem->cxlr =3D cxlr; - cxlr->cxlr_pmem =3D no_free_ptr(cxlr_pmem); - - return 0; -} - static void cxl_dax_region_release(struct device *dev) { struct cxl_dax_region *cxlr_dax =3D to_cxl_dax_region(dev); @@ -3357,92 +3259,6 @@ static struct cxl_dax_region *cxl_dax_region_alloc(s= truct cxl_region *cxlr) return cxlr_dax; } =20 -static void cxlr_pmem_unregister(void *_cxlr_pmem) -{ - struct cxl_pmem_region *cxlr_pmem =3D _cxlr_pmem; - struct cxl_region *cxlr =3D cxlr_pmem->cxlr; - struct cxl_nvdimm_bridge *cxl_nvb =3D cxlr->cxl_nvb; - - /* - * Either the bridge is in ->remove() context under the device_lock(), - * or cxlr_release_nvdimm() is cancelling the bridge's release action - * for @cxlr_pmem and doing it itself (while manually holding the bridge - * lock). - */ - device_lock_assert(&cxl_nvb->dev); - cxlr->cxlr_pmem =3D NULL; - cxlr_pmem->cxlr =3D NULL; - device_unregister(&cxlr_pmem->dev); -} - -static void cxlr_release_nvdimm(void *_cxlr) -{ - struct cxl_region *cxlr =3D _cxlr; - struct cxl_nvdimm_bridge *cxl_nvb =3D cxlr->cxl_nvb; - - scoped_guard(device, &cxl_nvb->dev) { - if (cxlr->cxlr_pmem) - devm_release_action(&cxl_nvb->dev, cxlr_pmem_unregister, - cxlr->cxlr_pmem); - } - cxlr->cxl_nvb =3D NULL; - put_device(&cxl_nvb->dev); -} - -/** - * devm_cxl_add_pmem_region() - add a cxl_region-to-nd_region bridge - * @cxlr: parent CXL region for this pmem region bridge device - * - * Return: 0 on success negative error code on failure. - */ -static int devm_cxl_add_pmem_region(struct cxl_region *cxlr) -{ - struct cxl_pmem_region *cxlr_pmem; - struct cxl_nvdimm_bridge *cxl_nvb; - struct device *dev; - int rc; - - rc =3D cxl_pmem_region_alloc(cxlr); - if (rc) - return rc; - cxlr_pmem =3D cxlr->cxlr_pmem; - cxl_nvb =3D cxlr->cxl_nvb; - - dev =3D &cxlr_pmem->dev; - rc =3D dev_set_name(dev, "pmem_region%d", cxlr->id); - if (rc) - goto err; - - rc =3D device_add(dev); - if (rc) - goto err; - - dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), - dev_name(dev)); - - scoped_guard(device, &cxl_nvb->dev) { - if (cxl_nvb->dev.driver) - rc =3D devm_add_action_or_reset(&cxl_nvb->dev, - cxlr_pmem_unregister, - cxlr_pmem); - else - rc =3D -ENXIO; - } - - if (rc) - goto err_bridge; - - /* @cxlr carries a reference on @cxl_nvb until cxlr_release_nvdimm */ - return devm_add_action_or_reset(&cxlr->dev, cxlr_release_nvdimm, cxlr); - -err: - put_device(dev); -err_bridge: - put_device(&cxl_nvb->dev); - cxlr->cxl_nvb =3D NULL; - return rc; -} - static void cxlr_dax_unregister(void *_cxlr_dax) { struct cxl_dax_region *cxlr_dax =3D _cxlr_dax; --=20 2.52.0 From nobody Sun Feb 8 19:12:51 2026 Received: from mail-qk1-f179.google.com (mail-qk1-f179.google.com [209.85.222.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7694356A22 for ; Thu, 29 Jan 2026 21:05:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720707; cv=none; b=a9vpkVlgYngZDJYCC7eYoL4PNgFv5by6X8ysLYYhFKW35mn9Gl1Hqivn1ix51VH21rUEOXi6yxewavJDcKrZYEumTsf2ea5u6IEVFSsseMjQoqY8PD931pBLAUpKwYt7nVtf+DY4oZIJqzr+qH3Q05rajDwiS5QRLLbM7xZD4sk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720707; c=relaxed/simple; bh=AXe5PQvLdK8hxmdbrwIXi4vOiSDdinSnNnxoyEcMa4k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=piw+bC4/NZp1sO3Cb/gJO4BExVT+4/nsAhvlMDRNk4dsZvU9wYl5RPcWZ3SDVMS0FVAHzNq6DIXxyfqMC2ueqEngVDOf37SJSNy1nyhgxpgMMJOjma0qgivxXUTV3gYsrDKiFR9fKsMMKymCyMEnwG/tXyVMIcZJKQ4KUs1gFns= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=eSPcV3wN; arc=none smtp.client-ip=209.85.222.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="eSPcV3wN" Received: by mail-qk1-f179.google.com with SMTP id af79cd13be357-8c6b16bd040so169026385a.1 for ; Thu, 29 Jan 2026 13:05:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1769720702; x=1770325502; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lrqa+fxuwjNl7Vx5HUEIUV4yNFrGE6eFCuap5wTqfpc=; b=eSPcV3wNRUoB9dA726Xw13JkAkS5NGKczZi+Y7OtS489wl9YSTW7wlIIR7cX7J2nkv u32fg+zEuw+dhFVc8pxyjkq5VE4WK9Wu8UhtPzrp9PTad7rspX8asj8dKIh3yPdKl9va V6KyMiCNyoEoXChYxmmFd579IELX8k943oQZwEVy6D1iEF2uIKqDZO4rOOD4mNq0uex/ KoK/WkKQfGJ8a5MoSGpTlGMrpaLeizvkcty6Gu8CwK2e6bGkdn5F+2EOmQ796VdgH890 WG2burwbMMvnGxxib32Z7Os9UYBTpXG5Zv+HxxxqwBeK4fyf8amzLeQcrCKAgPEpisWm W5Aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769720702; x=1770325502; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lrqa+fxuwjNl7Vx5HUEIUV4yNFrGE6eFCuap5wTqfpc=; b=i0YulhbkM1iGXnJGO42VPUKKZP6oZ/JThk3rp6LihmDK/bq3sFjKfsO40PsZ7QOAPV kDFCj+ApwXYnaFJuhjzKNhCRx97gEHxz/iOxG5jZIVtNGxzfg68ibcLM9Z8sD3qNi/WM O1mp/tuCs+ima3I7HvJ+Sxlg5agu9/tSjIFTqTBUbeYzkXoltLSUGXEuKSSehgV3t0Zz mILw27+7/ZEyOHcqwTANd7Kj2NFzqzxjssO7pnNYEghXEhuvLbWGJsXrVfhXWBHG53d/ 0QS9gHb0ZAutwAca61TQugNBhOwGP06KZQUvStSQdQclPhmSSbRA0/EcBHVkmRDNtjqq yMdA== X-Forwarded-Encrypted: i=1; AJvYcCU1vmx0uV+ARu5RPD7PdD7aijlaehzQu8QVwtJbiYqf7UwpoC1LMJI6FnDoZ1PTgHxTqqRkvInipUUPgDw=@vger.kernel.org X-Gm-Message-State: AOJu0Yzd5b0WzgUiqDrInqul9P6bGtNgBgxuStfMDd0134zcesyfV09I B/zjqUU553cZiAVwTS0qHUPDS0wF7byQucCqC3eup1uhLbnHy7cwNxW0yMTMDmYvTLg= X-Gm-Gg: AZuq6aI6KjtREcoe7Sq/bl+NkASb+n8j0/cSPDgy+mOS98axueDu0ebJJ9MGlg/hEq7 hup8dT54MBopY12nmzIwz/Rdz6zYFUusc4Kj63aPgskQaKWe8/GlaYMFhV2FKx57W0F9UNUuK72 V4srn1wzNTo9J+cKv141vA7yP6VTzIcKZYC3QrmdfyB83yDX8UXeGKihsaUc9d1Khztjid0qX2F zRgI4EtuQ0vIPLXlyM4Mq3gffZprxhZipPVOD7iqdgUMcNtkh5gS4lJ1j4xIGHB0A4OGYhAu0p1 EqVAD6ETkvuU547MEdzwPnZNB1aspUdQ9t2fA4Fe3GVtBHSpJQc6hp85Q2IsVM2h8IKSIyN2nvN jBIAlfaBbGV6S4PEZuGun5XZKN/fhBvcmZLaDw9R/I8CRdl+q6hXU0wNX/RSlua0srikqs+jBIF 2ve0jdxQmbWUZ6y/62Jyb/iI+M3J2ArRGH08hdF1Avh11TWwhwZvfVwBdbngrURNfty00kAxf51 tI= X-Received: by 2002:a05:620a:4591:b0:8c7:1af9:b868 with SMTP id af79cd13be357-8c9eb28d35cmr167526085a.36.1769720701558; Thu, 29 Jan 2026 13:05:01 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8c71b859eaesm282041685a.46.2026.01.29.13.05.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 13:05:01 -0800 (PST) From: Gregory Price To: linux-mm@kvack.org Cc: linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, willy@infradead.org, jack@suse.cz, terry.bowman@amd.com, john@jagalactic.com Subject: [PATCH 6/9] cxl/core/region: move dax region device logic into dax_region.c Date: Thu, 29 Jan 2026 16:04:39 -0500 Message-ID: <20260129210442.3951412-7-gourry@gourry.net> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260129210442.3951412-1-gourry@gourry.net> References: <20260129210442.3951412-1-gourry@gourry.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the CXL DAX region device infrastructure from region.c into a new dax_region.c file. No functional changes. Signed-off-by: Gregory Price --- drivers/cxl/core/Makefile | 1 + drivers/cxl/core/core.h | 1 + drivers/cxl/core/dax_region.c | 113 ++++++++++++++++++++++++++++++++++ drivers/cxl/core/region.c | 102 ------------------------------ 4 files changed, 115 insertions(+), 102 deletions(-) create mode 100644 drivers/cxl/core/dax_region.c diff --git a/drivers/cxl/core/Makefile b/drivers/cxl/core/Makefile index 23269c81fd44..36f284d7c500 100644 --- a/drivers/cxl/core/Makefile +++ b/drivers/cxl/core/Makefile @@ -17,6 +17,7 @@ cxl_core-y +=3D cdat.o cxl_core-y +=3D ras.o cxl_core-$(CONFIG_TRACING) +=3D trace.o cxl_core-$(CONFIG_CXL_REGION) +=3D region.o +cxl_core-$(CONFIG_CXL_REGION) +=3D dax_region.o cxl_core-$(CONFIG_CXL_REGION) +=3D pmem_region.o cxl_core-$(CONFIG_CXL_MCE) +=3D mce.o cxl_core-$(CONFIG_CXL_FEATURES) +=3D features.o diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 26991de12d76..217dd708a2a6 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -43,6 +43,7 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port); struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 d= pa); u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa); +int devm_cxl_add_dax_region(struct cxl_region *cxlr, enum dax_driver_type); int devm_cxl_add_pmem_region(struct cxl_region *cxlr); =20 #else diff --git a/drivers/cxl/core/dax_region.c b/drivers/cxl/core/dax_region.c new file mode 100644 index 000000000000..0602db5f7248 --- /dev/null +++ b/drivers/cxl/core/dax_region.c @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright(c) 2022 Intel Corporation. All rights reserved. + * Copyright(c) 2026 Meta Technologies Inc. All rights reserved. + */ +#include +#include +#include +#include +#include +#include "core.h" + +static void cxl_dax_region_release(struct device *dev) +{ + struct cxl_dax_region *cxlr_dax =3D to_cxl_dax_region(dev); + + kfree(cxlr_dax); +} + +static const struct attribute_group *cxl_dax_region_attribute_groups[] =3D= { + &cxl_base_attribute_group, + NULL, +}; + +const struct device_type cxl_dax_region_type =3D { + .name =3D "cxl_dax_region", + .release =3D cxl_dax_region_release, + .groups =3D cxl_dax_region_attribute_groups, +}; + +static bool is_cxl_dax_region(struct device *dev) +{ + return dev->type =3D=3D &cxl_dax_region_type; +} + +struct cxl_dax_region *to_cxl_dax_region(struct device *dev) +{ + if (dev_WARN_ONCE(dev, !is_cxl_dax_region(dev), + "not a cxl_dax_region device\n")) + return NULL; + return container_of(dev, struct cxl_dax_region, dev); +} +EXPORT_SYMBOL_NS_GPL(to_cxl_dax_region, "CXL"); + +static struct lock_class_key cxl_dax_region_key; + +static struct cxl_dax_region *cxl_dax_region_alloc(struct cxl_region *cxlr) +{ + struct cxl_region_params *p =3D &cxlr->params; + struct cxl_dax_region *cxlr_dax; + struct device *dev; + + guard(rwsem_read)(&cxl_rwsem.region); + if (p->state !=3D CXL_CONFIG_COMMIT) + return ERR_PTR(-ENXIO); + + cxlr_dax =3D kzalloc(sizeof(*cxlr_dax), GFP_KERNEL); + if (!cxlr_dax) + return ERR_PTR(-ENOMEM); + + cxlr_dax->hpa_range.start =3D p->res->start; + cxlr_dax->hpa_range.end =3D p->res->end; + + dev =3D &cxlr_dax->dev; + cxlr_dax->cxlr =3D cxlr; + device_initialize(dev); + lockdep_set_class(&dev->mutex, &cxl_dax_region_key); + device_set_pm_not_required(dev); + dev->parent =3D &cxlr->dev; + dev->bus =3D &cxl_bus_type; + dev->type =3D &cxl_dax_region_type; + + return cxlr_dax; +} + +static void cxlr_dax_unregister(void *_cxlr_dax) +{ + struct cxl_dax_region *cxlr_dax =3D _cxlr_dax; + + device_unregister(&cxlr_dax->dev); +} + +int devm_cxl_add_dax_region(struct cxl_region *cxlr, + enum dax_driver_type dax_driver) +{ + struct cxl_dax_region *cxlr_dax; + struct device *dev; + int rc; + + cxlr_dax =3D cxl_dax_region_alloc(cxlr); + if (IS_ERR(cxlr_dax)) + return PTR_ERR(cxlr_dax); + + cxlr_dax->online_type =3D mhp_get_default_online_type(); + cxlr_dax->dax_driver =3D dax_driver; + dev =3D &cxlr_dax->dev; + rc =3D dev_set_name(dev, "dax_region%d", cxlr->id); + if (rc) + goto err; + + rc =3D device_add(dev); + if (rc) + goto err; + + dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), + dev_name(dev)); + + return devm_add_action_or_reset(&cxlr->dev, cxlr_dax_unregister, + cxlr_dax); +err: + put_device(dev); + return rc; +} diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index fc56f8f03805..61ec939c1462 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -3196,108 +3196,6 @@ static int region_offset_to_dpa_result(struct cxl_r= egion *cxlr, u64 offset, return -ENXIO; } =20 -static void cxl_dax_region_release(struct device *dev) -{ - struct cxl_dax_region *cxlr_dax =3D to_cxl_dax_region(dev); - - kfree(cxlr_dax); -} - -static const struct attribute_group *cxl_dax_region_attribute_groups[] =3D= { - &cxl_base_attribute_group, - NULL, -}; - -const struct device_type cxl_dax_region_type =3D { - .name =3D "cxl_dax_region", - .release =3D cxl_dax_region_release, - .groups =3D cxl_dax_region_attribute_groups, -}; - -static bool is_cxl_dax_region(struct device *dev) -{ - return dev->type =3D=3D &cxl_dax_region_type; -} - -struct cxl_dax_region *to_cxl_dax_region(struct device *dev) -{ - if (dev_WARN_ONCE(dev, !is_cxl_dax_region(dev), - "not a cxl_dax_region device\n")) - return NULL; - return container_of(dev, struct cxl_dax_region, dev); -} -EXPORT_SYMBOL_NS_GPL(to_cxl_dax_region, "CXL"); - -static struct lock_class_key cxl_dax_region_key; - -static struct cxl_dax_region *cxl_dax_region_alloc(struct cxl_region *cxlr) -{ - struct cxl_region_params *p =3D &cxlr->params; - struct cxl_dax_region *cxlr_dax; - struct device *dev; - - guard(rwsem_read)(&cxl_rwsem.region); - if (p->state !=3D CXL_CONFIG_COMMIT) - return ERR_PTR(-ENXIO); - - cxlr_dax =3D kzalloc(sizeof(*cxlr_dax), GFP_KERNEL); - if (!cxlr_dax) - return ERR_PTR(-ENOMEM); - - cxlr_dax->hpa_range.start =3D p->res->start; - cxlr_dax->hpa_range.end =3D p->res->end; - - dev =3D &cxlr_dax->dev; - cxlr_dax->cxlr =3D cxlr; - device_initialize(dev); - lockdep_set_class(&dev->mutex, &cxl_dax_region_key); - device_set_pm_not_required(dev); - dev->parent =3D &cxlr->dev; - dev->bus =3D &cxl_bus_type; - dev->type =3D &cxl_dax_region_type; - - return cxlr_dax; -} - -static void cxlr_dax_unregister(void *_cxlr_dax) -{ - struct cxl_dax_region *cxlr_dax =3D _cxlr_dax; - - device_unregister(&cxlr_dax->dev); -} - -static int devm_cxl_add_dax_region(struct cxl_region *cxlr, - enum dax_driver_type dax_driver) -{ - struct cxl_dax_region *cxlr_dax; - struct device *dev; - int rc; - - cxlr_dax =3D cxl_dax_region_alloc(cxlr); - if (IS_ERR(cxlr_dax)) - return PTR_ERR(cxlr_dax); - - cxlr_dax->online_type =3D mhp_get_default_online_type(); - cxlr_dax->dax_driver =3D dax_driver; - dev =3D &cxlr_dax->dev; - rc =3D dev_set_name(dev, "dax_region%d", cxlr->id); - if (rc) - goto err; - - rc =3D device_add(dev); - if (rc) - goto err; - - dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), - dev_name(dev)); - - return devm_add_action_or_reset(&cxlr->dev, cxlr_dax_unregister, - cxlr_dax); -err: - put_device(dev); - return rc; -} - static int match_decoder_by_range(struct device *dev, const void *data) { const struct range *r1, *r2 =3D data; --=20 2.52.0 From nobody Sun Feb 8 19:12:51 2026 Received: from mail-qv1-f43.google.com (mail-qv1-f43.google.com [209.85.219.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6404C35CB84 for ; Thu, 29 Jan 2026 21:05:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720710; cv=none; b=Cp+iovNqqMOxR1Msulebgw15G7Qp+PRiLhv50+IqG0zc2OmfOWVqNndnQl1FLJWwzCeEVHitVy8V9Si3k6/vJL2YvZaC9GCJvUKh0noIyawyud4PAxLoeWvYybr1x95ZuGxNruO2ZEEiJxoM9uRnVVaQdZG9bZ1UHsZCBADJLaA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720710; c=relaxed/simple; bh=iBrRdDjjJNCNPe98g9cITjVy6s0GzL4YINvlGeB4imc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=huaICWffwqtjunjUuFXnTuaNpG+AbBqe1rnS3uPg3hFtMNKfvZu19hiOPinVOvEUKm5kOEiEc2K5k6mpshKrGjRL6tlzkFXeQQhQd47gdqcOgA3DSOfcKY6ucoZhKA566UO+8k/HP1MOz9kjp02Cn744YxERDp42TANc5D/IQsQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=OUKin7me; arc=none smtp.client-ip=209.85.219.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="OUKin7me" Received: by mail-qv1-f43.google.com with SMTP id 6a1803df08f44-8946f12b1cfso16726256d6.0 for ; Thu, 29 Jan 2026 13:05:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1769720703; x=1770325503; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mpgSTfoH6x9FkcQxT+wr5JUESeygPnLUnHeiLg7bHkA=; b=OUKin7mehiPc0J+MFPXJDEJ07nav+vz8WRu15f/bWbDd3TZxl2kjWxtA92vxD9AM0/ VJcsTrSfMH/h7LrWf+2OR9vPUbqKILssoXvhD7g/dFAkvwI6Cos8ZgVC2Cg3ukwbeFF4 LfF2uiNj5t6eyj7Ija1WV720htkSJGf9MJM61Hd11m60So97L4Ocn48yaOV/MfCilFkM EmLpxLLJfjgwBi6Ct/o3uVB4emRpCWf4MrgPB5tvZVbg+rV/wD1/mgM6eHGqd8kfzQ/b mvWMQQ+2d8XeTNdsbpxHuOt/hBBaha2i1kZEDcUhlPEg4PkjoPBXFe1Xy+JJlrL8h0SP 8m9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769720703; x=1770325503; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=mpgSTfoH6x9FkcQxT+wr5JUESeygPnLUnHeiLg7bHkA=; b=H3r1Ud3xpedRUxQyuG+qOBjadNTYdlnOldvsPhI5MmiU5eEjW8hL57hJeCRHuvcaRQ y+2CmSleYdMbWqvYLT+S8uIKI3IlkJlCsoSduhdPsm7WFXB8xCSDgO4SWDxBFs+J62UA 1nwzqJWQjkWlV/lUinL3ED0IQJzKOhdK8/JjXqicxKQFuRNF4DZsfOAXv/4GdpHdyZ8j NDdkYX/oTbf48TFd307NQYSie/z7PVk9y1ogRYASgMPzJrsPDGR0x75bbGktblGqjnFw nciOH4z3ojxoXOEltXfCfABAGxDGEq74YePLXV3tqZXCTWBLk5lDhGEYwXrXcuGw7e++ B+sA== X-Forwarded-Encrypted: i=1; AJvYcCWtdr084mfG+TyMFWRgwY+JEtWVZxtGxy9fVTmlSJ3Y14tx9lOc/Tq2RfMyUBOrA39Ow/DSkvli4S4wwXc=@vger.kernel.org X-Gm-Message-State: AOJu0YwSvTK4E9eFFgPum62cgWqtWFdgfcM2AV9yyLTLAAApNTzixchv NnhqyYGAKCRWEI+wpc1xAZMq8yc0Y/1KutC70SFvfHB6TeZOfIl+9bO571VJISCuGRA= X-Gm-Gg: AZuq6aIDzLLzXEjroGKUqUS+OwRRnrALY5MBKs/tHdIgLkklheDebG5931gFCxV5ZzM WL4NtwJo+WYGzVVUtThG/0pwLNTiwaGISExl+7RrGtXjNryqtwzy/5ZOIwn//go2djAe++8J9do eZCljlftPc/hwq8J9hyYeXrULsV55hZEywupNTU3Pb1RHUPIWoKZvplAMWH8SNbkt3suT0150mA sGL0oJ272lCOPIza7KLWdXeI+sjq7c0hLt2XnHTZirpxkjXkxp3EZ0x0TTD2t4EaUoLv0jOZvnc onm5vHKjBpmLIEqFKNwqe9rT+6KtlG4pkFa2JNtA3X8uQWoKmk3IE9a89OCbw5C9G5SkblA7mYb 2MYKDeeYSHLOLL+1wOeMN1rzFAh5XQRfJSJN44cCek2bM1JiNI/tiP+FvccpPamz+LlMATnoqpD D5rmw9noyKHIi4hUPFYbCiB9sEQ8gnxwlQXXNFdn0Lpnt0OLg7Jo+0ERkUkHd1wW33HcmRva3Rz Fw= X-Received: by 2002:ad4:5aa2:0:b0:894:78e4:27cc with SMTP id 6a1803df08f44-894ea026eeemr11955076d6.38.1769720703415; Thu, 29 Jan 2026 13:05:03 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8c71b859eaesm282041685a.46.2026.01.29.13.05.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 13:05:03 -0800 (PST) From: Gregory Price To: linux-mm@kvack.org Cc: linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, willy@infradead.org, jack@suse.cz, terry.bowman@amd.com, john@jagalactic.com Subject: [PATCH 7/9] cxl/core: add cxl_devdax_region driver for explicit userland region binding Date: Thu, 29 Jan 2026 16:04:40 -0500 Message-ID: <20260129210442.3951412-8-gourry@gourry.net> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260129210442.3951412-1-gourry@gourry.net> References: <20260129210442.3951412-1-gourry@gourry.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a new cxl_devdax_region driver that probes CXL regions in device dax mode and creates dax_region devices. This allows explicit binding to the device_dax dax driver instead of the kmem driver. Exports to_cxl_region() to core.h so it can be used by the driver. Signed-off-by: Gregory Price --- drivers/cxl/core/core.h | 2 ++ drivers/cxl/core/dax_region.c | 16 ++++++++++++++++ drivers/cxl/core/region.c | 21 +++++++++++++++++---- drivers/cxl/cxl.h | 1 + 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index 217dd708a2a6..ea4df8abc2ad 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -46,6 +46,8 @@ u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct = cxl_memdev *cxlmd, int devm_cxl_add_dax_region(struct cxl_region *cxlr, enum dax_driver_type); int devm_cxl_add_pmem_region(struct cxl_region *cxlr); =20 +extern struct cxl_driver cxl_devdax_region_driver; + #else static inline u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa) diff --git a/drivers/cxl/core/dax_region.c b/drivers/cxl/core/dax_region.c index 0602db5f7248..391d51e5ec37 100644 --- a/drivers/cxl/core/dax_region.c +++ b/drivers/cxl/core/dax_region.c @@ -111,3 +111,19 @@ int devm_cxl_add_dax_region(struct cxl_region *cxlr, put_device(dev); return rc; } + +static int cxl_devdax_region_driver_probe(struct device *dev) +{ + struct cxl_region *cxlr =3D to_cxl_region(dev); + + if (cxlr->mode !=3D CXL_PARTMODE_RAM) + return -ENODEV; + + return devm_cxl_add_dax_region(cxlr, DAXDRV_DEVICE_TYPE); +} + +struct cxl_driver cxl_devdax_region_driver =3D { + .name =3D "cxl_devdax_region", + .probe =3D cxl_devdax_region_driver_probe, + .id =3D CXL_DEVICE_REGION, +}; diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 61ec939c1462..6200ca1cc2dd 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -39,8 +39,6 @@ */ static nodemask_t nodemask_region_seen =3D NODE_MASK_NONE; =20 -static struct cxl_region *to_cxl_region(struct device *dev); - #define __ACCESS_ATTR_RO(_level, _name) { \ .attr =3D { .name =3D __stringify(_name), .mode =3D 0444 }, \ .show =3D _name##_access##_level##_show, \ @@ -2430,7 +2428,7 @@ bool is_cxl_region(struct device *dev) } EXPORT_SYMBOL_NS_GPL(is_cxl_region, "CXL"); =20 -static struct cxl_region *to_cxl_region(struct device *dev) +struct cxl_region *to_cxl_region(struct device *dev) { if (dev_WARN_ONCE(dev, dev->type !=3D &cxl_region_type, "not a cxl_region device\n")) @@ -3726,11 +3724,26 @@ static struct cxl_driver cxl_region_driver =3D { =20 int cxl_region_init(void) { - return cxl_driver_register(&cxl_region_driver); + int rc; + + rc =3D cxl_driver_register(&cxl_region_driver); + if (rc) + return rc; + + rc =3D cxl_driver_register(&cxl_devdax_region_driver); + if (rc) + goto err_dax; + + return 0; + +err_dax: + cxl_driver_unregister(&cxl_region_driver); + return rc; } =20 void cxl_region_exit(void) { + cxl_driver_unregister(&cxl_devdax_region_driver); cxl_driver_unregister(&cxl_region_driver); } =20 diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index c06a239c0008..674d5f870c70 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -859,6 +859,7 @@ int cxl_dvsec_rr_decode(struct cxl_dev_state *cxlds, struct cxl_endpoint_dvsec_info *info); =20 bool is_cxl_region(struct device *dev); +struct cxl_region *to_cxl_region(struct device *dev); =20 extern const struct bus_type cxl_bus_type; =20 --=20 2.52.0 From nobody Sun Feb 8 19:12:51 2026 Received: from mail-qk1-f180.google.com (mail-qk1-f180.google.com [209.85.222.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A5A935D5EE for ; Thu, 29 Jan 2026 21:05:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720712; cv=none; b=O6oaSg6/J5pMlSZy4ID4JWh+lprnxCnYJxDS45tEv+fsq+D0Up45DKcH5eM0uxzzUwUZ7Mzxj3swjQ+exRISWSWvE850EimnmMXoDE2FxPczxcTwlxZ1Ai0emuEyXb7WOWA3EQKZ3cYwVjPEBUuKfNhALHucc067TaFgmRQEjQU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720712; c=relaxed/simple; bh=CqZQbtYz/ZVP4jGvHXo5e1nBzZGiUulJQNBLbQqBBEo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ij5X8D9uPuIsCeBKgrIHmbyoyjLkPS18pTCtTTQEjdf2y9gejIIasCX6DjgHQdaz1osUTRuJbCccx1sdlwtIOl4o/1iUP4lgq6h+D9Rh0fWl+oTf7ZUZE//+NihkbP6QAugakWGkrPCpT082TeJIrMQkalqiXSopmziQs5K64Og= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=qgPcdWs0; arc=none smtp.client-ip=209.85.222.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="qgPcdWs0" Received: by mail-qk1-f180.google.com with SMTP id af79cd13be357-8c5265d06c3so249613285a.1 for ; Thu, 29 Jan 2026 13:05:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1769720706; x=1770325506; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=291o5/6KJmg6RjVBO7LQXStrTekTD0wgyo4wONMNnas=; b=qgPcdWs0wA+XKLsc6FyPT48RhPLBIGcL6F924f16dy/P/7JXectLc3VZxYx2FIug+z vLTZ3bZyLYXEsVJ0YN8EuDsk1vWw+fOt/b2ecsd1OGdqI9vluzQ49uTw429u3uhQenGX cutksRap4W/OBkZwBQYkouID+6GwIBt3x+D4fR9eZxZ1kR1kAnzfnhFAjajsz33Amt7q rM1Wfp9t1IV01QDpJSXgt+JcPTdE9wLMHFkXkCGoUWO5uPdmLDiZoFPqEVC22mOcerxs 66vJL+oJJPPMOTEngwQ5NFcpT7Tr51Dair5oNPNE+qPsRreAKXpXeuiuf+/pl+u55A9F meXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769720706; x=1770325506; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=291o5/6KJmg6RjVBO7LQXStrTekTD0wgyo4wONMNnas=; b=Jfy+bg3YLNQbwFIfZM2/4L9NvgUwnNC1RVlUAZ68bQHeJNuxtl9NHa9Z6xTqFrsuSL Sph3Dcb8EYtwUIHKhEOwV6peFYaC/Z9colNVVjW3zOXn5rWNGKKjhY3MWwdiTSoB+LsR ECkx3XHbtz8TfVM5mt7nZNty7EQLAJQ8ykKIdNRvKE7TcRayAxxLkE3DUGkx2XElAyp5 RYyjFbO4S2KloKC//yMC0czfCEBPbirnbeJiPCAB/tukYPNl+MWNsKd905Z3b94Jpp8L D3FYV6rHoRcVuNUvP/LSa873dLQVPLIOM6HbJMno0UOAO8ORC0Nzw4VxVlZ2i29+rYaQ b8JA== X-Forwarded-Encrypted: i=1; AJvYcCUcKBXZtg7puK0jCj1al2C9WSo+2UPJ+bZR7TI4V3hqTF2GgeSApX0xmz7oHBLaQVsBimY/DmTz74XQTNA=@vger.kernel.org X-Gm-Message-State: AOJu0Yygk7PBXxv0lGRSm56M8mku5h6jO7wDr9G8IS3qXMUvmb05wQfO SS6xxIvE02qwQdv8as8lics+Ml1SYzjm8QLv7fBSq30n9qi2s3g6MiEDFdi2nRSC1Hw= X-Gm-Gg: AZuq6aK3MlN+yRbB6vPqLErTBdCusyoZ4jNqTiZcIkcgn+EzQLY9VwhSrdQ4o0WUkYA D57LVn64NNDLTgbJwuR+cpnds/cD4/Ynq7pRE1ei4fcLVXM48VakZWEGMkpdBsSqULM605fETI5 zg23aqTXfbpQ6JkqshPKEKd/9JMeZtr8zWoyXwDIEabcLi8wf009iqS3zHKlbVNpZF4zQ70GBY1 uBFQOYyWuh/guu/xLCXmu1nNJ1NR7ULch9AGcRbkuRVY2h5XYRBfnNv+Hyrimfk5V+LBNAJdewb CgSojOZ+e8eQcOW0GbiejI4Vc0Du8UQqVAt9kbgHP7OkUqxnjMOn7I/KJ/lUosSrVHwOaIID9PQ ZFkX5FGqLchZtEQV4BvcHGNhg0bTPaHL46of5eEnhcFEHIJaP2bhu0/H2aCenuvsFsc3zpys6mT O0BTp1/iU/gXtZfDjky9V4nb7j/SNkaoy/milOq9nAJvFMz+oB9W7mlLsP0QrMhb/azpTKVlpaz hY= X-Received: by 2002:ac8:7f84:0:b0:4f1:8bfd:bdc2 with SMTP id d75a77b69052e-5036a94de88mr60405161cf.41.1769720705646; Thu, 29 Jan 2026 13:05:05 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8c71b859eaesm282041685a.46.2026.01.29.13.05.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 13:05:05 -0800 (PST) From: Gregory Price To: linux-mm@kvack.org Cc: linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, willy@infradead.org, jack@suse.cz, terry.bowman@amd.com, john@jagalactic.com Subject: [PATCH 8/9] cxl/core: Add dax_kmem_region and sysram_region drivers Date: Thu, 29 Jan 2026 16:04:41 -0500 Message-ID: <20260129210442.3951412-9-gourry@gourry.net> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260129210442.3951412-1-gourry@gourry.net> References: <20260129210442.3951412-1-gourry@gourry.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In the current kmem driver binding process, the only way for users to define hotplug policy is via a build-time option, or by not onlining memory by default and setting each individual memory block online after hotplug occurs. We can solve this with a configuration step between region-probe and dax-probe. Add the infrastructure for a two-stage driver binding for kmem-mode dax regions. The cxl_dax_kmem_region driver probes cxl_sysram_region devices and creates cxl_dax_region with dax_driver=3Dkmem. This creates an interposition step where users can configure policy. Device hierarchy: region0 -> sysram_region0 -> dax_region0 -> dax0.0 The sysram_region device exposes a sysfs 'online_type' attribute that allows users to configure the memory online type before the underlying dax_region is created and memory is hotplugged. sysram_region0/online_type: invalid: not configured, blocks probe offline: memory will not be onlined automatically online: memory will be onlined in ZONE_NORMAL online_movable: memory will be onlined in ZONE_MMOVABLE The device initializes with online_type=3Dinvalid which prevents the cxl_dax_kmem_region driver from binding until the user explicitly configures a valid online_type. This enables a two-step binding process: echo region0 > cxl_sysram_region/bind echo online_movable > sysram_region0/online_type echo sysram_region0 > cxl_dax_kmem_region/bind Signed-off-by: Gregory Price --- Documentation/ABI/testing/sysfs-bus-cxl | 21 +++ drivers/cxl/core/Makefile | 1 + drivers/cxl/core/core.h | 6 + drivers/cxl/core/dax_region.c | 50 +++++++ drivers/cxl/core/port.c | 2 + drivers/cxl/core/region.c | 14 ++ drivers/cxl/core/sysram_region.c | 180 ++++++++++++++++++++++++ drivers/cxl/cxl.h | 25 ++++ 8 files changed, 299 insertions(+) create mode 100644 drivers/cxl/core/sysram_region.c diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/te= sting/sysfs-bus-cxl index c80a1b5a03db..a051cb86bdfc 100644 --- a/Documentation/ABI/testing/sysfs-bus-cxl +++ b/Documentation/ABI/testing/sysfs-bus-cxl @@ -624,3 +624,24 @@ Description: The count is persistent across power loss and wraps back to 0 upon overflow. If this file is not present, the device does not have the necessary support for dirty tracking. + + +What: /sys/bus/cxl/devices/sysram_regionZ/online_type +Date: January, 2026 +KernelVersion: v7.1 +Contact: linux-cxl@vger.kernel.org +Description: + (RW) This attribute allows users to configure the memory online + type before the underlying dax_region engages in hotplug. + + Valid values: + 'invalid': Not configured (default). Blocks probe. + 'offline': Memory will not be onlined automatically. + 'online' : Memory will be onlined in ZONE_NORMAL. + 'online_movable': Memory will be onlined in ZONE_MOVABLE. + + The device initializes with online_type=3D'invalid' which prevents + the cxl_dax_kmem_region driver from binding until the user + explicitly configures a valid online_type. This enables a + two-step binding process that gives users control over memory + hotplug policy before memory is added to the system. diff --git a/drivers/cxl/core/Makefile b/drivers/cxl/core/Makefile index 36f284d7c500..faf662c7d88b 100644 --- a/drivers/cxl/core/Makefile +++ b/drivers/cxl/core/Makefile @@ -18,6 +18,7 @@ cxl_core-y +=3D ras.o cxl_core-$(CONFIG_TRACING) +=3D trace.o cxl_core-$(CONFIG_CXL_REGION) +=3D region.o cxl_core-$(CONFIG_CXL_REGION) +=3D dax_region.o +cxl_core-$(CONFIG_CXL_REGION) +=3D sysram_region.o cxl_core-$(CONFIG_CXL_REGION) +=3D pmem_region.o cxl_core-$(CONFIG_CXL_MCE) +=3D mce.o cxl_core-$(CONFIG_CXL_FEATURES) +=3D features.o diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h index ea4df8abc2ad..04b32015e9b1 100644 --- a/drivers/cxl/core/core.h +++ b/drivers/cxl/core/core.h @@ -26,6 +26,7 @@ extern struct device_attribute dev_attr_delete_region; extern struct device_attribute dev_attr_region; extern const struct device_type cxl_pmem_region_type; extern const struct device_type cxl_dax_region_type; +extern const struct device_type cxl_sysram_region_type; extern const struct device_type cxl_region_type; =20 int cxl_decoder_detach(struct cxl_region *cxlr, @@ -37,6 +38,7 @@ int cxl_decoder_detach(struct cxl_region *cxlr, #define SET_CXL_REGION_ATTR(x) (&dev_attr_##x.attr), #define CXL_PMEM_REGION_TYPE(x) (&cxl_pmem_region_type) #define CXL_DAX_REGION_TYPE(x) (&cxl_dax_region_type) +#define CXL_SYSRAM_REGION_TYPE(x) (&cxl_sysram_region_type) int cxl_region_init(void); void cxl_region_exit(void); int cxl_get_poison_by_endpoint(struct cxl_port *port); @@ -44,9 +46,12 @@ struct cxl_region *cxl_dpa_to_region(const struct cxl_me= mdev *cxlmd, u64 dpa); u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, u64 dpa); int devm_cxl_add_dax_region(struct cxl_region *cxlr, enum dax_driver_type); +int devm_cxl_add_sysram_region(struct cxl_region *cxlr); int devm_cxl_add_pmem_region(struct cxl_region *cxlr); =20 extern struct cxl_driver cxl_devdax_region_driver; +extern struct cxl_driver cxl_dax_kmem_region_driver; +extern struct cxl_driver cxl_sysram_region_driver; =20 #else static inline u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, @@ -81,6 +86,7 @@ static inline void cxl_region_exit(void) #define SET_CXL_REGION_ATTR(x) #define CXL_PMEM_REGION_TYPE(x) NULL #define CXL_DAX_REGION_TYPE(x) NULL +#define CXL_SYSRAM_REGION_TYPE(x) NULL #endif =20 struct cxl_send_command; diff --git a/drivers/cxl/core/dax_region.c b/drivers/cxl/core/dax_region.c index 391d51e5ec37..a379f5b85e3d 100644 --- a/drivers/cxl/core/dax_region.c +++ b/drivers/cxl/core/dax_region.c @@ -127,3 +127,53 @@ struct cxl_driver cxl_devdax_region_driver =3D { .probe =3D cxl_devdax_region_driver_probe, .id =3D CXL_DEVICE_REGION, }; + +static int cxl_dax_kmem_region_driver_probe(struct device *dev) +{ + struct cxl_sysram_region *cxlr_sysram =3D to_cxl_sysram_region(dev); + struct cxl_dax_region *cxlr_dax; + struct cxl_region *cxlr; + int rc; + + if (!cxlr_sysram) + return -ENODEV; + + /* Require explicit online_type configuration before binding */ + if (cxlr_sysram->online_type =3D=3D -1) + return -ENODEV; + + cxlr =3D cxlr_sysram->cxlr; + + cxlr_dax =3D cxl_dax_region_alloc(cxlr); + if (IS_ERR(cxlr_dax)) + return PTR_ERR(cxlr_dax); + + /* Inherit online_type from parent sysram_region */ + cxlr_dax->online_type =3D cxlr_sysram->online_type; + cxlr_dax->dax_driver =3D DAXDRV_KMEM_TYPE; + + /* Parent is the sysram_region device */ + cxlr_dax->dev.parent =3D dev; + + rc =3D dev_set_name(&cxlr_dax->dev, "dax_region%d", cxlr->id); + if (rc) + goto err; + + rc =3D device_add(&cxlr_dax->dev); + if (rc) + goto err; + + dev_dbg(dev, "%s: register %s\n", dev_name(dev), + dev_name(&cxlr_dax->dev)); + + return devm_add_action_or_reset(dev, cxlr_dax_unregister, cxlr_dax); +err: + put_device(&cxlr_dax->dev); + return rc; +} + +struct cxl_driver cxl_dax_kmem_region_driver =3D { + .name =3D "cxl_dax_kmem_region", + .probe =3D cxl_dax_kmem_region_driver_probe, + .id =3D CXL_DEVICE_SYSRAM_REGION, +}; diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index 3310dbfae9d6..dc7262a5efd6 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -66,6 +66,8 @@ static int cxl_device_id(const struct device *dev) return CXL_DEVICE_PMEM_REGION; if (dev->type =3D=3D CXL_DAX_REGION_TYPE()) return CXL_DEVICE_DAX_REGION; + if (dev->type =3D=3D CXL_SYSRAM_REGION_TYPE()) + return CXL_DEVICE_SYSRAM_REGION; if (is_cxl_port(dev)) { if (is_cxl_root(to_cxl_port(dev))) return CXL_DEVICE_ROOT; diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 6200ca1cc2dd..8bef91dc726c 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -3734,8 +3734,20 @@ int cxl_region_init(void) if (rc) goto err_dax; =20 + rc =3D cxl_driver_register(&cxl_sysram_region_driver); + if (rc) + goto err_sysram; + + rc =3D cxl_driver_register(&cxl_dax_kmem_region_driver); + if (rc) + goto err_dax_kmem; + return 0; =20 +err_dax_kmem: + cxl_driver_unregister(&cxl_sysram_region_driver); +err_sysram: + cxl_driver_unregister(&cxl_devdax_region_driver); err_dax: cxl_driver_unregister(&cxl_region_driver); return rc; @@ -3743,6 +3755,8 @@ int cxl_region_init(void) =20 void cxl_region_exit(void) { + cxl_driver_unregister(&cxl_dax_kmem_region_driver); + cxl_driver_unregister(&cxl_sysram_region_driver); cxl_driver_unregister(&cxl_devdax_region_driver); cxl_driver_unregister(&cxl_region_driver); } diff --git a/drivers/cxl/core/sysram_region.c b/drivers/cxl/core/sysram_reg= ion.c new file mode 100644 index 000000000000..5665db238d0f --- /dev/null +++ b/drivers/cxl/core/sysram_region.c @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright(c) 2026 Meta Platforms, Inc. All rights reserved. */ +/* + * CXL Sysram Region - Intermediate device for kmem hotplug configuration + * + * This provides an intermediate device between cxl_region and cxl_dax_reg= ion + * that allows users to configure memory hotplug parameters (like online_t= ype) + * before the underlying dax_region is created and memory is hotplugged. + */ + +#include +#include +#include +#include +#include +#include "core.h" + +static void cxl_sysram_region_release(struct device *dev) +{ + struct cxl_sysram_region *cxlr_sysram =3D to_cxl_sysram_region(dev); + + kfree(cxlr_sysram); +} + +static ssize_t online_type_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct cxl_sysram_region *cxlr_sysram =3D to_cxl_sysram_region(dev); + + switch (cxlr_sysram->online_type) { + case MMOP_OFFLINE: + return sysfs_emit(buf, "offline\n"); + case MMOP_ONLINE: + return sysfs_emit(buf, "online\n"); + case MMOP_ONLINE_MOVABLE: + return sysfs_emit(buf, "online_movable\n"); + default: + return sysfs_emit(buf, "invalid\n"); + } +} + +static ssize_t online_type_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct cxl_sysram_region *cxlr_sysram =3D to_cxl_sysram_region(dev); + + if (sysfs_streq(buf, "offline")) + cxlr_sysram->online_type =3D MMOP_OFFLINE; + else if (sysfs_streq(buf, "online")) + cxlr_sysram->online_type =3D MMOP_ONLINE; + else if (sysfs_streq(buf, "online_movable")) + cxlr_sysram->online_type =3D MMOP_ONLINE_MOVABLE; + else + return -EINVAL; + + return len; +} + +static DEVICE_ATTR_RW(online_type); + +static struct attribute *cxl_sysram_region_attrs[] =3D { + &dev_attr_online_type.attr, + NULL, +}; + +static const struct attribute_group cxl_sysram_region_attribute_group =3D { + .attrs =3D cxl_sysram_region_attrs, +}; + +static const struct attribute_group *cxl_sysram_region_attribute_groups[] = =3D { + &cxl_base_attribute_group, + &cxl_sysram_region_attribute_group, + NULL, +}; + +const struct device_type cxl_sysram_region_type =3D { + .name =3D "cxl_sysram_region", + .release =3D cxl_sysram_region_release, + .groups =3D cxl_sysram_region_attribute_groups, +}; + +static bool is_cxl_sysram_region(struct device *dev) +{ + return dev->type =3D=3D &cxl_sysram_region_type; +} + +struct cxl_sysram_region *to_cxl_sysram_region(struct device *dev) +{ + if (dev_WARN_ONCE(dev, !is_cxl_sysram_region(dev), + "not a cxl_sysram_region device\n")) + return NULL; + return container_of(dev, struct cxl_sysram_region, dev); +} +EXPORT_SYMBOL_NS_GPL(to_cxl_sysram_region, "CXL"); + +static struct lock_class_key cxl_sysram_region_key; + +static struct cxl_sysram_region *cxl_sysram_region_alloc(struct cxl_region= *cxlr) +{ + struct cxl_region_params *p =3D &cxlr->params; + struct cxl_sysram_region *cxlr_sysram; + struct device *dev; + + guard(rwsem_read)(&cxl_rwsem.region); + if (p->state !=3D CXL_CONFIG_COMMIT) + return ERR_PTR(-ENXIO); + + cxlr_sysram =3D kzalloc(sizeof(*cxlr_sysram), GFP_KERNEL); + if (!cxlr_sysram) + return ERR_PTR(-ENOMEM); + + cxlr_sysram->hpa_range.start =3D p->res->start; + cxlr_sysram->hpa_range.end =3D p->res->end; + cxlr_sysram->online_type =3D -1; /* Require explicit configuration */ + + dev =3D &cxlr_sysram->dev; + cxlr_sysram->cxlr =3D cxlr; + device_initialize(dev); + lockdep_set_class(&dev->mutex, &cxl_sysram_region_key); + device_set_pm_not_required(dev); + dev->parent =3D &cxlr->dev; + dev->bus =3D &cxl_bus_type; + dev->type =3D &cxl_sysram_region_type; + + return cxlr_sysram; +} + +static void cxlr_sysram_unregister(void *_cxlr_sysram) +{ + struct cxl_sysram_region *cxlr_sysram =3D _cxlr_sysram; + + device_unregister(&cxlr_sysram->dev); +} + +int devm_cxl_add_sysram_region(struct cxl_region *cxlr) +{ + struct cxl_sysram_region *cxlr_sysram; + struct device *dev; + int rc; + + cxlr_sysram =3D cxl_sysram_region_alloc(cxlr); + if (IS_ERR(cxlr_sysram)) + return PTR_ERR(cxlr_sysram); + + dev =3D &cxlr_sysram->dev; + rc =3D dev_set_name(dev, "sysram_region%d", cxlr->id); + if (rc) + goto err; + + rc =3D device_add(dev); + if (rc) + goto err; + + dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent), + dev_name(dev)); + + return devm_add_action_or_reset(&cxlr->dev, cxlr_sysram_unregister, + cxlr_sysram); +err: + put_device(dev); + return rc; +} + +static int cxl_sysram_region_driver_probe(struct device *dev) +{ + struct cxl_region *cxlr =3D to_cxl_region(dev); + + /* Only handle RAM regions */ + if (cxlr->mode !=3D CXL_PARTMODE_RAM) + return -ENODEV; + + return devm_cxl_add_sysram_region(cxlr); +} + +struct cxl_driver cxl_sysram_region_driver =3D { + .name =3D "cxl_sysram_region", + .probe =3D cxl_sysram_region_driver_probe, + .id =3D CXL_DEVICE_REGION, +}; diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index 674d5f870c70..1544c27e9c89 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -596,6 +596,25 @@ struct cxl_dax_region { enum dax_driver_type dax_driver; }; =20 +/** + * struct cxl_sysram_region - CXL RAM region for system memory hotplug + * @dev: device for this sysram_region + * @cxlr: parent cxl_region + * @hpa_range: Host physical address range for the region + * @online_type: Memory online type (MMOP_* 0-3, or -1 if not configured) + * + * Intermediate device that allows configuration of memory hotplug + * parameters before the underlying dax_region is created. The device + * starts with online_type=3D-1 which prevents the cxl_dax_kmem_region + * driver from binding until the user explicitly sets online_type. + */ +struct cxl_sysram_region { + struct device dev; + struct cxl_region *cxlr; + struct range hpa_range; + int online_type; +}; + /** * struct cxl_port - logical collection of upstream port devices and * downstream port devices to construct a CXL memory @@ -890,6 +909,7 @@ void cxl_driver_unregister(struct cxl_driver *cxl_drv); #define CXL_DEVICE_PMEM_REGION 7 #define CXL_DEVICE_DAX_REGION 8 #define CXL_DEVICE_PMU 9 +#define CXL_DEVICE_SYSRAM_REGION 10 =20 #define MODULE_ALIAS_CXL(type) MODULE_ALIAS("cxl:t" __stringify(type) "*") #define CXL_MODALIAS_FMT "cxl:t%d" @@ -907,6 +927,7 @@ bool is_cxl_pmem_region(struct device *dev); struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev); int cxl_add_to_region(struct cxl_endpoint_decoder *cxled); struct cxl_dax_region *to_cxl_dax_region(struct device *dev); +struct cxl_sysram_region *to_cxl_sysram_region(struct device *dev); u64 cxl_port_get_spa_cache_alias(struct cxl_port *endpoint, u64 spa); #else static inline bool is_cxl_pmem_region(struct device *dev) @@ -925,6 +946,10 @@ static inline struct cxl_dax_region *to_cxl_dax_region= (struct device *dev) { return NULL; } +static inline struct cxl_sysram_region *to_cxl_sysram_region(struct device= *dev) +{ + return NULL; +} static inline u64 cxl_port_get_spa_cache_alias(struct cxl_port *endpoint, u64 spa) { --=20 2.52.0 From nobody Sun Feb 8 19:12:51 2026 Received: from mail-qk1-f194.google.com (mail-qk1-f194.google.com [209.85.222.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5131C35C198 for ; Thu, 29 Jan 2026 21:05:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.194 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720712; cv=none; b=Ll3H/3Srk6D+n0ub7zBtJcUV63K7TFmO5/hydQEfSIV4SrCue7jvScBZjS4cbEqEYNEEqQuopBe3SKoPi5pyIEK0CO71+j2iKAc5orEQgpx7DId5EZJUClaLLO9I/9g+dvTrLxRSDB+VsdZHEi0+/+oo6ZxkB+CFluqJNUNa3Tk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769720712; c=relaxed/simple; bh=Ysme87URA8h80dz3v+yZIs8qliOaAmjArpOmGNPSVUI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q12wH/UX6o2UtSPZJDc16FQZ2irATjI6mvGcTZmmIWdvJEhWppyHu22wYM4mlICRQ8shpIJEU1ZNXg2t27DcdWogulObUYpj3//iSogdaTFebRUdnFmR6KvBu7fHYs6Utoe0vxF8vRyI+k3AooDzgjmKXSvi223B+fhLXnpQzaA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net; spf=pass smtp.mailfrom=gourry.net; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b=QmxxnYP9; arc=none smtp.client-ip=209.85.222.194 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gourry.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gourry.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gourry.net header.i=@gourry.net header.b="QmxxnYP9" Received: by mail-qk1-f194.google.com with SMTP id af79cd13be357-8c5320536bfso138520785a.1 for ; Thu, 29 Jan 2026 13:05:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1769720708; x=1770325508; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2izjfMr9wFUktZXLnWxTLQ+Uf13Bf1lvXAJZzNDICcs=; b=QmxxnYP9qHqlX5teNx+fVssa6DDhCzWbcI8iRZ9qLS4T3A29ArWI7Yu3NRGNyq7euZ lqS8/NeIgmYLUmi3GxySKkroid0G1b8vXKX8PuW+mBk+QAsPcXm470wilU6yfHMowbMQ epubSFk+CkBbixUrXGBerZKw/U2NoQNczMzprZ3AAX5Vr4AAANFC+JxzGKEhZRtMnzyX 3uMSJN4OYc/7dS8I08Oi6iLXveO1yZywqcVZWP8h2zJVsLGxWo5p3Y+HyIN0+nXXxCG2 RIDF1t++cOFMIw+zzv37v6DELRkVluXfCMfnVsxP3zbA07W7t3eAL+1Sm5+JJXYZFojP yztg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769720708; x=1770325508; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2izjfMr9wFUktZXLnWxTLQ+Uf13Bf1lvXAJZzNDICcs=; b=eMkFVaXTaBjPZnQrj8ZylQ+x1r7TNozsOEscckQzokZshgrH0cUmcmi7LRmraGmeXA cnJIRFAb69JRsbCn7cYGW3d6zRBFVKhX0w36CdmOvc43HjskHkEQw4bE1+a0oH6wkqRb +IQ5j+C1fhqD4Mfym+sOOQeKoNyaSr2mh++Ic7UgSjHIbKplbvFyeVDM0sQWQCZ1RF0S 6eYCsZzm1ntBgTo1adoE0PgldA7jV1Er8uLd+bEH6eDs8FOmxJwI+anf6zJhtxqt9fu1 GRMJfDeA+iJSUpYbB25LU0R9kD2cXyZHUDwTBxVP4toQCorGzUMgxYkNxNNfocDY0fab T7uQ== X-Forwarded-Encrypted: i=1; AJvYcCVxvqBjZdKjXsneW1jJ0rA7XzIcPX2UimPH4bD2nHK7JKwZeg7AGy+6oxHJBXk9IQJAOaDivt4C7pyWyHQ=@vger.kernel.org X-Gm-Message-State: AOJu0Ywo0BJDaWC+xIwxgnx3qVOg1x8viOFLAgypX+sAjEZ1yEIgeSGW o8V+yYpS0iITrWALaVNAlD/1Ca8CLAOxvFFf81pZyv5NF4zdhSzsODgyCqog/oc1NK4= X-Gm-Gg: AZuq6aIPFIx/veAm+NWszGtZv1R+RdnBwfdJldnwIPrM+UCh4buo2f7e0odNJ2p5Rhr nar13eN58aUu/0cM4b1IWVh2/ndY1alJXdf6APpytyZGO6HDILKSXxr7d/Elstp2XiTTdPbSZCG T/9BNpFNN4svTbHVvzhXXVTVRsN0/R1obVUCHyDeFYGsw9FLKkIeaYIB+l3wICnapCLUJPoHxKo i9Kqbs+3t6tfrpXdNNGB9vsIyZpbQ7ONMcNMkiwjpZG4DKDDpCHV2E7QpC2N+tE6RDePQy05yTn 5h4I+TnnhmdN7PEfhMhEKck0ZjO2xl3yheds8hw/KtPuLG1XWAwzHBObdPOT4i4yYslS9Wcefaj RVEypQRjVTUmCDmWmSmYPtId+uUkjVQCpIB+3Oaa2FzFuB5KsDEY+VSri92jeEqMykPFgzOFjSC RinHhfeOswyXvRR499VTgRldgMOVM2weJAf33chFm2Beaq8to5Biy0vWcdou3TP32xUKa4XYdT3 nsL+4cHA9lwqQ== X-Received: by 2002:a05:620a:2845:b0:8a4:e7f6:bf57 with SMTP id af79cd13be357-8c9eb258c5dmr134323385a.5.1769720708025; Thu, 29 Jan 2026 13:05:08 -0800 (PST) Received: from gourry-fedora-PF4VCD3F.lan (pool-96-255-20-138.washdc.ftas.verizon.net. [96.255.20.138]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8c71b859eaesm282041685a.46.2026.01.29.13.05.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 13:05:07 -0800 (PST) From: Gregory Price To: linux-mm@kvack.org Cc: linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, dave@stgolabs.net, jonathan.cameron@huawei.com, dave.jiang@intel.com, alison.schofield@intel.com, vishal.l.verma@intel.com, ira.weiny@intel.com, dan.j.williams@intel.com, willy@infradead.org, jack@suse.cz, terry.bowman@amd.com, john@jagalactic.com Subject: [PATCH 9/9] Documentation/driver-api/cxl: add dax and sysram driver documentation Date: Thu, 29 Jan 2026 16:04:42 -0500 Message-ID: <20260129210442.3951412-10-gourry@gourry.net> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260129210442.3951412-1-gourry@gourry.net> References: <20260129210442.3951412-1-gourry@gourry.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Explain the binding process for sysram and daxdev regions which are explicit about which dax driver to use during region creation. Jonathan Corbet =20 Signed-off-by: Gregory Price --- .../driver-api/cxl/linux/cxl-driver.rst | 43 +++++++++++++++++++ .../driver-api/cxl/linux/dax-driver.rst | 29 +++++++++++++ 2 files changed, 72 insertions(+) diff --git a/Documentation/driver-api/cxl/linux/cxl-driver.rst b/Documentat= ion/driver-api/cxl/linux/cxl-driver.rst index dd6dd17dc536..1f857345e896 100644 --- a/Documentation/driver-api/cxl/linux/cxl-driver.rst +++ b/Documentation/driver-api/cxl/linux/cxl-driver.rst @@ -445,6 +445,49 @@ for more details. :: dax0.0 devtype modalias uevent dax_region driver subsystem =20 +DAX regions are created when a CXL RAM region is bound to one of the +following drivers: + +* :code:`cxl_devdax_region` - Creates a dax_region for device_dax mode. + The resulting DAX device provides direct userspace access via + :code:`/dev/daxN.Y`. + +* :code:`cxl_dax_kmem_region` - Creates a dax_region for kmem mode via a + sysram_region intermediate device. See `Sysram Region`_ below. + +Sysram Region +~~~~~~~~~~~~~ +A `Sysram Region` is an intermediate device between a CXL `Memory Region` +and a `DAX Region` for kmem mode. It is created when a CXL RAM region is +bound to the :code:`cxl_sysram_region` driver. + +The sysram_region device provides an interposition point where users can +configure memory hotplug policy before the underlying dax_region is created +and memory is hotplugged to the system. + +The device hierarchy for kmem mode is:: + + regionX -> sysram_regionX -> dax_regionX -> daxX.Y + +The sysram_region exposes an :code:`online_type` attribute that controls +how memory will be onlined when the dax_kmem driver binds: + +* :code:`invalid` - Not configured (default). Blocks driver binding. +* :code:`offline` - Memory will not be onlined automatically. +* :code:`online` - Memory will be onlined in ZONE_NORMAL. +* :code:`online_movable` - Memory will be onlined in ZONE_MOVABLE. + +Example two-stage binding process:: + + # Bind region to sysram_region driver + echo region0 > /sys/bus/cxl/drivers/cxl_sysram_region/bind + + # Configure memory online type + echo online_movable > /sys/bus/cxl/devices/sysram_region0/online_type + + # Bind sysram_region to dax_kmem_region driver + echo sysram_region0 > /sys/bus/cxl/drivers/cxl_dax_kmem_region/bind + Mailbox Interfaces ------------------ A mailbox command interface for each device is exposed in :: diff --git a/Documentation/driver-api/cxl/linux/dax-driver.rst b/Documentat= ion/driver-api/cxl/linux/dax-driver.rst index 10d953a2167b..2b8e21736292 100644 --- a/Documentation/driver-api/cxl/linux/dax-driver.rst +++ b/Documentation/driver-api/cxl/linux/dax-driver.rst @@ -17,6 +17,35 @@ The DAX subsystem exposes this ability through the `cxl_= dax_region` driver. A `dax_region` provides the translation between a CXL `memory_region` and a `DAX Device`. =20 +CXL DAX Region Drivers +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +CXL provides multiple drivers for creating DAX regions, each suited for +different use cases: + +cxl_devdax_region +----------------- +The :code:`cxl_devdax_region` driver creates a dax_region configured for +device_dax mode. When a CXL RAM region is bound to this driver, the +resulting DAX device provides direct userspace access via :code:`/dev/daxN= .Y`. + +Device hierarchy:: + + regionX -> dax_regionX -> daxX.Y + +This is the simplest path for applications that want to manage CXL memory +directly from userspace. + +cxl_dax_kmem_region +------------------- +For kmem mode, CXL provides a two-stage binding process that allows users +to configure memory hotplug policy before memory is added to the system. + +The :code:`cxl_dax_kmem_region` driver then binds a sysram_region +device and creates a dax_region configured for kmem mode. + +The :code:`online_type` policy will be passed from sysram_region to +the dax kmem driver for use when hotplugging the memory. + DAX Device =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D A `DAX Device` is a file-like interface exposed in :code:`/dev/daxN.Y`. A --=20 2.52.0