percpu: teach large page allocator about NUMA
authorTejun Heo <tj@kernel.org>
Fri, 3 Jul 2009 23:11:00 +0000 (08:11 +0900)
committerTejun Heo <tj@kernel.org>
Fri, 3 Jul 2009 23:11:00 +0000 (08:11 +0900)
commita530b7958612bafe2027e21359083dba84f0b3b4
treefecbfc0d23b7702a903e8b2539e04e6086ba4404
parent2f39e637ea240efb74cf807d31c93a71a0b89174
percpu: teach large page allocator about NUMA

Large page first chunk allocator is primarily used for NUMA machines;
however, its NUMA handling is extremely simplistic.  Regardless of
their proximity, each cpu is put into separate large page just to
return most of the allocated space back wasting large amount of
vmalloc space and increasing cache footprint.

This patch teachs NUMA details to large page allocator.  Given
processor proximity information, pcpu_lpage_build_unit_map() will find
fitting cpu -> unit mapping in which cpus in LOCAL_DISTANCE share the
same large page and not too much virtual address space is wasted.

This greatly reduces the unit and thus chunk size and wastes much less
address space for the first chunk.  For example, on 4/4 NUMA machine,
the original code occupied 16MB of virtual space for the first chunk
while the new code only uses 4MB - one 2MB page for each node.

[ Impact: much better space efficiency on NUMA machines ]

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jan Beulich <JBeulich@novell.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Miller <davem@davemloft.net>
arch/x86/kernel/setup_percpu.c
include/linux/percpu.h
mm/percpu.c