]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
slub, hotplug: ignore unrelated node's hot-adding and hot-removing
authorLai Jiangshan <laijs@cn.fujitsu.com>
Sat, 3 Nov 2012 00:42:19 +0000 (11:42 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 7 Nov 2012 04:15:10 +0000 (15:15 +1100)
SLUB only focuses on the nodes which have normal memory and it ignores the
other node's hot-adding and hot-removing.

Aka: if some memory of a node which has no onlined memory is online, but
this new memory onlined is not normal memory (for example, highmem), we
should not allocate kmem_cache_node for SLUB.

And if the last normal memory is offlined, but the node still has memory,
we should remove kmem_cache_node for that node.  (The current code delays
it when all of the memory is offlined)

So we only do something when marg->status_change_nid_normal > 0.
marg->status_change_nid is not suitable here.

The same problem doesn't exist in SLAB, because SLAB allocates kmem_list3
for every node even the node don't have normal memory, SLAB tolerates
kmem_list3 on alien nodes.  SLUB only focuses on the nodes which have
normal memory, it don't tolerate alien kmem_cache_node.  The patch makes
SLUB become self-compatible and avoids WARNs and BUGs in rare conditions.

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Cc: Rob Landley <rob@landley.net>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jiang Liu <jiang.liu@huawei.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Greg Kroah-Hartman <gregkh@suse.de>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Wen Congyang <wency@cn.fujitsu.com>
Acked-by: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/slub.c

index b2ada3db42251730198f9597c489307e3a78b768..097ac86a3606b9b89a7478c13efd1de786f42450 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3555,7 +3555,7 @@ static void slab_mem_offline_callback(void *arg)
        struct memory_notify *marg = arg;
        int offline_node;
 
-       offline_node = marg->status_change_nid;
+       offline_node = marg->status_change_nid_normal;
 
        /*
         * If the node still has available memory. we need kmem_cache_node
@@ -3588,7 +3588,7 @@ static int slab_mem_going_online_callback(void *arg)
        struct kmem_cache_node *n;
        struct kmem_cache *s;
        struct memory_notify *marg = arg;
-       int nid = marg->status_change_nid;
+       int nid = marg->status_change_nid_normal;
        int ret = 0;
 
        /*