memcg: allocate memory cgroup structures in local nodes

Commit dde79e005a ("page_cgroup: reduce allocation overhead for
page_cgroup array for CONFIG_SPARSEMEM") added a regression that the
memory cgroup data structures all end up in node 0 because the first
attempt at allocating them would not pass in a node hint.  Since the
initialization runs on CPU #0 it would all end up node 0.  This is a
problem on large memory systems, where node 0 would lose a lot of
memory.

Change the alloc_pages_exact() to alloc_pages_exact_nid().  This will
still fall back to other nodes if not enough memory is available.

 [ RED-PEN: right now it would fall back first before trying
   vmalloc_node.  Probably not the best strategy ...  But I left it like
   that for now. ]

Signed-off-by: Andi Kleen <[email protected]>
Reported-by: Doug Nelson
Cc: David Rientjes <[email protected]>
Reviewed-by: Michal Hocko <[email protected]>
Cc: Dave Hansen <[email protected]>
Acked-by: Balbir Singh <[email protected]>
Acked-by: Johannes Weiner <[email protected]>
Reviewed-by: KOSAKI Motohiro <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
Andi Kleen authored and Linus Torvalds committed 2011-05-11 18:50:45 -07:00
1 parent ee85c2e145
commit 21a3c96468
1 file changed
+1 -1
+1 -1
View File
@@ -134,7 +134,7 @@ static void *__init_refok alloc_page_cgroup(size_t size, int nid)
{
void *addr = NULL;
addr = alloc_pages_exact(size, GFP_KERNEL | __GFP_NOWARN);
addr = alloc_pages_exact_nid(nid, size, GFP_KERNEL | __GFP_NOWARN);
if (addr)
return addr;