Patchwork [3.5.y.z,extended,stable] Patch "mm/hotplug: correctly add new zone to all other nodes' zone" has been added to staging queue

mail settings
Submitter Luis Henriques
Date March 20, 2013, 10:43 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/229366/
State New
Headers show


Luis Henriques - March 20, 2013, 10:43 a.m.
This is a note to let you know that I have just added a patch titled

    mm/hotplug: correctly add new zone to all other nodes' zone

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From 5945e570620711249a54509dea2f7675f6a9cfb0 Mon Sep 17 00:00:00 2001
From: Jiang Liu <>
Date: Tue, 31 Jul 2012 16:43:30 -0700
Subject: [PATCH] mm/hotplug: correctly add new zone to all other nodes' zone

commit 08dff7b7d629807dbb1f398c68dd9cd58dd657a1 upstream.

When online_pages() is called to add new memory to an empty zone, it
rebuilds all zone lists by calling build_all_zonelists().  But there's a
bug which prevents the new zone to be added to other nodes' zone lists.

online_pages() {
	node_set_state(zone_to_nid(zone), N_HIGH_MEMORY)

Here the node of the zone is put into N_HIGH_MEMORY state after calling
build_all_zonelists(), but build_all_zonelists() only adds zones from
nodes in N_HIGH_MEMORY state to the fallback zone lists.

		->for_each_node_state(n, N_HIGH_MEMORY)

So memory in the new zone will never be used by other nodes, and it may
cause strange behavor when system is under memory pressure.  So put node
into N_HIGH_MEMORY state before calling build_all_zonelists().

Signed-off-by: Jianguo Wu <>
Signed-off-by: Jiang Liu <>
Cc: Mel Gorman <>
Cc: Michal Hocko <>
Cc: Minchan Kim <>
Cc: Rusty Russell <>
Cc: Yinghai Lu <>
Cc: Tony Luck <>
Cc: KAMEZAWA Hiroyuki <>
Cc: KOSAKI Motohiro <>
Cc: David Rientjes <>
Cc: Keping Chen <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>
[ luis: backported to 3.5 ]
Signed-off-by: Luis Henriques <>
 mm/memory_hotplug.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)



diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 0086ac9..17651cd 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -516,19 +516,20 @@  int __ref online_pages(unsigned long pfn, unsigned long nr_pages)

 	zone->present_pages += onlined_pages;
 	zone->zone_pgdat->node_present_pages += onlined_pages;
-	if (need_zonelists_rebuild)
-		build_all_zonelists(zone);
-	else
-		zone_pcp_update(zone);
+	if (onlined_pages) {
+		node_set_state(zone_to_nid(zone), N_HIGH_MEMORY);
+		if (need_zonelists_rebuild)
+			build_all_zonelists(zone);
+		else
+			zone_pcp_update(zone);
+	}



-	if (onlined_pages) {
+	if (onlined_pages)
-		node_set_state(zone_to_nid(zone), N_HIGH_MEMORY);
-	}

 	vm_total_pages = nr_free_pagecache_pages();