diff options
-rw-r--r-- | init/main.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/init/main.c b/init/main.c index 141e8896d252..9cf6b307bfd7 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -333,6 +333,7 @@ static void __init setup_per_cpu_areas(void) | |||
333 | { | 333 | { |
334 | unsigned long size, i; | 334 | unsigned long size, i; |
335 | char *ptr; | 335 | char *ptr; |
336 | unsigned long nr_possible_cpus = num_possible_cpus(); | ||
336 | 337 | ||
337 | /* Copy section for each CPU (we discard the original) */ | 338 | /* Copy section for each CPU (we discard the original) */ |
338 | size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES); | 339 | size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES); |
@@ -340,12 +341,16 @@ static void __init setup_per_cpu_areas(void) | |||
340 | if (size < PERCPU_ENOUGH_ROOM) | 341 | if (size < PERCPU_ENOUGH_ROOM) |
341 | size = PERCPU_ENOUGH_ROOM; | 342 | size = PERCPU_ENOUGH_ROOM; |
342 | #endif | 343 | #endif |
344 | ptr = alloc_bootmem(size * nr_possible_cpus); | ||
343 | 345 | ||
344 | ptr = alloc_bootmem(size * NR_CPUS); | 346 | for (i = 0; i < NR_CPUS; i++) { |
345 | 347 | if (!cpu_possible(i)) { | |
346 | for (i = 0; i < NR_CPUS; i++, ptr += size) { | 348 | __per_cpu_offset[i] = (char*)0 - __per_cpu_start; |
349 | continue; | ||
350 | } | ||
347 | __per_cpu_offset[i] = ptr - __per_cpu_start; | 351 | __per_cpu_offset[i] = ptr - __per_cpu_start; |
348 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); | 352 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); |
353 | ptr += size; | ||
349 | } | 354 | } |
350 | } | 355 | } |
351 | #endif /* !__GENERIC_PER_CPU */ | 356 | #endif /* !__GENERIC_PER_CPU */ |