From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 51A8DC83013 for ; Wed, 2 Jul 2025 07:39:30 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7FED86B00A7; Wed, 2 Jul 2025 03:39:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 789176B00A9; Wed, 2 Jul 2025 03:39:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 601A96B00AB; Wed, 2 Jul 2025 03:39:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 465086B00A7 for ; Wed, 2 Jul 2025 03:39:28 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id D316E160222 for ; Wed, 2 Jul 2025 07:39:27 +0000 (UTC) X-FDA: 83618524374.22.D9AD8E5 Received: from nyc.source.kernel.org (nyc.source.kernel.org [147.75.193.91]) by imf16.hostedemail.com (Postfix) with ESMTP id 4152D180003 for ; Wed, 2 Jul 2025 07:39:26 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=eqtAcDdA; spf=pass (imf16.hostedemail.com: domain of hare@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=hare@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751441966; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Q5xdV7/bzUbRASuoXQQV3bvuowSsku25UCKp3nxbWww=; b=ULqWsfmp4vm/B21lF4Hbc+66XBycfcecjjXGLd8Yr2Otf76EGSR3bF91qFch9ovdzCz4Vk yy61BxPFnq9KsRiFYH629KsS1aanOKYZVhiv4fLh//Dtw/fr9OwK4S0hNNGKaq1VgfclIJ AUhd0/XdlfZhLuJ1bAqdfJGmiAZoEFc= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=eqtAcDdA; spf=pass (imf16.hostedemail.com: domain of hare@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=hare@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751441966; a=rsa-sha256; cv=none; b=QTU+nrl+uVgzn3jOZBQySWp1AyJoEDbOhHuK16zT2s26uyZjcb+6p/i3W+Tdo1IxS0fMY2 vpTBxcKVVPVaiAYnt5m3dwSn2gCt1rkpUoHt62qOGhCKeH2Bdf17JkUD1BJyF8symlJO1O o9A7bXI8bHeuw0RTDBExkmqFgtqf3Sg= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by nyc.source.kernel.org (Postfix) with ESMTP id 93B4EA53386; Wed, 2 Jul 2025 07:39:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 26A7FC4CEED; Wed, 2 Jul 2025 07:39:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751441965; bh=yCLT+cFs/4y5ZdvYE+J6SgTMVXmHfGfe6jgyDk3KZL8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eqtAcDdAE2hUFZiL+mmt8cV7KtM8ZMy6NiPwZnHqW8bxbDX/H5ShePOJCxQ9mSbXW tsoQzsw01n18fugECcZpVWioFkYRe2C5C6wVjxEvFV6mYbsKlCl/XN9Opmap8dln9D EdK5vW82uSOtwhyVbSjPfpM7jUW2AtgioIj8bifh7dU6vQMctfpzlItoM7NlQnsWi4 /Apx3WvmbfcO8FKXc5onMvuJhJyoZT6AyA6BadYJPhCsrhC1EuMApgH98fDWN8UO93 J7KMzJ+UOUyF0EDAUtc9vGw7cfspkpccTyg2EWg1WJdEqargXPUHJtoMq0oU9MAMm3 f1HVidwuDYnyA== From: Hannes Reinecke To: David Hildenbrand Cc: Oscar Salvador , linux-mm@kvack.org, Hannes Reinecke Subject: [PATCH 2/3] mm/memory_hotplug: activate node before adding new memory blocks Date: Wed, 2 Jul 2025 09:39:12 +0200 Message-ID: <20250702073913.58247-3-hare@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250702073913.58247-1-hare@kernel.org> References: <20250702073913.58247-1-hare@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 4152D180003 X-Stat-Signature: 1ytdded7fma5ufpdy3oymrmfjgdqjkqe X-HE-Tag: 1751441966-188293 X-HE-Meta: U2FsdGVkX1/HeAeTh2Dv3CNCffUG/+GMoyrbycULGwSVH+Dkb+mX/PgMNw/Vxs41ZMl7CFbmLH/ORjruLaEBUEt7bPAxzTrUaAaFkBGMqKh506jheNDqth1hj+9B2sR0biqnDRH9r2zmwG1kVN+lI+kEK8p5Mpl+ft0ATw6G/7aspvtZ2jCNt1FlQcOOKd6ieXUXPeTt+yvmPiOvW3xqvLlUaj6Le4+wB2TVPo4rJ6M1RqHnprPqrHPbU0YWfdQFVjN26zAPBmWO2UrLpSNOMzm+tfKDSJ85sqtUqy5dizIxHIbeodXidZa/OKcH0n5qMwLT/dzW/rY4CVaATzxE4PxRwGydRqdROjC9ydKA26daYC6UzS0C+stYvDtW+ibCWmwO6GZ4vtMcF/lp/+S5sh+9ehOh56gSa7MUpR5xeD+hukgW+8qAtP4sJORFXO3F0opl8vXFZnUu/ONVLfcLmDkR9jffF/YV/9l19THsbu7YRFGFzwQH3KizCZR4lc5cx7L5xvIdi8g9F79Z4jbbvk9sWFv2eiZClmwZkQX8/OBFdJ98A6xhifc8vvcMiI/77CIEQZGVEmEQR7LUmzKXq0B+okMwzsC8vkrNaUd+9QJhasLOScA6E94sr/wtIQVZ3EvFMeH68FHpnb18Q28ubazMYAOZFWPRjGC4bcNfwRNK66jzoXWTyKB+0eaa8rj5L01v3NsbPkxDUU7foqldxueUac/mh5J0CameooOCvOUz201O18sb0mHVQJUqh7GY4zXyXJIiLuDONWO+D1bB2MMLGRe5+yvvhwh7uKF3ZMfh9oorhjLReFgWOzpeTw4Ag/3XUXD6Qgwmmwb0sKp3EvOuemu1r2PlLtOeaI+CHK1zcCEZk2GlHb8ktDS77AWi1SNnxB/X3Q07YvsgkxMyOr4rNOK5ur9dNcqpV8TVjFgVcQ2CKGkPpusxMYPHaMdjZg99Un8KioC3lJu/L55 Dq894ReI F+xfs5yCSL1T+YlTQGVIILmPQs6Gk2aq91P8lbrCSFwLJ0zhVJ230jMz34FB+jxpXGQS8gZoTwuBsGmuGeWXWx0KYnGw1Jpr7+6vA+6GhBbIM6n6HWMthSBvpDCBui75wCPPxrM+hTzB3ayDy1U3FqRRl3U+DC+apsmVKI4qjCcAc3en3gA0ipVIsxsCa7CctS9IW/b8D7v7GofdFQoj/8YAfs9ma8gz685uzIMAZR7e01PEW9H28mu71h130LjsrXfOtBXjYarzSvPWg54IGes/fhILOVqWZycbYltLzf6wzOd7yzhMWAJl99mkiOv66/ybF X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: The sysfs attributes for memory blocks require the node ID to be set and initialized, so move the node activation before adding new memory blocks. This also has the nice side effect that the BUG_ON() can be converted into a WARN_ON() as we now can handle registration errors. Fixes: b9ff036082cd ("mm/memory_hotplug.c: make add_memory_resource use __try_online_node") Signed-off-by: Hannes Reinecke --- drivers/base/memory.c | 19 +++++++++---------- include/linux/memory.h | 2 +- mm/memory_hotplug.c | 32 +++++++++++++++++--------------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 2b951e5f8a27..d24a90e0ea96 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -810,15 +810,14 @@ void memory_block_add_nid(struct memory_block *mem, int nid, mem->zone = early_node_zone_for_memory_block(mem, nid); else mem->zone = NULL; + /* + * If this memory block spans multiple nodes, we only indicate + * the last processed node. If we span multiple nodes (not applicable + * to hotplugged memory), zone == NULL will prohibit memory offlining + * and consequently unplug. + */ + mem->nid = nid; } - - /* - * If this memory block spans multiple nodes, we only indicate - * the last processed node. If we span multiple nodes (not applicable - * to hotplugged memory), zone == NULL will prohibit memory offlining - * and consequently unplug. - */ - mem->nid = nid; } #endif @@ -892,7 +891,7 @@ static void remove_memory_block(struct memory_block *memory) * Called under device_hotplug_lock. */ int create_memory_block_devices(unsigned long start, unsigned long size, - struct vmem_altmap *altmap, + int nid, struct vmem_altmap *altmap, struct memory_group *group) { const unsigned long start_block_id = pfn_to_block_id(PFN_DOWN(start)); @@ -906,7 +905,7 @@ int create_memory_block_devices(unsigned long start, unsigned long size, return -EINVAL; for (block_id = start_block_id; block_id != end_block_id; block_id++) { - ret = add_memory_block(block_id, NUMA_NO_NODE, MEM_OFFLINE, altmap, group); + ret = add_memory_block(block_id, nid, MEM_OFFLINE, altmap, group); if (ret) break; } diff --git a/include/linux/memory.h b/include/linux/memory.h index 5ec4e6d209b9..d7c3a4856031 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -161,7 +161,7 @@ static inline unsigned long memory_block_advised_max_size(void) extern int register_memory_notifier(struct notifier_block *nb); extern void unregister_memory_notifier(struct notifier_block *nb); int create_memory_block_devices(unsigned long start, unsigned long size, - struct vmem_altmap *altmap, + int nid, struct vmem_altmap *altmap, struct memory_group *group); void remove_memory_block_devices(unsigned long start, unsigned long size); extern void memory_dev_init(void); diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index b1caedbade5b..204bd6f19d8d 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1478,7 +1478,7 @@ static int create_altmaps_and_memory_blocks(int nid, struct memory_group *group, } /* create memory block devices after memory was added */ - ret = create_memory_block_devices(cur_start, memblock_size, + ret = create_memory_block_devices(cur_start, memblock_size, nid, params.altmap, group); if (ret) { arch_remove_memory(cur_start, memblock_size, NULL); @@ -1540,8 +1540,16 @@ int add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags) ret = __try_online_node(nid, false); if (ret < 0) - goto error; - new_node = ret; + goto error_memblock_remove; + if (ret) { + node_set_online(nid); + ret = __register_one_node(nid); + if (WARN_ON(ret)) { + node_set_offline(nid); + goto error_memblock_remove; + } + new_node = true; + } /* * Self hosted memmap array @@ -1557,24 +1565,13 @@ int add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags) goto error; /* create memory block devices after memory was added */ - ret = create_memory_block_devices(start, size, NULL, group); + ret = create_memory_block_devices(start, size, nid, NULL, group); if (ret) { arch_remove_memory(start, size, params.altmap); goto error; } } - if (new_node) { - /* If sysfs file of new node can't be created, cpu on the node - * can't be hot-added. There is no rollback way now. - * So, check by BUG_ON() to catch it reluctantly.. - * We online node here. We can't roll back from here. - */ - node_set_online(nid); - ret = __register_one_node(nid); - BUG_ON(ret); - } - register_memory_blocks_under_node(nid, PFN_DOWN(start), PFN_UP(start + size - 1), MEMINIT_HOTPLUG); @@ -1599,6 +1596,11 @@ int add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags) return ret; error: + if (new_node) { + node_set_offline(nid); + unregister_one_node(nid); + } +error_memblock_remove: if (IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) memblock_remove(start, size); error_mem_hotplug_end: -- 2.43.0