From: Eric Dumazet percpu_data blindly allocates bootmem memory to store NR_CPUS instances of cpudata, instead of allocating memory only for possible cpus. This patch saves ram, allocating num_possible_cpus() (instead of NR_CPUS) instances. Signed-off-by: Eric Dumazet Cc: "David S. Miller" Cc: James Bottomley Cc: Jens Axboe Acked-by: Ingo Molnar Cc: Jens Axboe Cc: Anton Blanchard Signed-off-by: Andrew Morton --- init/main.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff -puN init/main.c~only-allocate-percpu-data-for-possible-cpus init/main.c --- devel/init/main.c~only-allocate-percpu-data-for-possible-cpus 2006-02-03 01:00:25.000000000 -0800 +++ devel-akpm/init/main.c 2006-02-03 01:00:25.000000000 -0800 @@ -333,6 +333,7 @@ static void __init setup_per_cpu_areas(v { unsigned long size, i; char *ptr; + unsigned long nr_possible_cpus = num_possible_cpus(); /* Copy section for each CPU (we discard the original) */ size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES); @@ -340,12 +341,16 @@ static void __init setup_per_cpu_areas(v if (size < PERCPU_ENOUGH_ROOM) size = PERCPU_ENOUGH_ROOM; #endif + ptr = alloc_bootmem(size * nr_possible_cpus); - ptr = alloc_bootmem(size * NR_CPUS); - - for (i = 0; i < NR_CPUS; i++, ptr += size) { + for (i = 0; i < NR_CPUS; i++) { + if (!cpu_possible(i)) { + __per_cpu_offset[i] = (char*)0 - __per_cpu_start; + continue; + } __per_cpu_offset[i] = ptr - __per_cpu_start; memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); + ptr += size; } } #endif /* !__GENERIC_PER_CPU */ _