From nobody Fri Jul 24 22:55:04 2026 Received: from mail-qt1-f176.google.com (mail-qt1-f176.google.com [209.85.160.176]) (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 802A53B8105 for ; Wed, 22 Jul 2026 18:35:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745329; cv=none; b=XLmh4h9a3rxVO6v3fE/HhCfG5To8/A7qMjjp7P8OwNdOOLIK7FiLDZF057kN4hEcqvDQZI/hoOdkaQjcKvO4idnVgEa0FW1hKetRe6vlfvW7rx3pQryLSrg3XOQ7tYbH7r0LeYrKP16ZNCsBTLtnTKgFCr7zpXaIYuV7chwC5kw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745329; c=relaxed/simple; bh=17xpFpa5YRnGNcYvBWqNUbnxwE6UGTg1b8TiOR8UmHc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MBhHlkq79iw/AIxf/6dtRBwnjpOcvT9d1pKmCc0OT2ZKjNsRwsYxAm3/VwFx9hLOctnbgeKxj0BI4uuNI464Rl4oYdFKaZfNkjXomR6RGi9YQwRDUJqXENp4sYAjZ2RmIkdd7H0HVQTEXiDspCjjokFZyHVpNLkYWaumQv7Pd/k= 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=DFKkCMgY; arc=none smtp.client-ip=209.85.160.176 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="DFKkCMgY" Received: by mail-qt1-f176.google.com with SMTP id d75a77b69052e-51c5382806fso82213801cf.2 for ; Wed, 22 Jul 2026 11:35:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1784745326; x=1785350126; 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:content-type; bh=Pm5BZ9qJgkVevAwG5CFNqV+xwvYk7oAu9XFj5gld8ew=; b=DFKkCMgYuHhfHygeKuOz2qeB49pxidY/bvOiflmnE63/Df0KGZUh4FS7A2ZoXJzQjd C/pbPaJPXiAcMdVf9R7TwuQK44M5nUXvhNqd5oZ9R+2iv8PfSLd69JtioafhC5bx/vhj Z0nUMhvX/11ony+tB1KnXxyk3ucitvQVSNLSTlZQ3BPD0ECjUgxTIFwQG9md/K4AKuyO EudUDRZVgbTsiJ55Z4ymVq+L2ohXXuoYzL03Yk0SVSHfOYgfU0gX04yYPUW14Ip6Uylh T6MTddqN43Ij6kgLRRLZOjf0W/4lKteWVTkBHVMo3bf7Npd704JjLFCJCdY9dvSlSR5b H3+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784745326; x=1785350126; 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:content-type; bh=Pm5BZ9qJgkVevAwG5CFNqV+xwvYk7oAu9XFj5gld8ew=; b=KBa++Tksttiftkn+raWTyH9+jwicUe+QYvibcyAt/LylRd7PSPvm2pWu85YuBC21Cc kuivqS5i/VpF99aNs4/ZosqMo/cnbsbDAJ7R2tcjWlRHcR8XVIqiYXfYXQQcEdNg9sdm WlOTMeRrahAbmvedtE45QQIedhfCv9y0sbi/cCZacXpKGTc6ryCmuJ9HM1e9cHD/I2jM d2wXiQVFAEGdoNES0oQvHJRIBFFx+FZ7fXHMymJhpHtNn9tQbyFap3JEZ+PMUYlF8lMp I0E7CMbNpVbqmZqyzGKaru0vI+Gk+f0z/X5XWgzFf0sis8W/wz8OQyfq29f/+Yp0od+X A3og== X-Forwarded-Encrypted: i=1; AHgh+Rp48FNOqvFXv79KlknrdwRvLyFY4+KuuZ4GWuECsQVoB954GFXSsT/0I4JxkCHSSdYPUGflcHWqYeoNYJk=@vger.kernel.org X-Gm-Message-State: AOJu0YyU6L/g0Aku+1H0sOxDQCfezzQ+wVwdTSOQ/dedksr/t9gnib5p 7kO12DbD6pgDSUGM+bxyB8IRG33yeWOpN47rPkrjfdOENQhu/sOaIY54zPBdx362tajWM3kVjz8 gzVjL X-Gm-Gg: AR+sD10XotGKk4BSLDv00gdv9a9WWAZPDFda7fN4XpanEb7fqsk3PJWeW6IE+Gk8Pva +sBCw9OlvUtiDL7EAoh6GG3kph+M7J5PEr+Zc+3MJc1T2tNFpE5v3h52zUHns2wL7JFFBRee9Cu dKkh1kmlj4gXabADSaXOHG1/uMR/EV+K78mP5sNlfLteuSsP+Zxon8dcHxtUgpjbuHN0uj74XNO Gy3vs9LhoANVqvIrZABWbw7FsN6yPHyUKgy2mcNTSDxAd7OEz6QvDjm63BvDYc/gpRuKgdNj8lc 5PcA/HfqqcRfdblIgHmZ/iUkx5B/TxX9EamlsqDx2b3j53sJyA1HvErvEfCCGQItOF8f/20b8Y8 E/e09GGFJB4RKnUbfTjFPTciTW8BrpUkHDd0s/guy0jsh8RA1+VYq0Z4ZXnq3Tji1eRNO27x+mZ dr5Aj4YEZ+L9esM3JsKRPNKkoqZ31HHZEBELWraRmbvKpg2McxVYM/EtHu++kCk+Y= X-Received: by 2002:a05:622a:349:b0:527:f4d0:4bb7 with SMTP id d75a77b69052e-527f4d05517mr42226231cf.52.1784745326076; Wed, 22 Jul 2026 11:35:26 -0700 (PDT) Received: from gourry-fedora-PF4VCD3F.lan (pool-173-79-60-52.washdc.fios.verizon.net. [173.79.60.52]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-907ba8b3e96sm27630216d6.1.2026.07.22.11.35.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 11:35:25 -0700 (PDT) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-team@meta.com, djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, alison.schofield@intel.com Subject: [RFC PATCH 1/8] dax/kmem: add dax_file= to expose an anonymous-fault char device Date: Wed, 22 Jul 2026 14:35:12 -0400 Message-ID: <20260722183519.935213-2-gourry@gourry.net> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260722183519.935213-1-gourry@gourry.net> References: <20260722183519.935213-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 "dax_file" knob to dax/kmem. When set, installs a char device on the existing /dev/daxN.N whose mmap() turns the mapping into an ordinary ANONYMOUS mapping bound to the device's node - so every folio (on fault and swap-in) lands on that node exactly like an mbind() to it. Writing 0 removes the char device again. Because kmem devices hotplug memory to mm/, faulted memory is NOT limited to just the dax device's memory ranges. This is not particularly useful for normal nodes, but will be useful for private nodes where each node can only have one owner - and therefore the faults are limited to the device's memory ranges. Note: The mapping is deliberately not S_DAX - otherwise the vma would be wrongly excluded from migration, NUMA balancing, and the like. The node binding is a device-lifetime mempolicy, built once at online time. A plain fault would place the first folio correctly without it, but swap-in would likely misplace the folio, so the policy is what keeps the mapping pinned to the node. MAP_SHARED is rejected (no shared mappings are possible here). Signed-off-by: Gregory Price --- drivers/dax/kmem.c | 171 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 1 deletion(-) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index c3faf18e7f85d..d9021cf148982 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -5,11 +5,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -45,8 +47,11 @@ static int dax_kmem_range(struct dev_dax *dev_dax, int i= , struct range *r) struct dax_kmem_data { const char *res_name; int mgid; + int numa_node; int state; - struct mutex lock; /* protects hotplug state transitions */ + struct mutex lock; /* protects hotplug state transitions and config */ + bool dax_file; /* when set, cdev allows mmap */ + struct mempolicy *policy; /* device-lifetime bind for dax-file mmap */ struct resource *res[]; }; =20 @@ -65,6 +70,90 @@ static void kmem_put_memory_types(void) mt_put_memory_types(&kmem_memory_types); } =20 +#ifdef CONFIG_NUMA +static void kmem_vma_set_policy(struct vm_area_struct *vma, struct mempoli= cy *pol) +{ + vma->vm_policy =3D pol; +} +#else +static void kmem_vma_set_policy(struct vm_area_struct *vma, struct mempoli= cy *pol) +{ +} +#endif + +/* + * On mmap, install MPOL_F_PRIVATE mempolicy to bind to that node's memory, + * so every folio (fault and swap-in) lands on the node exactly like an mb= ind(). + * Only present when dax_file=3Dtrue, otherwise returns -ENXIO as before. + */ +static int kmem_anon_mmap(struct file *filp, struct vm_area_struct *vma) +{ + struct dev_dax *dev_dax =3D filp->private_data; + struct dax_kmem_data *data =3D dev_get_drvdata(&dev_dax->dev); + int rc =3D 0, id; + + id =3D dax_read_lock(); + if (!dax_alive(dev_dax->dax_dev)) + rc =3D -ENXIO; + dax_read_unlock(id); + if (rc) + return rc; + + /* Private mappings are not shared by definition, reject MAP_SHARED. */ + if (vma->vm_flags & VM_SHARED) + return -EINVAL; + + /* No policy means the node is not online yet - nothing to map. */ + if (!data->policy) + return -ENXIO; + + vma_set_anonymous(vma); + mpol_get(data->policy); + kmem_vma_set_policy(vma, data->policy); + return 0; +} + +static int kmem_anon_open(struct inode *inode, struct file *filp) +{ + struct dax_device *dax_dev =3D inode_dax(inode); + struct dev_dax *dev_dax =3D dax_get_private(dax_dev); + + filp->private_data =3D dev_dax; + /* Deliberately NOT S_DAX to allow normal mm/ operations on the vma */ + return 0; +} + +static const struct file_operations kmem_anon_fops =3D { + .llseek =3D noop_llseek, + .owner =3D THIS_MODULE, + .open =3D kmem_anon_open, + .mmap =3D kmem_anon_mmap, +}; + +/* Installs dax-file char device fops on the existing /dev/daxN.N node. */ +static int kmem_dax_file_cdev_add(struct dev_dax *dev_dax) +{ + struct dax_device *dax_dev =3D dev_dax->dax_dev; + struct device *dev =3D &dev_dax->dev; + struct cdev *cdev =3D dax_inode(dax_dev)->i_cdev; + int rc; + + cdev_init(cdev, &kmem_anon_fops); + cdev->owner =3D dev->driver->owner; + cdev_set_parent(cdev, &dev->kobj); + rc =3D cdev_add(cdev, dev->devt, 1); + if (rc) + return rc; + run_dax(dax_dev); + return 0; +} + +static void kmem_dax_file_cdev_del(struct dev_dax *dev_dax) +{ + kill_dev_dax(dev_dax); + cdev_del(dax_inode(dev_dax->dax_dev)->i_cdev); +} + /* True for the online states a kmem dax device can hold. */ static bool dax_kmem_state_is_online(int state) { @@ -339,6 +428,7 @@ static ssize_t state_store(struct device *dev, struct d= evice_attribute *attr, { struct dev_dax *dev_dax =3D to_dev_dax(dev); struct dax_kmem_data *data =3D dev_get_drvdata(dev); + struct mempolicy *pol; int online_type; int rc; =20 @@ -377,8 +467,69 @@ static ssize_t state_store(struct device *dev, struct = device_attribute *attr, } =20 data->state =3D online_type; + + /* If in dax-file mode, build the bind policy applied during mmap */ + if (data->dax_file && !data->policy) { + pol =3D mpol_private_bind(data->numa_node); + if (IS_ERR(pol)) + dev_warn(dev, "dax-file bind failed: %ld\n", PTR_ERR(pol)); + else + data->policy =3D pol; + } + + return len; +} + +static ssize_t dax_file_show(struct device *dev, struct device_attribute *= attr, + char *buf) +{ + struct dax_kmem_data *data =3D dev_get_drvdata(dev); + + if (!data) + return -ENXIO; + return sysfs_emit(buf, "%d\n", data->dax_file); +} + +static ssize_t dax_file_store(struct device *dev, struct device_attribute = *attr, + const char *buf, size_t len) +{ + struct dev_dax *dev_dax =3D to_dev_dax(dev); + struct dax_kmem_data *data =3D dev_get_drvdata(dev); + bool enable; + int rc; + + if (!data) + return -ENXIO; + + rc =3D kstrtobool(buf, &enable); + if (rc) + return rc; + + guard(mutex)(&data->lock); + + /* dax_file=3D only reconfigures the device while it holds no memory. */ + if (data->state !=3D DAX_KMEM_UNPLUGGED) + return -EBUSY; + + if (enable =3D=3D data->dax_file) + return len; + + if (enable) { + /* Add the anon-fault cdev; mmap returns -ENXIO until onlined. */ + rc =3D kmem_dax_file_cdev_add(dev_dax); + if (rc) + return rc; + data->dax_file =3D true; + } else { + kmem_dax_file_cdev_del(dev_dax); + mpol_put(data->policy); + data->policy =3D NULL; + data->dax_file =3D false; + } + return len; } +static DEVICE_ATTR_RW(dax_file); =20 static int dev_dax_kmem_probe(struct dev_dax *dev_dax) { @@ -448,6 +599,7 @@ static int dev_dax_kmem_probe(struct dev_dax *dev_dax) if (rc < 0) goto err_reg_mgid; data->mgid =3D rc; + data->numa_node =3D numa_node; data->state =3D DAX_KMEM_UNPLUGGED; mutex_init(&data->lock); =20 @@ -516,6 +668,13 @@ static void dev_dax_kmem_remove(struct dev_dax *dev_da= x) struct device *dev =3D &dev_dax->dev; struct dax_kmem_data *data =3D dev_get_drvdata(dev); =20 + /* If enabled, clean up the dax-file char device configuration. */ + if (data->dax_file) { + kmem_dax_file_cdev_del(dev_dax); + mpol_put(data->policy); + data->policy =3D NULL; + } + /* * Remove every range that is still added. dax_kmem_remove_ranges() * uses remove_memory(), which never offlines: an online block fails @@ -548,6 +707,15 @@ static void dev_dax_kmem_remove(struct dev_dax *dev_da= x) #else static void dev_dax_kmem_remove(struct dev_dax *dev_dax) { + struct dax_kmem_data *data =3D dev_get_drvdata(&dev_dax->dev); + + /* If enabled, clean up the dax-file char device configuration. */ + if (data && data->dax_file) { + kmem_dax_file_cdev_del(dev_dax); + mpol_put(data->policy); + data->policy =3D NULL; + } + /* * Without hotremove purposely leak the request_mem_region() for the * device-dax range and return '0' to ->remove() attempts. The removal @@ -563,6 +731,7 @@ static DEVICE_ATTR_RW(state); =20 static struct attribute *dev_dax_kmem_attrs[] =3D { &dev_attr_state.attr, + &dev_attr_dax_file.attr, NULL, }; ATTRIBUTE_GROUPS(dev_dax_kmem); --=20 2.53.0-Meta From nobody Fri Jul 24 22:55:04 2026 Received: from mail-qv1-f45.google.com (mail-qv1-f45.google.com [209.85.219.45]) (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 C5944368D4A for ; Wed, 22 Jul 2026 18:35:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745330; cv=none; b=mTTe8VxEgbjbsVIsxbfdIx6kDouSA80Jy4VU4gbR1Bmpwp8tt9uCp250Jx3R98vffv/LEt4n+eL230Yp1UxO+A1xGVlK7dYIIetcuToYhl/KOpa5sJmATbLUqTgG/31ThHQApMDpw12jTd7u+Y11OEfF5LmcLXrDpowLmY06apk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745330; c=relaxed/simple; bh=5oK9iWBVO5m3icq9mZsHdP4HXHEqMsBagSx2ZqZAtgU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CRxbqLGpxKFgUX3ns8nAIEa0F8Tl7lbD8M3KYtxYYy23JfTWgMQ7Ph0ySMQ5x3YS3RrzO/Ggkl+JlRXV9hQ8p1YIY5mq6fMAktK+xM+8v8R7KPge9fPNcJ1W4HP/gQc+3PuSsnklAqqSA10uMBfyC01/kWfjP487xsrky8QHqmE= 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=YS0lv6dY; arc=none smtp.client-ip=209.85.219.45 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="YS0lv6dY" Received: by mail-qv1-f45.google.com with SMTP id 6a1803df08f44-90327237340so60588346d6.1 for ; Wed, 22 Jul 2026 11:35:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1784745328; x=1785350128; 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:content-type; bh=qg2sr9w1J3nOO7FQ1cLX7doN7aPqFEfPWWRPqDtuE0I=; b=YS0lv6dY/KvM0E1GFVfrsQcBmnuYkh6ogE38ja+07tMZdYy6n9kc3aaCVWL2CtLxcz 7e63aPq8cFHomR7Ts4uEmxGF1uzrpnzVOUA9x1mBb24Hh041hf3cuw5KXkAuSSj7rN6k zpom9zzA6yVlkgmS6xgCUHW4Fllzu74Nq4pLyWDm2YcYn/fNZazTZ3spiBdyiP8aPPOd QPNiP58WDft/yj9Wx0ojyqpoxnySP0uGyPravkVJROvLs1rYHguf/X4j058DZolKJg4x byghJo4ErdkbnOASFvrhRQIsDgwmvcPhWxxI3boTgbE8WHFeJZvJ3/mU4PVhua/Z0iKV vnAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784745328; x=1785350128; 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:content-type; bh=qg2sr9w1J3nOO7FQ1cLX7doN7aPqFEfPWWRPqDtuE0I=; b=ZaJbS+dMKn/3yI8Z+ZB+Y9y3r3qzVce3pA/CKFNor2Nf5ezGVyG6aA6/L7nQIBDjch x+W462wJ1RUcssb7yVHwAUwU9vcl4XevKXyqxHlgcUzhlVYzkxJNknP+9eDRDW7IHX0u FpFQa6e1i9CoZ93fm/Y4O4hNEJIjeEKHKA9Rxdt9ah9Lo1U1Zklntd+Vyp4oLvrPDpnd 9d63WNIfO7Sjto04B+6A8kjYujkeHgv0SJpaZlLZjO82PPhx+X4su8bCniA6axksPFL1 ixWVxG1DzMyqm9ZzQvmqMor7SOy048orZpSEG1nC+Wx78+D4LdKE5VkUtL8uGSP8M4KV UC0g== X-Forwarded-Encrypted: i=1; AHgh+Rp8vfu8zTKqZJsxvRE0roiSXpL80CCtMQaTbwJrzrw3bcOW9/Mkz6TnnKFFhhLdUS1+PzijxhxdfpZO0bM=@vger.kernel.org X-Gm-Message-State: AOJu0YzKTnnpPbY5x5zywglM1F4lZ0KWm1+08/UO7kTvIoJUqlF492s0 IcK2i4oBCp4th+vuz++3eCTmLxgjPeIIruKJ6xakVvBDeDSW4CsjXqFRj54Na0MBzAw0KsDsDMr 7kv4J X-Gm-Gg: AR+sD11iz+7CWN2ZRSD8E9V8rii2b1uzfMzXLI4TKyRhqodq2GLSE4AtIFSYYhYb4Rr 7kpc5TzNjsRYVMKlsMF+klU2kmX1gi09Ze9KJZF3X/krKYbc4FfiZZEU4gljBhK2sod771Zs7cA GqRNe2oTblcJZz2HgqOOPHeP/fgplu06B0qitD1ABkN+qSfCGSoGRJmwY4bjFPkAT7DDWWcK0i/ o73wU+0pvJlCTeEsePIm1F+9ZrIQaKGjZlTNliczEpkqyzb5Vv5CFnxWBaWaEBP/8P3Ok+mrTb7 K16uJS+VGatIpxZEqJPU190z5I8E7GSfavLXPiIYXR3FD3z5ge2Vrw5lwOU9GVYbs72sn1HQHD0 TwAIPAL0JuR4jPK+SgUQQdIcRtiOHNnNhNC2gPj3s7NljLUwOhZNkDNW1DcRxSbJ0hAuf0uYvBC PQpF55l1hT9H4CZP25X82Cw8txHsv7Kp31a/lDD+0UO+0/CLeGeWxOjFuztTnBbMQ= X-Received: by 2002:a05:6214:2c12:b0:903:faf8:a93f with SMTP id 6a1803df08f44-907b9bcb694mr64124716d6.30.1784745327474; Wed, 22 Jul 2026 11:35:27 -0700 (PDT) Received: from gourry-fedora-PF4VCD3F.lan (pool-173-79-60-52.washdc.fios.verizon.net. [173.79.60.52]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-907ba8b3e96sm27630216d6.1.2026.07.22.11.35.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 11:35:27 -0700 (PDT) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-team@meta.com, djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, alison.schofield@intel.com Subject: [RFC PATCH 2/8] dax/kmem: add private= to online memory as an N_MEMORY_PRIVATE node Date: Wed, 22 Jul 2026 14:35:13 -0400 Message-ID: <20260722183519.935213-3-gourry@gourry.net> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260722183519.935213-1-gourry@gourry.net> References: <20260722183519.935213-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 "private" knob to dax/kmem. Only writable when state=3Dunplugged. Switches the device between onlining as N_MEMORY and N_MEMORY_PRIVATE. This marks the node private and excludes it from every fallback zonelist. Fails if the node already has online (non-private) memory or a if the node has a different private owner. The base plumbing for capability bit flags are added here, but no capabilities are added until later commits. A private node after this commit is solely accessible via mmap on the dax character device (/dev/daxN.M). Because a fully isolated private node cannot reclaim or compact, its dax-file mappings default to base-page faults (VM_NOHUGEPAGE). This makes allocation / failures more deterministic, otherwise a fault may fail due to a lock of given order despite memory still being free. When/if reclaim is supported (and the node opted-in), this can be relaxed. Signed-off-by: Gregory Price --- drivers/dax/kmem.c | 85 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index d9021cf148982..c4c18aeb43c69 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "dax-private.h" #include "bus.h" @@ -52,6 +53,9 @@ struct dax_kmem_data { struct mutex lock; /* protects hotplug state transitions and config */ bool dax_file; /* when set, cdev allows mmap */ struct mempolicy *policy; /* device-lifetime bind for dax-file mmap */ + bool private; /* when set, memory is onlined as N_MEMORY_PRIVATE */ + unsigned long caps; /* NODE_PRIVATE_CAP_* flags */ + struct node_private np; struct resource *res[]; }; =20 @@ -108,6 +112,13 @@ static int kmem_anon_mmap(struct file *filp, struct vm= _area_struct *vma) return -ENXIO; =20 vma_set_anonymous(vma); + /* + * Default a private node's dax-file mappings to base-page faults. + * Without reclaim/compaction, high-order allocations can fail despite + * memory still being available. Can be relaxed with reclaim support. + */ + if (data->private) + vm_flags_set(vma, VM_NOHUGEPAGE); mpol_get(data->policy); kmem_vma_set_policy(vma, data->policy); return 0; @@ -187,6 +198,10 @@ static int dax_kmem_do_hotplug(struct dev_dax *dev_dax, if (online_type < MMOP_OFFLINE || online_type > MMOP_ONLINE_MOVABLE) return -EINVAL; =20 + /* Capabilities are stable as long as memory is online */ + if (data->private) + data->np.caps =3D data->caps; + for (i =3D 0; i < dev_dax->nr_range; i++) { struct range range; =20 @@ -215,7 +230,7 @@ static int dax_kmem_do_hotplug(struct dev_dax *dev_dax, */ rc =3D __add_memory_driver_managed(data->mgid, range.start, range_len(&range), kmem_name, mhp_flags, - online_type, NULL); + online_type, data->private ? &data->np : NULL); =20 if (rc) { dev_warn(dev, "mapping%d: %#llx-%#llx memory add failed\n", @@ -480,6 +495,55 @@ static ssize_t state_store(struct device *dev, struct = device_attribute *attr, return len; } =20 +static const struct attribute_group dax_kmem_private_group; + +static ssize_t private_show(struct device *dev, struct device_attribute *a= ttr, + char *buf) +{ + struct dax_kmem_data *data =3D dev_get_drvdata(dev); + + if (!data) + return -ENXIO; + return sysfs_emit(buf, "%d\n", data->private); +} + +static ssize_t private_store(struct device *dev, struct device_attribute *= attr, + const char *buf, size_t len) +{ + struct dax_kmem_data *data =3D dev_get_drvdata(dev); + bool enable; + int rc; + + if (!data) + return -ENXIO; + + rc =3D kstrtobool(buf, &enable); + if (rc) + return rc; + + guard(mutex)(&data->lock); + + if (data->state !=3D DAX_KMEM_UNPLUGGED) + return -EBUSY; + + if (enable =3D=3D data->private) + return len; + + if (enable) { + /* Add the per-service opt-in attributes. */ + rc =3D sysfs_create_group(&dev->kobj, &dax_kmem_private_group); + if (rc) + return rc; + data->private =3D true; + } else { + sysfs_remove_group(&dev->kobj, &dax_kmem_private_group); + data->private =3D false; + } + + return len; +} +static DEVICE_ATTR_RW(private); + static ssize_t dax_file_show(struct device *dev, struct device_attribute *= attr, char *buf) { @@ -531,6 +595,14 @@ static ssize_t dax_file_store(struct device *dev, stru= ct device_attribute *attr, } static DEVICE_ATTR_RW(dax_file); =20 +/* Per-service opt-ins. Visibility toggled by 'private' control */ +static struct attribute *dax_kmem_private_attrs[] =3D { + NULL, +}; +static const struct attribute_group dax_kmem_private_group =3D { + .attrs =3D dax_kmem_private_attrs, +}; + static int dev_dax_kmem_probe(struct dev_dax *dev_dax) { struct device *dev =3D &dev_dax->dev; @@ -601,6 +673,7 @@ static int dev_dax_kmem_probe(struct dev_dax *dev_dax) data->mgid =3D rc; data->numa_node =3D numa_node; data->state =3D DAX_KMEM_UNPLUGGED; + data->np.owner =3D data; mutex_init(&data->lock); =20 dev_set_drvdata(dev, data); @@ -668,6 +741,9 @@ static void dev_dax_kmem_remove(struct dev_dax *dev_dax) struct device *dev =3D &dev_dax->dev; struct dax_kmem_data *data =3D dev_get_drvdata(dev); =20 + if (data->private) + sysfs_remove_group(&dev->kobj, &dax_kmem_private_group); + /* If enabled, clean up the dax-file char device configuration. */ if (data->dax_file) { kmem_dax_file_cdev_del(dev_dax); @@ -707,7 +783,11 @@ static void dev_dax_kmem_remove(struct dev_dax *dev_da= x) #else static void dev_dax_kmem_remove(struct dev_dax *dev_dax) { - struct dax_kmem_data *data =3D dev_get_drvdata(&dev_dax->dev); + struct device *dev =3D &dev_dax->dev; + struct dax_kmem_data *data =3D dev_get_drvdata(dev); + + if (data && data->private) + sysfs_remove_group(&dev->kobj, &dax_kmem_private_group); =20 /* If enabled, clean up the dax-file char device configuration. */ if (data && data->dax_file) { @@ -732,6 +812,7 @@ static DEVICE_ATTR_RW(state); static struct attribute *dev_dax_kmem_attrs[] =3D { &dev_attr_state.attr, &dev_attr_dax_file.attr, + &dev_attr_private.attr, NULL, }; ATTRIBUTE_GROUPS(dev_dax_kmem); --=20 2.53.0-Meta From nobody Fri Jul 24 22:55:04 2026 Received: from mail-qv1-f52.google.com (mail-qv1-f52.google.com [209.85.219.52]) (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 F15303F0A97 for ; Wed, 22 Jul 2026 18:35:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745331; cv=none; b=Cs73yiA5LedllK1da51eg3F2xC2gKC7uIQNASJdBTnKeIjeaqtqriFIb5HHD0oRsxbUavMahHCCaQC+h3EvtKF6Dz5MLb/y/nBP24wD+iuxvllo/TSmxKsGkbJeUXJxhhlKygg4UiYbr7TXAh62Bkqod/CMFtSrP9PHmwBoPZt8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745331; c=relaxed/simple; bh=vzqm4fFMouD2OMwwrdEh32Zh9IQ4/VjYNHxtQU2rRGk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rhkC1TXOjP2RmoCQBpFBVcb/a4nNZ4PcCjnvZuf3BeaTEVLMg11YMo25zp8Da9+dEr+77owxU+4KNnP/hZ+QkP+/vJ0Ctq2eDpCuRqa0+W1JLWpOtgsy846y/eVtfiMOQyhSP0h99/1m+s65/LbEU2u/k43yA4PbqBX9QpuYPdg= 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=SF6Uqtwv; arc=none smtp.client-ip=209.85.219.52 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="SF6Uqtwv" Received: by mail-qv1-f52.google.com with SMTP id 6a1803df08f44-8efb708b1a0so126815636d6.3 for ; Wed, 22 Jul 2026 11:35:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1784745329; x=1785350129; 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:content-type; bh=V1q9zTpOIyp/zk0K72AZII9eGrDR/fzPr3ymjVJM/e8=; b=SF6UqtwvvPKMSHfxJ12qpbfj/TKALRNFkOx0p1KFYmhPOhj5IhD4W7mV+48Eiy2WOi uQwQ6kWU7nENIpSGv+eRo3SHEzJfEYC/uqzSCJLHIU1QQQh+7833mhCPPZxdx0zyeee2 pZ+EBxEiSBzpjNW/eInfQLAR70+VLpofLXzkovFkHE0v8LtZX0vK+6iA4urE/CxII2De CMLzeAw111+1EF7ms465lU0GnkYEgNYM8UjC8mvv5yH4YlJu+BgD6Ch+BF/yl7mY06uj 1e5j5mzbP9FTZpH4shdlS+cAd5CoGMU3rz3pjPoW9Vbmk1ZRoYxt2dBCVBko3Ii9BIwg kJKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784745329; x=1785350129; 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:content-type; bh=V1q9zTpOIyp/zk0K72AZII9eGrDR/fzPr3ymjVJM/e8=; b=ZblcBxP/MOjVk0mcMs4paTZaDP6W1WKWU0/gii2vh6RCUiqr7eAhQYN9sf8+GvIMmm xxhE6ShKrvvU/cao95ywRPbGyyu3ioDbViNLiWxsRuiSHN0zFMP2y06YU7aELdaG6LkZ kgXkWCSjoJtRceFIUqoAEX7pp6V29AFirZgTNnrjV1BrDKlBtFaRe5PT6Ai7N2dzOdPl I0xza96MP9CXyeuLx3bclNtXfmQHlvUmDonwFMD+lT1oLlHBWwPrfBke+5Wr2RwY79R9 VJZqYIQbzQ0QLh1nTy9sLB3naTQ/VmSZatwKyz7lIIr6fNFW0ornrn5AJdsrHYDSFYMX 4TqA== X-Forwarded-Encrypted: i=1; AHgh+RqHWWeOL8/0SVC+DrQ+tVReChZhqrd4WEvOnZABtnHfKOU9KYr02JnT6sMwLrBQjnYGtodUUdomZu27Qkg=@vger.kernel.org X-Gm-Message-State: AOJu0YyYQh01d0ntrN1KdcEQMUBeahzfYgHRUf/SydOYkmoK89ymimQN 5ZngudITV5tMWy6RMIJpICt7txdgjK5QIa/ZtNmfhrVpNnpJjRKTyyw5P8PYfY2x0r4nzLY8LaI RzSrh X-Gm-Gg: AR+sD13XmNn75BdTCJkgyKhpEy90/dDKc2xkH6cC/SJRk6JSQikyu84T6nqxqdxbWqV 12M86qvh3G36qMTKubyVOexzaQdF7ymvQy3hlbZWzXw2J0mq3XUX9YlPUbV/WmTnUSui2whuilZ BIXYqIL46xmNbLvMhxOLcQsR1pOOM7b9RvKoweyIXosFtyLMUxoJLNdP7ZRVgex71calRdlP6RV GOgZ/9uda95Qacn1emW6xn19gFS52pGpDLIUbwTbxkFxCnq/RLnMi8AOxUvjoqrsfr1/v6wxVL+ EWjO91aRoVhGSjeQjAcKd0ILZZB9jr24RM7bg+/kHqqYlOJfJ/DLC0tDm6z0pWFxxJv+4nqEKMz 5f2zmRBjR95Q2qmV2sopLq3Z/yt1eZZlDP7wQ3mXfUzU2sKSsXgTZ4ZiddBUeL/1xJg1rIh+Wyp H7SRJNMtrzoTB4FE91vHGVzSJb4vMAoKnExVnf4tihYKXW7XLYkQtNpUK79RxGKfA= X-Received: by 2002:a05:6214:5701:b0:8f1:90f4:cb78 with SMTP id 6a1803df08f44-907ca5e95a1mr29856d6.37.1784745328921; Wed, 22 Jul 2026 11:35:28 -0700 (PDT) Received: from gourry-fedora-PF4VCD3F.lan (pool-173-79-60-52.washdc.fios.verizon.net. [173.79.60.52]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-907ba8b3e96sm27630216d6.1.2026.07.22.11.35.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 11:35:28 -0700 (PDT) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-team@meta.com, djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, alison.schofield@intel.com Subject: [RFC PATCH 3/8] dax/kmem: add the reclaim opt-in (CAP_RECLAIM) for private nodes Date: Wed, 22 Jul 2026 14:35:14 -0400 Message-ID: <20260722183519.935213-4-gourry@gourry.net> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260722183519.935213-1-gourry@gourry.net> References: <20260722183519.935213-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 the first per-service opt-in for a private node: "reclaim". Also introduces the KMEM_PRIVATE_CAP_ATTR() helper for future bits. Sets NODE_PRIVATE_CAP_RECLAIM for the device's private node. A private kmem node opted into reclaim recovers THP compatibility. Signed-off-by: Gregory Price --- drivers/dax/kmem.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index c4c18aeb43c69..cf6cb927e5ed5 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -117,7 +117,7 @@ static int kmem_anon_mmap(struct file *filp, struct vm_= area_struct *vma) * Without reclaim/compaction, high-order allocations can fail despite * memory still being available. Can be relaxed with reclaim support. */ - if (data->private) + if (!node_allows_reclaim(data->numa_node)) vm_flags_set(vma, VM_NOHUGEPAGE); mpol_get(data->policy); kmem_vma_set_policy(vma, data->policy); @@ -595,8 +595,44 @@ static ssize_t dax_file_store(struct device *dev, stru= ct device_attribute *attr, } static DEVICE_ATTR_RW(dax_file); =20 +/* NODE_PRIVATE_CAP_* opt-in toggles - captured in data->caps */ +#define KMEM_PRIVATE_CAP_ATTR(name, CAP) \ +static ssize_t name##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + struct dax_kmem_data *data =3D dev_get_drvdata(dev); \ + \ + return sysfs_emit(buf, "%d\n", !!(data->caps & (CAP))); \ +} \ +static ssize_t name##_store(struct device *dev, \ + struct device_attribute *attr, \ + const char *buf, size_t len) \ +{ \ + struct dax_kmem_data *data =3D dev_get_drvdata(dev); \ + bool enable; \ + ssize_t rc; \ + \ + rc =3D kstrtobool(buf, &enable); \ + if (rc) \ + return rc; \ + \ + guard(mutex)(&data->lock); \ + \ + if (data->state !=3D DAX_KMEM_UNPLUGGED) \ + return -EBUSY; \ + if (enable) \ + data->caps |=3D (CAP); \ + else \ + data->caps &=3D ~(CAP); \ + return len; \ +} \ +static DEVICE_ATTR_RW(name) + +KMEM_PRIVATE_CAP_ATTR(reclaim, NODE_PRIVATE_CAP_RECLAIM); + /* Per-service opt-ins. Visibility toggled by 'private' control */ static struct attribute *dax_kmem_private_attrs[] =3D { + &dev_attr_reclaim.attr, NULL, }; static const struct attribute_group dax_kmem_private_group =3D { --=20 2.53.0-Meta From nobody Fri Jul 24 22:55:04 2026 Received: from mail-qv1-f45.google.com (mail-qv1-f45.google.com [209.85.219.45]) (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 66BB44C9003 for ; Wed, 22 Jul 2026 18:35:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745333; cv=none; b=aad/y996lbHuTpz4dQ2D8CT4/rNnglmqC22R5TY3XtQbawPqTL7PDCGPUv1Sa/3qT/q/M5Xy1dIifHzXK+FNFtYwkOTiXu2JaQ4hjP8CWZ8SgATSNhJHlkvpeCX11GgJ5Fl+VW3ecZ6AKvWZuZefL952Af08DLCUZnl4dKGOBs8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745333; c=relaxed/simple; bh=fB5MDXjdpz5iQAHGUhY49ZSZzLO4uAvM0Zy2BponGt4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mMIdhML/lL8L+oO/ZbJ1xZoG8shjB4/AetSmF3AjGn5Or7auYeVLV/eXPis2SnsHmEmljv78h08LXcr3PRRM8blYPITFym9fRRGZPOS3gXJ9rsdA9kURYAzzo40+gqPR1eenUw4HYgBWLMA04QoylP0IgEDCdm1s/qDkjHnzeE8= 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=bBrwWqIn; arc=none smtp.client-ip=209.85.219.45 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="bBrwWqIn" Received: by mail-qv1-f45.google.com with SMTP id 6a1803df08f44-90004d2f7b7so172647666d6.1 for ; Wed, 22 Jul 2026 11:35:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1784745330; x=1785350130; 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:content-type; bh=j2CVKVqJBHsKrJ5Bdm2nCmvoLlboB+s0FhSW+cZN6ac=; b=bBrwWqInU6OeYWF1kBXNFk7ws5AHXKxMjWc8gHbfW4+IRQCe86WmKd2rfv4RSfatRp +J78k7dLJFvBSIJDeQ0tOM3/WMwatEfRMpUG3n+pah59mayt1psWTNbkevcBpCjSa9Yv jtA1bh7HcuRV8eKKlVWbu3krr12yFKmQXSJl8yvxLMhHt0hmfPbmwBT4u5R3TtNf7/4s GO8UJPmS9HSG0XrzMUStkNsMCYJy5JZ0+nflnlBDB+A646VAOyvfocgXZezHW0jgsjbj JLAHRKu4JoFCaFSLYv6ychCYBVJEEYzw1BONfz1fPbkhVn2uOnKQT7sZf0O/Z48I/W1L uyLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784745330; x=1785350130; 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:content-type; bh=j2CVKVqJBHsKrJ5Bdm2nCmvoLlboB+s0FhSW+cZN6ac=; b=FE81snsSc4bckCOtM9hLrdiRXQGPP+PrOWFln1jrqz7ombiyi4ESASraMxifuy2eAv npRlcOj0ruEgo14SwtGQ9rTxvCAw4FBi6DW2UcZFdBpXICQxKNcVAZxgt96Xw1scfYT7 HktH42pRrHl99HQMH5srjwHNWXYw0VFY4XM8qG2GxV7tIyMgbajAaZsxIgCNb0hcan9e zwGBjJrnELc+4/CMF5oqGLvZ2xLxkaGqGvRNF9CwWvLfPZPinft1/Pd44WDhG80dcZlq Sf+pC3ZtS2Rcn2C8RjsoEun/0AuJUgCMcluKkVNP1r3hxfVbp0ZD+a9cyON2Bt+NvibU k9Hg== X-Forwarded-Encrypted: i=1; AHgh+RrPsnNfIb0LMlFdkQwtZ10UhqmWYVJg75EoLr+TAm4R9MSK2D4RaUTCpGzn2iYP21bYeWjZQ8y+MupbJMY=@vger.kernel.org X-Gm-Message-State: AOJu0YyKKTVXpIK/vOkqptCYJ3aMRN+W3jGXq4bvhvtODScue9plK5GN AUkzaJA9ZyBM2s0Xe7lyqg2M1ug7Jn9ShG05Y1RH4wzHTdfPmwuh92MTxFWd7y30PItsbE/oHIw nR98q X-Gm-Gg: AR+sD13OhZu7IbVtZ+tvHuRBT6EshORKJfTTvQVghEYkyX8OKR+VPtVu/M4f2aXuNci uwW4lcAC79IpjtE+YgX2zSgTT15wCDF1hHNI5CNO/KcOFgqEziAxriNPOTqU/OcSvsVgi59W/Xj MqeyDO1O7JR7vybmyED64VG3x8qiKF9W2pkPsK7Bc8Qz36iHV1sdK99qetiQ7hYvKCaq0X39mNY MQatI1IG+gWaIBfCyomf4wJwDf0CJFwXPMOO5u3IiPri6s61Ntk6SgLMH0HomS3Xo6HuCMgoicH T+Ca+ncUlM12LQOWT2w8Yfy5Wua4uknHG23hwnTdrTRcBFAvqQoquW3XuaxJktpg+2iPZj8WMrR 9Ol9Hg12lNNZ4y4JRUY0VhCznHZjGzFKhFcWNQrearm8EnsPFuLy3ct61z2j89jWXH4bdl6Zylg KNCpwFL5/arJ7Inpk4qMqatA/RgKKSIWZbF9BdBsCeNgWfwd7bHV1Uc+Fs1vt9NFM= X-Received: by 2002:a05:6214:5d0a:b0:8f1:579e:a41b with SMTP id 6a1803df08f44-907ca295150mr757966d6.24.1784745330173; Wed, 22 Jul 2026 11:35:30 -0700 (PDT) Received: from gourry-fedora-PF4VCD3F.lan (pool-173-79-60-52.washdc.fios.verizon.net. [173.79.60.52]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-907ba8b3e96sm27630216d6.1.2026.07.22.11.35.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 11:35:29 -0700 (PDT) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-team@meta.com, djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, alison.schofield@intel.com Subject: [RFC PATCH 4/8] dax/kmem: add the user_numa opt-in (CAP_USER_NUMA) for private nodes Date: Wed, 22 Jul 2026 14:35:15 -0400 Message-ID: <20260722183519.935213-5-gourry@gourry.net> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260722183519.935213-1-gourry@gourry.net> References: <20260722183519.935213-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 the "user_numa" setting NODE_PRIVATE_CAP_USER_NUMA so userspace may control residency on the node via mempolicy and migration. Signed-off-by: Gregory Price --- drivers/dax/kmem.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index cf6cb927e5ed5..8023db23e2f99 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -629,10 +629,12 @@ static ssize_t name##_store(struct device *dev, \ static DEVICE_ATTR_RW(name) =20 KMEM_PRIVATE_CAP_ATTR(reclaim, NODE_PRIVATE_CAP_RECLAIM); +KMEM_PRIVATE_CAP_ATTR(user_numa, NODE_PRIVATE_CAP_USER_NUMA); =20 /* Per-service opt-ins. Visibility toggled by 'private' control */ static struct attribute *dax_kmem_private_attrs[] =3D { &dev_attr_reclaim.attr, + &dev_attr_user_numa.attr, NULL, }; static const struct attribute_group dax_kmem_private_group =3D { --=20 2.53.0-Meta From nobody Fri Jul 24 22:55:04 2026 Received: from mail-qt1-f173.google.com (mail-qt1-f173.google.com [209.85.160.173]) (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 C3020442B36 for ; Wed, 22 Jul 2026 18:35:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745339; cv=none; b=X8/ZNu4BwZPnS/JzhM68kvheOv/MAdU4kNxPvTLceA7cLxnLM3qni/uOWz9Xe6yPB7FiqRpZ2Yu3/b9EBFXy641iHmb4xBi/eL7ia+VjFA3LMH4ttYcgxoGEc/IiOorFNStfzOz/wF6YOFgpcUkQVZWKWHqmEV8EHYFPhMakQBw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745339; c=relaxed/simple; bh=dgzN1ml/vZNStxUoITE7Akv2HnDMQo21x61Qfk5F2Pw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gcACVCrQarvf5zstCOKTY8XB2YzFnJp7EfrtSKb5OpjeKDvRWZMP3kVpdsz3v94ekJwVChstYftrzWmjLf/3siff2p73VmIY26zW6+syc04ulIKlk5o8WMBKCi3KTAwMjx4fPPXICDNVzZ5EAcC9718kXMTYhzn6nXC67GjrDPs= 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=fsfRs//5; arc=none smtp.client-ip=209.85.160.173 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="fsfRs//5" Received: by mail-qt1-f173.google.com with SMTP id d75a77b69052e-51c1372f84dso91802601cf.2 for ; Wed, 22 Jul 2026 11:35:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1784745331; x=1785350131; 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:content-type; bh=Ydg3Ew9SKlsgJPVrflLH252P+fWkz2RUOcmJ5pVt3GI=; b=fsfRs//5P24HlNTS26QUSltmlzIfNA+Nb3ASwPtE6pW3nZSX6yQ1XWK7eOaiwzylcE sP7tvGaxZ9CuMmHk2TEC4uX6BCcJgRmcH6hKzBtN8i10242QlMiQjVv33oTmRk8BDwTH 5cBV/ihUD+2PY8DiWOhV4GR55HFhu+gf6wd66QXpx57Mrcj2om8zfd2nTSGVEj75Hx5x Gu/7i4l5A01RWn4xNo4iRMfrA6HxLORFVJdC0XZSsQcGGB5gjeGP//6Pjp8ISt6ais1z RYHT8dTws8MKY2KJQxPMvaXwsX0tD2S1DhC7MjFJfqtADWXhja/Rv+SZ1J06+JtP4cF9 Cc2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784745331; x=1785350131; 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:content-type; bh=Ydg3Ew9SKlsgJPVrflLH252P+fWkz2RUOcmJ5pVt3GI=; b=osavTkQLNOPE4uYoz6NREO6x9swGwUTTGDSRpXNrd+esAmCxKYotTSK67Kvs0O7cJM EVfVIahZddsOhchjkwMqH5lWArgtnKOZoMR80YGxuRfCzXTGWsKMJL8BGymcAizGdgre FXt72vJUDgzR0iOegEfNK0z7yQzjgKshSPUhv2pMzJsQo+auqN1ZU9axpiijrf6qjkv3 FQOKCknBzHRVY7LjJXO6sPtiwtC5UBJdWj0EQ5dHf/95+I5/JKwxDuoIle7AUV2ck9Um mUXx8i1I0i3kUdi+FHyitbIE5yHvr5bePzrbDzFrVQ0+sHGVOZvwhvqkNc+bnBUVbPXN iFcQ== X-Forwarded-Encrypted: i=1; AHgh+Rq9ivFKFFpdg1Qp/csl6y40jZmW/zyxSDV5Pgnyd/2gdOtDTc7CyNurqfOxshbplLvIMmfuB1S280cklRU=@vger.kernel.org X-Gm-Message-State: AOJu0YxWgNbmhc/ken1+LC4uukv1vCz5Gsx6xYQYdiiyGKVWvdtgKDlX 268snoYJ8a3fd3vZOsZjfYL9c58fI6sC6I2iPOCT8nLtcGz2MF5troL/NRKh942npMs= X-Gm-Gg: AR+sD10l+Ez3bZaeKRq81XM22mWz4lSd/ZF/IaD+R10AHeVMQ4i2u0o2OdkMas5x+5I i0ry45pwcJVjbxDKGkj0e86K9moADkrNSM7/Pax8al0BrVcx5Rhh41LWos7Fqrgf9HoZP0ycQiy 7pZwY+OIjVP1rfc779JP4QjMq0NajHDgw46jfKLQwmGJlsWZm6qzJD9mvfiBZv1AwZSvUjAAc3F tmkhY5uJZ9RlKrYYfjaR9tXDkXJ94dmOsKRG9XVyvzEcSQYGYN9q4Hk6d5+MqJGstWo0yaudLIs zgmCUGoA+ekK1F3Nxpc8KFSxwK/n2YJkwlfE3KFH/Xu09pOVbBk3p1sgAIt1KdWOA2QYYAcssGA fzVC26AMuU1WPKcw8jQ3Cc+MrMfsVF9GM9+yqycGOnUbgOoprvzOycl2FLxig+jSQULx7KiSinm yPlzoDw46KeUTirPeWgBBtco49IphgGsMMmoA+huGCKtqnvao12bFUNoe6UQtiLkqKL3JpPI78h EzWywVRC22u X-Received: by 2002:a05:622a:ab09:20b0:527:6d4a:1970 with SMTP id d75a77b69052e-5276d4a1cdamr42283981cf.38.1784745331550; Wed, 22 Jul 2026 11:35:31 -0700 (PDT) Received: from gourry-fedora-PF4VCD3F.lan (pool-173-79-60-52.washdc.fios.verizon.net. [173.79.60.52]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-907ba8b3e96sm27630216d6.1.2026.07.22.11.35.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 11:35:31 -0700 (PDT) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-team@meta.com, djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, alison.schofield@intel.com Subject: [RFC PATCH 5/8] dax/kmem: add the hotunplug opt-in (CAP_HOTUNPLUG) for private nodes Date: Wed, 22 Jul 2026 14:35:16 -0400 Message-ID: <20260722183519.935213-6-gourry@gourry.net> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260722183519.935213-1-gourry@gourry.net> References: <20260722183519.935213-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 the "hotunplug" setting for NODE_PRIVATE_CAP_HOTUNPLUG, so the node's memory may be bulk-evacuated for device removal. Signed-off-by: Gregory Price --- drivers/dax/kmem.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index 8023db23e2f99..3892ad44d4e46 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -630,11 +630,13 @@ static DEVICE_ATTR_RW(name) =20 KMEM_PRIVATE_CAP_ATTR(reclaim, NODE_PRIVATE_CAP_RECLAIM); KMEM_PRIVATE_CAP_ATTR(user_numa, NODE_PRIVATE_CAP_USER_NUMA); +KMEM_PRIVATE_CAP_ATTR(hotunplug, NODE_PRIVATE_CAP_HOTUNPLUG); =20 /* Per-service opt-ins. Visibility toggled by 'private' control */ static struct attribute *dax_kmem_private_attrs[] =3D { &dev_attr_reclaim.attr, &dev_attr_user_numa.attr, + &dev_attr_hotunplug.attr, NULL, }; static const struct attribute_group dax_kmem_private_group =3D { --=20 2.53.0-Meta From nobody Fri Jul 24 22:55:04 2026 Received: from mail-qv1-f54.google.com (mail-qv1-f54.google.com [209.85.219.54]) (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 0D1AA4457AD for ; Wed, 22 Jul 2026 18:35:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745339; cv=none; b=MvTHD72n8wpCr0nsOWS6ocSxAhp4jM0281NHCkSnC4ARh6oc3q/l5gm5gD5bzgAtf/RD2v79cEAtWlnUH86Wo/3NDa2STeFWlgdZd3UVbx4BXm9eri3lK4mPBU/JnD1H4V7dXw/PiQQlE5TdDWEenCGVYhKL6TkvrE0Z8NtluBQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745339; c=relaxed/simple; bh=aZvh7cjs8n0vwVyW1NeCATzVIIYdYHctZyuk2o8ZeXU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rUynxAtfqcZJCBVhW3ON/Qric4PQzdgnikim+qnPtVWQJxoZqFgQ1M2pkJwjmnFtQCkR/g9fEdCYC8HkuWb2uhqx5UqketShh67dKXHRUfMi9NMJlAg5f+Nm6Cavzc/SZwME2Glhh+t5k8p2wXldchnzoZofszZ1nthdJZchobE= 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=okY+kvPi; arc=none smtp.client-ip=209.85.219.54 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="okY+kvPi" Received: by mail-qv1-f54.google.com with SMTP id 6a1803df08f44-8f186025973so147325626d6.0 for ; Wed, 22 Jul 2026 11:35:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1784745333; x=1785350133; 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:content-type; bh=omLFyYU+0hOal/m0+vDT5H6Y4PKzwMuevbEHJKxRO6c=; b=okY+kvPiu/63sRmR7mPZjbPzDqgM5HBKg/Vb6XvhwN+mVVNsjwx/iIYp5c8Qi1E6mT UsMLRhMaZNIddqJXGznSYzDlBCyot+iGb64BEa16hJKt8gp9zC1N+AwAjHt54QThkp6+ lCWdqsYfx1k/wfMRh5LjeXwuAZ7raXP1XYFEH4VjGQMEP1dJFdTztoOSjPdrq6jZI2Lm ws71Hyt4C6VBPK5GSdHHgaEXGjAe/muR6u1/s/Fs/HuL8fJTJV00miDEQpdi4ZGuOE8d kCCFVXfuTUOkRe5O94a9OkGYTl7RM4QaOruwerViowLVSeV9jFVFu9Xbj+cBDNrI+8jk L6BQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784745333; x=1785350133; 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:content-type; bh=omLFyYU+0hOal/m0+vDT5H6Y4PKzwMuevbEHJKxRO6c=; b=AFTsXmzErAFgzqsmdgs5qEu94EKcvW9L0B6Q41/Nku2xXcd7vssBY/jXWGXTDhEKl7 E91vGH7fyfVI78WF/Mkwgyl2ejendome+aeVyJciDuRLDXmXeVMG8aKL3MYDmDiU1bJ9 JQrxzbTG3KbBZKK+yK6byxa1IrPw1zNYQU3dyf4+xDWOpxkyJSujBTB69DvsXPQRfAVF DIuqGySgrOLzUNe+WUdy6y73WWaOghvISKK0bZFCafzAKn2PaM3S+X+J5GwW/Vfqs/j0 iwSPjUDZN1n5fi43KW0LVbOgDOFBmoltNok+oGxvmO1oYO9JX2W3pVuMe19gSi2tIieq bqUg== X-Forwarded-Encrypted: i=1; AHgh+Ro2elFIOmLsZvmTafrndT6CsfMzUfX0lAQtm/OVDG3eYw8myJtSRBtUWmu9Wt3fM8AxbONbiO9E8SYYado=@vger.kernel.org X-Gm-Message-State: AOJu0YzWhQkc27zGR4CJBdd4V0GFzNv9516yqsqNd4c/v2rN5SPgXw/1 eFdbFsMPIM5D/t9TWpRaIyeZzenEeDaRJ5bIc7yO2VttDPWBB3ETNVGBCqvw4kq1kjQ= X-Gm-Gg: AR+sD114lmENetX9Y4joUyfgRZIx/hRcFrZMz/KUjwyqLvRRivlN/hRGeOyZxVMJIhh iKsfzryi6Jv9JCXPT3g2ctLER6K6b73A+gc8XRrYK52wT/QaCHDBPFITfSosHTKBbkFoCBkpAJ1 WlInaFqsaLvxNqz80SxfZT2gRWP3+3g5EAemadxPU+3quGKSCx4Gswo2MJpvTxXg0KkyC6q230E L9F6r7AZbV7+RW0hErB/yXREI6IJv/lEsKZFybIKXE4SLKpc7AGqD9lW3jb7Fj5n8upRokar4aN MgrpHGh9Cgj16OzBc9tp0Z44KKqeHxRNTYUCpaJ+lKptgd5el5E/rgOPmxSgJFkCH/BLmAk6y4H X7tzpRg6sr/xEcySeUUtQSl4oYmBohqXU3v3cqKsQi6EhWQOSEkAPF1Fh9qirDRODDLuBVmPZgC B4w+XoBynjUvJ2gXiJlLDFAuogfcJsGfDehQbnta70kwn42xNXN7bR3828s9+puDlCiIQJIGra6 g== X-Received: by 2002:a05:6214:3c9f:b0:8f0:2fca:8246 with SMTP id 6a1803df08f44-907ca56c5femr164246d6.52.1784745332786; Wed, 22 Jul 2026 11:35:32 -0700 (PDT) Received: from gourry-fedora-PF4VCD3F.lan (pool-173-79-60-52.washdc.fios.verizon.net. [173.79.60.52]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-907ba8b3e96sm27630216d6.1.2026.07.22.11.35.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 11:35:32 -0700 (PDT) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-team@meta.com, djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, alison.schofield@intel.com Subject: [RFC PATCH 6/8] dax/kmem: add the demotion and numa_balancing opt-ins for private nodes Date: Wed, 22 Jul 2026 14:35:17 -0400 Message-ID: <20260722183519.935213-7-gourry@gourry.net> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260722183519.935213-1-gourry@gourry.net> References: <20260722183519.935213-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" Expose the two kernel-NUMA capabilities as separate per-device sysfs opt-in= s: 'demotion' (NODE_PRIVATE_CAP_DEMOTION) and 'numa_balancing' (NODE_PRIVATE_CAP_NUMA_BALANCING). demotion additionally requires reclaim, enforced at hotplug by node_private_register(). Signed-off-by: Gregory Price --- drivers/dax/kmem.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index 3892ad44d4e46..1cb3384c003e3 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -631,12 +631,16 @@ static DEVICE_ATTR_RW(name) KMEM_PRIVATE_CAP_ATTR(reclaim, NODE_PRIVATE_CAP_RECLAIM); KMEM_PRIVATE_CAP_ATTR(user_numa, NODE_PRIVATE_CAP_USER_NUMA); KMEM_PRIVATE_CAP_ATTR(hotunplug, NODE_PRIVATE_CAP_HOTUNPLUG); +KMEM_PRIVATE_CAP_ATTR(demotion, NODE_PRIVATE_CAP_DEMOTION); +KMEM_PRIVATE_CAP_ATTR(numa_balancing, NODE_PRIVATE_CAP_NUMA_BALANCING); =20 /* Per-service opt-ins. Visibility toggled by 'private' control */ static struct attribute *dax_kmem_private_attrs[] =3D { &dev_attr_reclaim.attr, &dev_attr_user_numa.attr, &dev_attr_hotunplug.attr, + &dev_attr_demotion.attr, + &dev_attr_numa_balancing.attr, NULL, }; static const struct attribute_group dax_kmem_private_group =3D { --=20 2.53.0-Meta From nobody Fri Jul 24 22:55:04 2026 Received: from mail-qv1-f52.google.com (mail-qv1-f52.google.com [209.85.219.52]) (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 C661A4457B1 for ; Wed, 22 Jul 2026 18:35:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745341; cv=none; b=XHehmPHwYoDd2jFtmYRrdonU0mJhBugHLHWBgT7dAyChtP9VCoqXDy8KpCpylBbu5Zvuo3WIL5A9ukjvdo/9dAcmZfg/vULdw/w57E/TlABuWIuH32L1e+vNdKc5YQiIFrZTCqXsXCTlCsaagkq1o/RxhwJ/7X0E7p3TQu92wt4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745341; c=relaxed/simple; bh=4PQ5VCJ0pj1ClQf+gL1DN0rbtJDX7VFniSFaE/SsM8s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F5ia9Ejsg5Q4YfrME3l70iWnkra/ersuGnvUxx8Se3ruab/XqQ+gJXk7h7VusfEYkvx7e8hu6t63iFzB1gZP0BbXQzTqKb5oT5nVuYqhGKdIMy7R971kZJWUrx8HZBH+0zo1rP5jWxs3YWvOCBJ4bZjNa7hngetvj3CBjnCwo2Q= 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=QR2qusyJ; arc=none smtp.client-ip=209.85.219.52 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="QR2qusyJ" Received: by mail-qv1-f52.google.com with SMTP id 6a1803df08f44-8eeadbc5e21so63098516d6.3 for ; Wed, 22 Jul 2026 11:35:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1784745334; x=1785350134; 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:content-type; bh=enIHLWVARnnU4GIJ2wcKxnnWYjtcTdK3mCRnzCxbEg4=; b=QR2qusyJXl++DXwGm21FlzAZ0Z5jRRbzJIzwOM5+2ej0fkulK7JP/Y6drVrBFo+NWN TKTQ81OgtH6nBB4ONQa3yfQFp9SkEcZl1x8SI/RT6awM4nX7YRrJH21a8X1vHSVD5V2u l2od5/8bhdLovwhk6SJJDv/87iGIpDO4+h/BW9bf8PvUIw2OOElE3Is4sNAVAjYqwY6Z XpYVtA8xg2BzOfYIuE/niHv6ZQQh/3FK9Xnu1ocYm3Gn8/Vshwh+r+PPdUDe3cnHveXV bC0bjSXYfin12EgYSeimTGFiKmOFU18l5ZfSZ84vFv/YF3aNR+7sksGAKPOQijYh3/Pe NRvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784745334; x=1785350134; 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:content-type; bh=enIHLWVARnnU4GIJ2wcKxnnWYjtcTdK3mCRnzCxbEg4=; b=TagKeH0tiJoaBgFxddrDj8p9tCsUSZBXKHhlwbbbUtCc8QAIYcLS6WYihe4qE7qMag 2j9jabwbMfIb12mKWeULdQ37mcLFrm4Vk5+h9Gi/8QfE2vFTZWDrcDgn+KXmlXcAvdX2 NSAIc7FamGaqknlHA1G1flL6qI8T5FZ/iiw45k46rx/jXro4UeJQnoJseIxRmHElos5l quRJ1kz6iLXazDMmQ2yN8FS7F9jUnEbBtAlAihu27UmWLYVfYODHlYgzD7aykSDZsPbQ I8ui7SyNVC5oiz//P7Cmug2yJ6lphVx7NWHxQY+CUaD8m4FrrR/zMr1qz4sZBqhuNVAT 0quQ== X-Forwarded-Encrypted: i=1; AHgh+RpcWlY9i5r1mMvBwT7lPMBjUZdXQIFN81ALzkvwGmBgcj5aB/zXVL0YyNH0O1SVZ/MoZErV9OTzsPER0DQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yxpnoeff2PFkoNsWNCJN8hY6EOrFSOJPPCxDfazZz0XeA/0BMvj oEBk/R15K+0mgKW067l169vUD3ykKhoB+wUYVRBju9ItklasVFPKpNHYUYorlb3Qibs= X-Gm-Gg: AR+sD10M/Hr+in2gxWnelEoSIcyO1eLeNpBenR4nd6XvgV8t6xUNxM+viA3F5VduMrH yywYz+U7UB1mbpU/Cbl/CgkAKd//Kv6uhzPoV59SwVYgHb+zisRnfVKFF1ygX8vdyDs81Yvg0vc IEdSh5hfcGFDfUY3Zf9JJBwa7at9SNiTmsDSb2f/5JFonxXbdsI9OD5y5+UXk3DhWNhZ0YQZbDh Dk/Hvatf/DB+i/91YvSSbC9M7cIXbO17aXDGzOimFeltajL8PFJaztz54Eyg6/QeMpY5s7PQkNS XQ27zUeI1YsY05VM08RBdWPGhweLZ6rA3c9n+/LscxMAr27Y49zJX9g4WblW5d0Ef3Jkhc1KsOa 8n8Be58zzqRBZcbWYXvbBv/BmpuB3gK8AYC0SQidE3kddwDmIe0r9A6PO2NwR/EE1PhqB5SYvXc CIKQrcC/RFTcV8hCHR8BvdprpKXhCL0RKN0zM84C32BOb3ds3OvtxgDFVr0fMEUAE= X-Received: by 2002:a05:6214:5a0a:b0:8f2:3472:5b33 with SMTP id 6a1803df08f44-907ca5946b5mr229296d6.23.1784745334110; Wed, 22 Jul 2026 11:35:34 -0700 (PDT) Received: from gourry-fedora-PF4VCD3F.lan (pool-173-79-60-52.washdc.fios.verizon.net. [173.79.60.52]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-907ba8b3e96sm27630216d6.1.2026.07.22.11.35.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 11:35:33 -0700 (PDT) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-team@meta.com, djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, alison.schofield@intel.com Subject: [RFC PATCH 7/8] dax/kmem: add the ltpin opt-in (CAP_LTPIN) for private nodes Date: Wed, 22 Jul 2026 14:35:18 -0400 Message-ID: <20260722183519.935213-8-gourry@gourry.net> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260722183519.935213-1-gourry@gourry.net> References: <20260722183519.935213-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 "ltpin" opt-in setting for NODE_PRIVATE_CAP_LTPIN so long-term GUP pins (FOLL_LONGTERM) may target the node's folios. Long-term pins block migration and hot-unplug indefinitely, so they are refused on a private node unless it explicitly opts in. Signed-off-by: Gregory Price --- drivers/dax/kmem.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index 1cb3384c003e3..c33dac5939edd 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -633,6 +633,7 @@ KMEM_PRIVATE_CAP_ATTR(user_numa, NODE_PRIVATE_CAP_USER_= NUMA); KMEM_PRIVATE_CAP_ATTR(hotunplug, NODE_PRIVATE_CAP_HOTUNPLUG); KMEM_PRIVATE_CAP_ATTR(demotion, NODE_PRIVATE_CAP_DEMOTION); KMEM_PRIVATE_CAP_ATTR(numa_balancing, NODE_PRIVATE_CAP_NUMA_BALANCING); +KMEM_PRIVATE_CAP_ATTR(ltpin, NODE_PRIVATE_CAP_LTPIN); =20 /* Per-service opt-ins. Visibility toggled by 'private' control */ static struct attribute *dax_kmem_private_attrs[] =3D { @@ -641,6 +642,7 @@ static struct attribute *dax_kmem_private_attrs[] =3D { &dev_attr_hotunplug.attr, &dev_attr_demotion.attr, &dev_attr_numa_balancing.attr, + &dev_attr_ltpin.attr, NULL, }; static const struct attribute_group dax_kmem_private_group =3D { --=20 2.53.0-Meta From nobody Fri Jul 24 22:55:04 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 DC1384457B5 for ; Wed, 22 Jul 2026 18:35:38 +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=1784745344; cv=none; b=AExXa3wDwhhmRMlvfCXVmVD3BNbvvxw1mJynMacuQQMeY9dQXD22sZvCfo+hFWCAbdI1nS3PQqMpeZ1N9do27frcZ93rrlwJUDSPki64gbXpJO1ZlOozCXwe3kQUhZRVOhIAeRymnqNmcRUOYbW0f4l4/M/CQ9AJbIHXaUoUEm0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784745344; c=relaxed/simple; bh=nJ35d+eSRwcW0nsb3UMSMmMEzxzLr5EKcff45F9EGHk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KfZf+SS72SAOJ3EfEY060nm/0WADXA/SPxRdmE+JiIM72o65+W5ORP8PQHd3Z7C8Mk+gMuGQZPLzwh2sg3IUYzmZSZhzcCHOtE5UcsY/iKDejQ5qvEuAb1MXo9oFry7QVM659T5YIkuiZMKdk6w3245Cpgh2ZXKu/VPNNioiiXc= 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=Sl9+Z9jT; 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="Sl9+Z9jT" Received: by mail-qk1-f182.google.com with SMTP id af79cd13be357-9305a2121a1so961530085a.2 for ; Wed, 22 Jul 2026 11:35:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gourry.net; s=google; t=1784745336; x=1785350136; 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:content-type; bh=rb3wioIcpW4xOhPfXJEKXcvsIiP8tbJgl4SCMKfLhpI=; b=Sl9+Z9jTE3gnS9DBZMHJ8oL9nCIJiTS6xfiaRNCN1Brjme023rH/b3x54CvoPkhXj4 7ivZjJuASH8xM5ZzPaPsbQsDzWfuNZONrqDMJxZUuAeKY+UgTdLRpi6ZfznzezN1T6n2 5BsaiK9eo4QXKYwufyIT6vWmwUomne2hOTDcFljKgyZx6pW+X8RiMH9mLtI0evht5Y5x ymcJKZr0WmbeSOl+Rh90kY2D/F1j63+Q1PsS6a2nvH/ITkJZuokqY/lpkM7FzugOj7f1 25Uc0MuukQf1FglToPOk0pxL3slkaalpCIS+05ixVTHiENFZpCCkb0NwGHW4nXihuBje FAPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784745336; x=1785350136; 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:content-type; bh=rb3wioIcpW4xOhPfXJEKXcvsIiP8tbJgl4SCMKfLhpI=; b=R+ll4AS9uEZGn9bymhXNsVLyjEas8Ewzfhpc9B8u82lNAjJ9zWVGOEjYGbNoki5Uof mXIBkocD0uCalqX3nazA78b/R54xRxAO8fOWn75lcJikOPLk0cHS1An9vJYRh857DGho 2B80W44pBYj8tFeWljqGuKQ9MwW/EgIeql9jc/R5UnLMfttFVAU5WWCCRfjL42682UPS vwb6i5zQG7leGVXwpsiklhghtpOJqMYFEXTw2rHYv1xd+Yctng3EohNk3IlvE/XyzSE4 ARmQ9zoxGtsu09Xj/X+IOZWSw8pZ5KrDd8bRAMVbpFqon8pgrWz3jOv/cYdffSLq4PhI ionQ== X-Forwarded-Encrypted: i=1; AHgh+Rorl5cP9QeLHuMXj6Jfn4OEn0nR8jskFpRSxtbpqfvWsPfEA8eVuyqPyDbi4ZQzHsrVoKS9LfX/LCwz2CE=@vger.kernel.org X-Gm-Message-State: AOJu0YyOup/dRdPd3j+0QPIt59S6R/dXNTzKX3+nqGgXiUlEqmGPK/xz 1lcoQ0n+T80nee9cuQVZzDuU+sn21yj9cPG00+jOiCtvsuwtJkaMPWizoFPBpvcZAw8= X-Gm-Gg: AR+sD10m06dguKlB+nAefXRFzo6k1Nf0vWGk2WUhY2yoPM/vzsH5gjYUEh8P+gLKUQn 9ymdBgsTo9utXta1ouTeYtKzojnQx3jZHQxTABsceJxVHL88ygAFnIw0HgzCBfPIMzFTfXM9snR EbHWaSxAzTfZy1FDvz+oroWMLD9BtGFCaJeE++/5l0Sy9jx0G0E/bMDA9Tn7ulNVS+lDe0ClPt9 AEN3OKxCu593Tb7/sui67SQdYKXX2mlTjPzwXh65Gs9XENAYma5KIulEx9FZ4BDQNapVB5UEvYq IICzaKAaQzJUYlwXUhfgJHed5BQElZGKxnCh0tv/NqxAZNvLstnaz4MB8vL0a30BSQ5T484O859 K7AfCFEW7qf/RrpWXQPFSFEC+xaS4dEmIvrGaw6klJru8P8FJ8NEGyf4YsaAv8m8/V2homUQmFv S2ZMsXylhT3HFBmkPR8f1OWz9EuNBWoCSanqBGwbFVpH4b8QDE6PS8Y9fE4uL9bTs= X-Received: by 2002:a05:620a:4885:b0:92e:d5f6:2e71 with SMTP id af79cd13be357-930b3eea5damr2411579085a.14.1784745335608; Wed, 22 Jul 2026 11:35:35 -0700 (PDT) Received: from gourry-fedora-PF4VCD3F.lan (pool-173-79-60-52.washdc.fios.verizon.net. [173.79.60.52]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-907ba8b3e96sm27630216d6.1.2026.07.22.11.35.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 11:35:35 -0700 (PDT) From: Gregory Price To: linux-cxl@vger.kernel.org Cc: nvdimm@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-team@meta.com, djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, alison.schofield@intel.com Subject: [RFC PATCH 8/8] dax/kmem: add dax/adistance to make private node adistance configurable Date: Wed, 22 Jul 2026 14:35:19 -0400 Message-ID: <20260722183519.935213-9-gourry@gourry.net> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260722183519.935213-1-gourry@gourry.net> References: <20260722183519.935213-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" For testing, it is useful to allow adjustments to node location in the tiering hierarchy - but this is presently a function of static config data (SRAT/HMAT). Private nodes have a contract of one owning service per node, meaning the registering service can set the adistance for that node without interfering with other hotplugged memory (no other service can hotplug). Extend kmem to have dax0.0/adistance when `private=3D1`, so that the targeted node's tier membership can be moved around. Signed-off-by: Gregory Price --- drivers/dax/kmem.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index c33dac5939edd..9fd50ef44d56b 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -51,6 +51,7 @@ struct dax_kmem_data { int numa_node; int state; struct mutex lock; /* protects hotplug state transitions and config */ + int adistance; /* node abstract distance */ bool dax_file; /* when set, cdev allows mmap */ struct mempolicy *policy; /* device-lifetime bind for dax-file mmap */ bool private; /* when set, memory is onlined as N_MEMORY_PRIVATE */ @@ -68,6 +69,27 @@ static struct memory_dev_type *kmem_find_alloc_memory_ty= pe(int adist) return mt_find_alloc_memory_type(adist, &kmem_memory_types); } =20 +/* + * Re-register the node's memory type at given abstract distance, refined + * by the platform algorithm. This lets us move nodes to different memory + * tiers for testing and if the node does not have static perf data. + * + * Caller holds data->lock, and device must be in unplugged state. + */ +static int kmem_set_adistance(struct dax_kmem_data *data, int adist) +{ + struct memory_dev_type *memtype; + + mt_calc_adistance(data->numa_node, &adist); + memtype =3D kmem_find_alloc_memory_type(adist); + if (IS_ERR(memtype)) + return PTR_ERR(memtype); + clear_node_memory_type(data->numa_node, NULL); + init_node_memory_type(data->numa_node, memtype); + data->adistance =3D adist; + return 0; +} + static void kmem_put_memory_types(void) { guard(mutex)(&kmem_memory_type_lock); @@ -495,6 +517,45 @@ static ssize_t state_store(struct device *dev, struct = device_attribute *attr, return len; } =20 +static ssize_t adistance_show(struct device *dev, struct device_attribute = *attr, + char *buf) +{ + struct dax_kmem_data *data =3D dev_get_drvdata(dev); + + if (!data) + return -ENXIO; + return sysfs_emit(buf, "%d\n", data->adistance); +} + +static ssize_t adistance_store(struct device *dev, struct device_attribute= *attr, + const char *buf, size_t len) +{ + struct dax_kmem_data *data =3D dev_get_drvdata(dev); + int adist; + ssize_t rc; + + if (!data) + return -ENXIO; + + rc =3D kstrtoint(buf, 0, &adist); + if (rc) + return rc; + if (adist <=3D 0) + return -EINVAL; + + guard(mutex)(&data->lock); + + /* adistance only reconfigures the device while it holds no memory. */ + if (data->state !=3D DAX_KMEM_UNPLUGGED) + return -EBUSY; + + rc =3D kmem_set_adistance(data, adist); + if (rc) + return rc; + return len; +} +static DEVICE_ATTR_RW(adistance); + static const struct attribute_group dax_kmem_private_group; =20 static ssize_t private_show(struct device *dev, struct device_attribute *a= ttr, @@ -529,6 +590,11 @@ static ssize_t private_store(struct device *dev, struc= t device_attribute *attr, if (enable =3D=3D data->private) return len; =20 + /* When toggling private, reset custom adistance to default */ + rc =3D kmem_set_adistance(data, MEMTIER_DEFAULT_DAX_ADISTANCE); + if (rc) + return rc; + if (enable) { /* Add the per-service opt-in attributes. */ rc =3D sysfs_create_group(&dev->kobj, &dax_kmem_private_group); @@ -637,6 +703,7 @@ KMEM_PRIVATE_CAP_ATTR(ltpin, NODE_PRIVATE_CAP_LTPIN); =20 /* Per-service opt-ins. Visibility toggled by 'private' control */ static struct attribute *dax_kmem_private_attrs[] =3D { + &dev_attr_adistance.attr, &dev_attr_reclaim.attr, &dev_attr_user_numa.attr, &dev_attr_hotunplug.attr, @@ -719,6 +786,7 @@ static int dev_dax_kmem_probe(struct dev_dax *dev_dax) data->mgid =3D rc; data->numa_node =3D numa_node; data->state =3D DAX_KMEM_UNPLUGGED; + data->adistance =3D adist; data->np.owner =3D data; mutex_init(&data->lock); =20 --=20 2.53.0-Meta