this_cpu: Page allocator conversion
authorChristoph Lameter <cl@linux-foundation.org>
Tue, 5 Jan 2010 06:34:51 +0000 (15:34 +0900)
committerTejun Heo <tj@kernel.org>
Tue, 5 Jan 2010 06:34:51 +0000 (15:34 +0900)
commit99dcc3e5a94ed491fbef402831d8c0bbb267f995
treedd4d2b9e10ab0d4502e4b2a22dfc0a02a3300d7e
parent5917dae83cb02dfe74c9167b79e86e6d65183fa3
this_cpu: Page allocator conversion

Use the per cpu allocator functionality to avoid per cpu arrays in struct zone.

This drastically reduces the size of struct zone for systems with large
amounts of processors and allows placement of critical variables of struct
zone in one cacheline even on very large systems.

Another effect is that the pagesets of one processor are placed near one
another. If multiple pagesets from different zones fit into one cacheline
then additional cacheline fetches can be avoided on the hot paths when
allocating memory from multiple zones.

Bootstrap becomes simpler if we use the same scheme for UP, SMP, NUMA. #ifdefs
are reduced and we can drop the zone_pcp macro.

Hotplug handling is also simplified since cpu alloc can bring up and
shut down cpu areas for a specific cpu as a whole. So there is no need to
allocate or free individual pagesets.

V7-V8:
- Explain chicken egg dilemmna with percpu allocator.

V4-V5:
- Fix up cases where per_cpu_ptr is called before irq disable
- Integrate the bootstrap logic that was separate before.

tj: Build failure in pageset_cpuup_callback() due to missing ret
    variable fixed.

Reviewed-by: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: Christoph Lameter <cl@linux-foundation.org>
Signed-off-by: Tejun Heo <tj@kernel.org>
include/linux/mm.h
include/linux/mmzone.h
mm/page_alloc.c
mm/vmstat.c