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 CF185C8302F for ; Tue, 1 Jul 2025 11:42:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id ACF1B6B00A9; Tue, 1 Jul 2025 07:42:06 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A801E6B00AA; Tue, 1 Jul 2025 07:42:06 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 96F4D6B00AC; Tue, 1 Jul 2025 07:42:06 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 81A966B00A9 for ; Tue, 1 Jul 2025 07:42:06 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 4B46D14033A for ; Tue, 1 Jul 2025 11:42:06 +0000 (UTC) X-FDA: 83615507052.24.07FDCDD Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf05.hostedemail.com (Postfix) with ESMTP id D048910000D for ; Tue, 1 Jul 2025 11:42:04 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=kQSwtDuz; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf05.hostedemail.com: domain of hare@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=hare@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751370124; a=rsa-sha256; cv=none; b=YhJkHMQXxUbkhlEY0qlIEmvQeEj2c1rb2lzpLZW+iQfJqcZjDa1ASHykdCcIVFOT+pVu9j 9yFaBGAwF3UMjfWFC6CCpe20sVJ1qhskd7hLOKgRiuiK1aSjIV0iSm8mtrglFqHQ/AvH3U zZGWCwgTXCBHoBeP+uSPyDAyP6tKtHg= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=kQSwtDuz; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf05.hostedemail.com: domain of hare@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=hare@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751370124; 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=iIWNapQss9DvweIh2d71hNcv8jM3hHhBmd8NITuzsN4=; b=NW1OyXunfL1/DgGtN5S2PMne+QCNhIVZLmW49YKoJ/oh4KSneBjVStC7353iFcl9FM7Jk/ CmFbJE2RFMdB1vElM7h9Cy7UOrgJNbqvEYqIk5Kj48imVTu6ZW7KRo7NtOcHMoMA6Tmz+X fiT4eD4kWB4G8EDkrhTs2Tn4DQ43iUU= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 2EAE85C6883; Tue, 1 Jul 2025 11:42:04 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C425DC4CEEB; Tue, 1 Jul 2025 11:42:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751370123; bh=aME1dGWSMrATRgoeB4hifjSzrrcDo4rLkpUMsAhYpr0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kQSwtDuzQMHdmMKDVN72JgwmmXypBpnn5A9ahq4Z5qaB3Gl4bIYG2M5HjQ+5Xf1m4 4ek0AlQVKW3OUpKML0G9as/R01Muuld65kwIYM964KbpiyfHi5w2VJM1KJPC0zS5oP y+cOgW09vWXZmtp6CleGUKu7d1K0zLQp4NW43YUBIXcmQJoRJMthEKtaWqDHyGEc/W b00J5YQPsWUnqpTvBRPdouNVHsnm59CUdcb5Lu1U8Yq1jYJHevgNjnKqitbCb5Racj Vs4FHzE7CZFvziyQMT/s/k+wNSwPxoU8qxp+hL02Btt3ym0qQdrBOZ+V5BC80ziO6N WHiUmPfq6Pk+A== From: Hannes Reinecke To: David Hildenbrand Cc: Oscar Salvador , linux-mm@kvack.org, Hannes Reinecke Subject: [PATCH 2/2] mm/memory_hotplug: activate node before adding new memory blocks Date: Tue, 1 Jul 2025 13:41:54 +0200 Message-ID: <20250701114155.16452-3-hare@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250701114155.16452-1-hare@kernel.org> References: <20250701114155.16452-1-hare@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: D048910000D X-Stat-Signature: j6tesc67s8i48fctbymgjxrxk1yeykp8 X-Rspam-User: X-HE-Tag: 1751370124-764561 X-HE-Meta: U2FsdGVkX19iGO7Hd64m41TejRHiQs/DkOMDIQLop0MPu7MBSTQxZ+XhcrW0sYZqcOGNsoJEEkmTnI2mlfkyjG9EC9coiIQ37POj/MIv+9esK+qiYuT+WR65UnR+UoNudbM3NTdUzWXdlo93Q3YgOsvNsO4k7ZJ7cxMB5t5fMOS1sxMTziVB357M8qGRCXyOUD+MNcbuucebhzXil/ma+jUYZUkosfMpXJ+4CNprsArh5y29v+FCUeBzKoRc0S/c0t0KyJmWVDTa1cILOV5Dpjwsu2ctqWmpgcI1OGdhH5fKW3P1d6h3wk22sl1xKh82gM/GT9orQadO6ntabrowk2mptOc4wr4rox3AeMvz+DXSErV3bBfy6yLevlhrzrk/kEuVAcPAvH8OGjGvtmLpDip56d9OaOxVgl+G/ahaqSQPYnc45s+hY355fnyUFn5hwos4QBmPCsngvWK6FHybUVg5WFV4h+43MB4kjBpmtnSnKJX4vkzyy4g3g0mUiRlHuNcn5Oiju6SA1bxXZmQutuDPrcs0br4J+IdX7FTkv/eyYH7N4vCBWTX94CVUXVfG2JVIhg9BOZpBghHInNug2AiDYzauE89QgTfZmtzqC0Er3JyhqaXcZKk2RcmP7z33RiGUY4fHXH/8N0MWdp8yF3px0O0AAHuCE912cF4XghjkGMYgoRsJKpxivTarY/QcwYqVvQx57i5hSDhC89nwJqMkS4ufUbxHYXN0P9gdAyocU7VuqYcyOohFfwxHkB3EajoTPFuR4YjDr3DxS+IRXbii/CNgXVqtXeIBhMT01/UY0YzDEiwi+ZO9xN4K65+ZeAZIfXsHHhn/RMd8g/A7tWnR7+vQJM2hyzVuVj3dGiP+xfyO+cGLfc7wd30m2mCGgSk5UWb8cA5hiy5KBtxU6JgYTsRY/F6hWgD6u5IKa73Bd/JPMEze0KPvqdYO5A66gRFXiXSlCiCnAhCjfqS Pt7/6s3L 8Lsx82fH5Kaso0bXJEQShjCunrJPoebyIUuN38ORaqt2tsPY= 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. 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