X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=init%2Fmain.c;h=e81cf427d9c7a43d42b93ca2a8aed3a1ab64f089;hb=e7f5ed8d6e921c6200ce5e2549a86db629f2dd11;hp=3820323c4c8467c07831a8844532fb85976e9a9f;hpb=2be4ff2f084842839b041b793ed6237e8d1d315a;p=deliverable%2Flinux.git diff --git a/init/main.c b/init/main.c index 3820323c4c84..e81cf427d9c7 100644 --- a/init/main.c +++ b/init/main.c @@ -391,17 +391,23 @@ EXPORT_SYMBOL(__per_cpu_offset); static void __init setup_per_cpu_areas(void) { - unsigned long size, i; + unsigned long size, i, old_size; char *ptr; unsigned long nr_possible_cpus = num_possible_cpus(); + unsigned long align = 1; + unsigned da_size; /* Copy section for each CPU (we discard the original) */ - size = ALIGN(PERCPU_ENOUGH_ROOM, PAGE_SIZE); + old_size = PERCPU_ENOUGH_ROOM; + da_size = per_cpu_dyn_array_size(&align); + align = max_t(unsigned long, PAGE_SIZE, align); + size = ALIGN(old_size + da_size, align); ptr = alloc_bootmem_pages(size * nr_possible_cpus); for_each_possible_cpu(i) { __per_cpu_offset[i] = ptr - __per_cpu_start; memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); + per_cpu_alloc_dyn_array(i, ptr + old_size); ptr += size; } } @@ -567,6 +573,7 @@ asmlinkage void __init start_kernel(void) printk(KERN_NOTICE); printk(linux_banner); setup_arch(&command_line); + pre_alloc_dyn_array(); mm_init_owner(&init_mm, &init_task); setup_command_line(command_line); unwind_setup(); @@ -708,7 +715,7 @@ int do_one_initcall(initcall_t fn) int result; if (initcall_debug) { - printk("calling %pF\n", fn); + printk("calling %pF @ %i\n", fn, task_pid_nr(current)); t0 = ktime_get(); }