Skip to contentSkip to conversation

Patch "memory-hotplug: add hot-added memory ranges to memblock before allocate node_data for a node." has been added to the 4.2-stable tree

PATCH [email protected] 1 participant 1 message Sep 19, 2015

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

memory-hotplug: add hot-added memory ranges to memblock before allocate node_data for a node.

to the 4.2-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
memory-hotplug-add-hot-added-memory-ranges-to-memblock-before-allocate-node_data-for-a-node.patch
and it can be found in the queue-4.2 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 7f36e3e56db1ae75d1e157011b3cb2e0957f0a7e Mon Sep 17 00:00:00 2001

From: Tang Chen <[email protected]>
Date: Fri, 4 Sep 2015 15:42:32 -0700
Subject: memory-hotplug: add hot-added memory ranges to memblock before allocate node_data for a node.

From: Tang Chen <[email protected]>

commit 7f36e3e56db1ae75d1e157011b3cb2e0957f0a7e upstream.

Commit f9126ab9241f ("memory-hotplug: fix wrong edge when hot add a new node") hot-added memory range to memblock, after creating pgdat for new node.

But there is a problem:

add_memory()
|--> hotadd_new_pgdat()

       |--> free_area_init_node()
            |--> get_pfn_range_for_nid()
                 |--> find start_pfn and end_pfn in memblock

|--> ......
|--> memblock_add_node(start, size, nid) -------- Here, just too late.

get_pfn_range_for_nid() will find that start_pfn and end_pfn are both 0. As a result, when adding memory, dmesg will give the following wrong message.

Initmem setup node 5 [mem 0x0000000000000000-0xffffffffffffffff] On node 5 totalpages: 0
Built 5 zonelists in Node order, mobility grouping on. Total pages: 32588823 Policy zone: Normal
init_memory_mapping: [mem 0x60000000000-0x607ffffffff]

The solution is simple, just add the memory range to memblock a little earlier, before hotadd_new_pgdat().

[[email protected]: coding-style fixes]
Cc Xishi Qiu <[email protected]>
Cc Yasuaki Ishimatsu <[email protected]>
Cc Kamezawa Hiroyuki <[email protected]>
Cc Taku Izumi <[email protected]>
Cc Gu Zheng <[email protected]>
Cc Naoya Horiguchi <[email protected]>
Cc Vlastimil Babka <[email protected]>
Cc Mel Gorman <[email protected]>
Cc David Rientjes <[email protected]>
---
 mm/memory_hotplug.c |   10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)
mm/memory_hotplug.c +9 -1
@@ -1248,6 +1248,14 @@ int __ref add_memory(int nid, u64 start,
 
 	mem_hotplug_begin();
 
+	/*
+	 * Add new range to memblock so that when hotadd_new_pgdat() is called
+	 * to allocate new pgdat, get_pfn_range_for_nid() will be able to find
+	 * this new range and calculate total pages correctly.  The range will
+	 * be removed at hot-remove time.
+	 */
+	memblock_add_node(start, size, nid);
+
 	new_node = !node_online(nid);
 	if (new_node) {
 		pgdat = hotadd_new_pgdat(nid, start);
@@ -1277,7 +1285,6 @@ int __ref add_memory(int nid, u64 start,
 
 	/* create new memmap entry */
 	firmware_map_add_hotplug(start, start + size, "System RAM");
-	memblock_add_node(start, size, nid);
 
 	goto out;
 
@@ -1286,6 +1293,7 @@ error:
 	if (new_pgdat)
 		rollback_node_hotadd(nid, pgdat);
 	release_memory_resource(res);
+	memblock_remove(start, size);
 
 out:
 	mem_hotplug_done();

Patches currently in stable-queue which might be from [email protected] are

queue-4.2/memory-hotplug-add-hot-added-memory-ranges-to-memblock-before-allocate-node_data-for-a-node.patch