From: Gregory Price <gourry@gourry.net>
To: linux-mm@kvack.org
Cc: linux-cxl@vger.kernel.org, linux-kernel@vger.kernel.org,
kernel-team@meta.com, david@kernel.org, osalvador@suse.de,
akpm@linux-foundation.org
Subject: [PATCH] mm/memory_hotplug: factor out node_is_memoryless()
Date: Wed, 2 Sep 2026 15:55:07 -0400 [thread overview]
Message-ID: <20260902195507.88655-1-gourry@gourry.net> (raw)
A memoryless node neither spans present pages (populated or ZONE_DEVICE)
nor has an offline-but-added memory block still linked to it in sysfs.
try_offline_node() presently open-codes this memoryless check.
Pull that into a node_is_memoryless() helper and pull the existing
check_no_memblock_for_node_cb() helper ahead of the add/online path
so it's clearer what is happening here.
No functional change.
Signed-off-by: Gregory Price <gourry@gourry.net>
---
mm/memory_hotplug.c | 60 +++++++++++++++++++++++----------------------
1 file changed, 31 insertions(+), 29 deletions(-)
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 226ab9cb078ad..d0e94057682af 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -1491,6 +1491,36 @@ static int create_altmaps_and_memory_blocks(int nid, struct memory_group *group,
return ret;
}
+static int check_no_memblock_for_node_cb(struct memory_block *mem, void *arg)
+{
+ int nid = *(int *)arg;
+
+ /*
+ * If a memory block belongs to multiple nodes, the stored nid is not
+ * reliable. However, such blocks are always online (e.g., cannot get
+ * offlined) and, therefore, are still spanned by the node.
+ */
+ return mem->nid == nid ? -EEXIST : 0;
+}
+
+/* Caller must hold the memory hotplug lock for this check. */
+static bool node_is_memoryless(int nid)
+{
+ /*
+ * A node still spanning pages (especially ZONE_DEVICE) is not
+ * memoryless. A node spans memory after move_pfn_range_to_zone(),
+ * e.g. once a memory block has been onlined.
+ */
+ if (node_spanned_pages(nid))
+ return false;
+ /*
+ * Offline memory blocks may not be spanned by the node yet, but they
+ * link to it in sysfs and can be onlined later, so the node is not
+ * memoryless while any remain.
+ */
+ return !for_each_memory_block(&nid, check_no_memblock_for_node_cb);
+}
+
/*
* NOTE: The caller must call lock_device_hotplug() to serialize hotplug
* and online/offline operations (triggered e.g. by sysfs).
@@ -2214,18 +2244,6 @@ static int check_cpu_on_node(int nid)
return 0;
}
-static int check_no_memblock_for_node_cb(struct memory_block *mem, void *arg)
-{
- int nid = *(int *)arg;
-
- /*
- * If a memory block belongs to multiple nodes, the stored nid is not
- * reliable. However, such blocks are always online (e.g., cannot get
- * offlined) and, therefore, are still spanned by the node.
- */
- return mem->nid == nid ? -EEXIST : 0;
-}
-
/**
* try_offline_node
* @nid: the node ID
@@ -2237,23 +2255,7 @@ static int check_no_memblock_for_node_cb(struct memory_block *mem, void *arg)
*/
void try_offline_node(int nid)
{
- int rc;
-
- /*
- * If the node still spans pages (especially ZONE_DEVICE), don't
- * offline it. A node spans memory after move_pfn_range_to_zone(),
- * e.g., after the memory block was onlined.
- */
- if (node_spanned_pages(nid))
- return;
-
- /*
- * Especially offline memory blocks might not be spanned by the
- * node. They will get spanned by the node once they get onlined.
- * However, they link to the node in sysfs and can get onlined later.
- */
- rc = for_each_memory_block(&nid, check_no_memblock_for_node_cb);
- if (rc)
+ if (!node_is_memoryless(nid))
return;
if (check_cpu_on_node(nid))
--
2.53.0-Meta
next reply other threads:[~2026-09-02 19:55 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-02 19:55 Gregory Price [this message]
2026-09-02 20:08 ` [PATCH] mm/memory_hotplug: factor out node_is_memoryless() sashiko-bot
2026-09-03 0:52 ` Gregory Price
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260902195507.88655-1-gourry@gourry.net \
--to=gourry@gourry.net \
--cc=akpm@linux-foundation.org \
--cc=david@kernel.org \
--cc=kernel-team@meta.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=osalvador@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox