diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-01-27 06:03:24 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-27 06:03:24 -0500 |
commit | 4369f1fb7cd4cf777312f43e1cb9aa5504fc4125 (patch) | |
tree | a5525d63fe682e6744c109fb72f7e1b33855cb00 /arch/x86/kernel/cpu | |
parent | 3ddeb51d9c83931c1ca6abf76a38934c5a1ed918 (diff) | |
parent | cf3997f507624757f149fcc42b76fb03c151fb65 (diff) |
Merge branch 'tj-percpu' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into core/percpu
Conflicts:
arch/x86/kernel/setup_percpu.c
Semantic conflict:
arch/x86/kernel/cpu/common.c
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/cpu')
-rw-r--r-- | arch/x86/kernel/cpu/common.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 99904f288d6a..652fdc9a757a 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -52,6 +52,15 @@ cpumask_var_t cpu_initialized_mask; | |||
52 | /* representing cpus for which sibling maps can be computed */ | 52 | /* representing cpus for which sibling maps can be computed */ |
53 | cpumask_var_t cpu_sibling_setup_mask; | 53 | cpumask_var_t cpu_sibling_setup_mask; |
54 | 54 | ||
55 | /* correctly size the local cpu masks */ | ||
56 | void __init setup_cpu_local_masks(void) | ||
57 | { | ||
58 | alloc_bootmem_cpumask_var(&cpu_initialized_mask); | ||
59 | alloc_bootmem_cpumask_var(&cpu_callin_mask); | ||
60 | alloc_bootmem_cpumask_var(&cpu_callout_mask); | ||
61 | alloc_bootmem_cpumask_var(&cpu_sibling_setup_mask); | ||
62 | } | ||
63 | |||
55 | #else /* CONFIG_X86_32 */ | 64 | #else /* CONFIG_X86_32 */ |
56 | 65 | ||
57 | cpumask_t cpu_callin_map; | 66 | cpumask_t cpu_callin_map; |
@@ -249,12 +258,17 @@ __u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata; | |||
249 | void switch_to_new_gdt(void) | 258 | void switch_to_new_gdt(void) |
250 | { | 259 | { |
251 | struct desc_ptr gdt_descr; | 260 | struct desc_ptr gdt_descr; |
261 | int cpu = smp_processor_id(); | ||
252 | 262 | ||
253 | gdt_descr.address = (long)get_cpu_gdt_table(smp_processor_id()); | 263 | gdt_descr.address = (long)get_cpu_gdt_table(cpu); |
254 | gdt_descr.size = GDT_SIZE - 1; | 264 | gdt_descr.size = GDT_SIZE - 1; |
255 | load_gdt(&gdt_descr); | 265 | load_gdt(&gdt_descr); |
266 | /* Reload the per-cpu base */ | ||
256 | #ifdef CONFIG_X86_32 | 267 | #ifdef CONFIG_X86_32 |
257 | asm("mov %0, %%fs" : : "r" (__KERNEL_PERCPU) : "memory"); | 268 | loadsegment(fs, __KERNEL_PERCPU); |
269 | #else | ||
270 | loadsegment(gs, 0); | ||
271 | wrmsrl(MSR_GS_BASE, (unsigned long)per_cpu(irq_stack_union.gs_base, cpu)); | ||
258 | #endif | 272 | #endif |
259 | } | 273 | } |
260 | 274 | ||
@@ -959,10 +973,6 @@ void __cpuinit cpu_init(void) | |||
959 | struct task_struct *me; | 973 | struct task_struct *me; |
960 | int i; | 974 | int i; |
961 | 975 | ||
962 | loadsegment(fs, 0); | ||
963 | loadsegment(gs, 0); | ||
964 | load_gs_base(cpu); | ||
965 | |||
966 | #ifdef CONFIG_NUMA | 976 | #ifdef CONFIG_NUMA |
967 | if (cpu != 0 && percpu_read(node_number) == 0 && | 977 | if (cpu != 0 && percpu_read(node_number) == 0 && |
968 | cpu_to_node(cpu) != NUMA_NO_NODE) | 978 | cpu_to_node(cpu) != NUMA_NO_NODE) |
@@ -984,6 +994,8 @@ void __cpuinit cpu_init(void) | |||
984 | */ | 994 | */ |
985 | 995 | ||
986 | switch_to_new_gdt(); | 996 | switch_to_new_gdt(); |
997 | loadsegment(fs, 0); | ||
998 | |||
987 | load_idt((const struct desc_ptr *)&idt_descr); | 999 | load_idt((const struct desc_ptr *)&idt_descr); |
988 | 1000 | ||
989 | memset(me->thread.tls_array, 0, GDT_ENTRY_TLS_ENTRIES * 8); | 1001 | memset(me->thread.tls_array, 0, GDT_ENTRY_TLS_ENTRIES * 8); |