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
Subsystems (3)
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
7f36e3e56db1ae75d1e157011b3cb2e0957f0a7eMon 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().
--- 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