aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
authorKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>2008-04-08 20:41:54 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-08 21:25:53 -0400
commit41e3355de052693c7a0cad74b845148d262edadf (patch)
tree7d40851015f1a90a9c6386c3e880ed23ac5127cb /mm/memcontrol.c
parentbb070e43497d4fcfea7d8b52003fe1376c218343 (diff)
memcg: fix node_state handling
This should be N_NORMAL_MEMORY. N_NORMAL_MEMORY is "true" if a node has memory for the kernel. N_HIGH_MEMORY is "true" if a node has memory for HIGHMEM. (If CONFIG_HIGHMEM=n, always "true") This check is used for testing whether we can use kmalloc_node() on a node. Then, if there is a node which only contains HIGHMEM, the system will call kmalloc_node() which doesn't contain memory for the kernel. If it happens under SLUB, the kernel will panic. I think this only happens on x86_32-numa. Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Balbir Singh <balbir@in.ibm.com> Cc: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r--mm/memcontrol.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 23b5fa4cabd8..2e0bfc93484b 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -978,7 +978,7 @@ static int alloc_mem_cgroup_per_zone_info(struct mem_cgroup *mem, int node)
978{ 978{
979 struct mem_cgroup_per_node *pn; 979 struct mem_cgroup_per_node *pn;
980 struct mem_cgroup_per_zone *mz; 980 struct mem_cgroup_per_zone *mz;
981 int zone; 981 int zone, tmp = node;
982 /* 982 /*
983 * This routine is called against possible nodes. 983 * This routine is called against possible nodes.
984 * But it's BUG to call kmalloc() against offline node. 984 * But it's BUG to call kmalloc() against offline node.
@@ -987,10 +987,9 @@ static int alloc_mem_cgroup_per_zone_info(struct mem_cgroup *mem, int node)
987 * never be onlined. It's better to use memory hotplug callback 987 * never be onlined. It's better to use memory hotplug callback
988 * function. 988 * function.
989 */ 989 */
990 if (node_state(node, N_HIGH_MEMORY)) 990 if (!node_state(node, N_NORMAL_MEMORY))
991 pn = kmalloc_node(sizeof(*pn), GFP_KERNEL, node); 991 tmp = -1;
992 else 992 pn = kmalloc_node(sizeof(*pn), GFP_KERNEL, tmp);
993 pn = kmalloc(sizeof(*pn), GFP_KERNEL);
994 if (!pn) 993 if (!pn)
995 return 1; 994 return 1;
996 995