diff options
author | KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 2008-04-08 20:41:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-08 21:25:53 -0400 |
commit | 41e3355de052693c7a0cad74b845148d262edadf (patch) | |
tree | 7d40851015f1a90a9c6386c3e880ed23ac5127cb /mm | |
parent | bb070e43497d4fcfea7d8b52003fe1376c218343 (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')
-rw-r--r-- | mm/memcontrol.c | 9 |
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 | ||