diff options
author | Tejun Heo <tj@kernel.org> | 2009-01-13 06:41:35 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-16 08:19:58 -0500 |
commit | 9939ddaff52787b2a7c1adf1b2afc95421aa0884 (patch) | |
tree | 6e7266d065914e19c3c3f4b4e475f09b9669fa51 /arch/x86/mach-voyager | |
parent | 1a51e3a0aed18767cf2762e95456ecfeb0bca5e6 (diff) |
x86: merge 64 and 32 SMP percpu handling
Now that pda is allocated as part of percpu, percpu doesn't need to be
accessed through pda. Unify x86_64 SMP percpu access with x86_32 SMP
one. Other than the segment register, operand size and the base of
percpu symbols, they behave identical now.
This patch replaces now unnecessary pda->data_offset with a dummy
field which is necessary to keep stack_canary at its place. This
patch also moves per_cpu_offset initialization out of init_gdt() into
setup_per_cpu_areas(). Note that this change also necessitates
explicit per_cpu_offset initializations in voyager_smp.c.
With this change, x86_OP_percpu()'s are as efficient on x86_64 as on
x86_32 and also x86_64 can use assembly PER_CPU macros.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/mach-voyager')
-rw-r--r-- | arch/x86/mach-voyager/voyager_smp.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/x86/mach-voyager/voyager_smp.c b/arch/x86/mach-voyager/voyager_smp.c index 9840b7ec749a..1a48368acb09 100644 --- a/arch/x86/mach-voyager/voyager_smp.c +++ b/arch/x86/mach-voyager/voyager_smp.c | |||
@@ -531,6 +531,7 @@ static void __init do_boot_cpu(__u8 cpu) | |||
531 | stack_start.sp = (void *)idle->thread.sp; | 531 | stack_start.sp = (void *)idle->thread.sp; |
532 | 532 | ||
533 | init_gdt(cpu); | 533 | init_gdt(cpu); |
534 | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; | ||
534 | per_cpu(current_task, cpu) = idle; | 535 | per_cpu(current_task, cpu) = idle; |
535 | early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu); | 536 | early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu); |
536 | irq_ctx_init(cpu); | 537 | irq_ctx_init(cpu); |
@@ -1748,6 +1749,7 @@ static void __init voyager_smp_prepare_cpus(unsigned int max_cpus) | |||
1748 | static void __cpuinit voyager_smp_prepare_boot_cpu(void) | 1749 | static void __cpuinit voyager_smp_prepare_boot_cpu(void) |
1749 | { | 1750 | { |
1750 | init_gdt(smp_processor_id()); | 1751 | init_gdt(smp_processor_id()); |
1752 | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; | ||
1751 | switch_to_new_gdt(); | 1753 | switch_to_new_gdt(); |
1752 | 1754 | ||
1753 | cpu_set(smp_processor_id(), cpu_online_map); | 1755 | cpu_set(smp_processor_id(), cpu_online_map); |