projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ftrace: use dynamic patching for updating mcount calls
[deliverable/linux.git]
/
arch
/
x86
/
kernel
/
smpboot.c
diff --git
a/arch/x86/kernel/smpboot.c
b/arch/x86/kernel/smpboot.c
index 04c662ba18f1dbf217326a9ffe2ade458617ee61..38988491c6222e99c6bb7772eb09ee0cc81fb270 100644
(file)
--- a/
arch/x86/kernel/smpboot.c
+++ b/
arch/x86/kernel/smpboot.c
@@
-86,6
+86,7
@@
void *x86_bios_cpu_apicid_early_ptr;
#ifdef CONFIG_X86_32
u8 apicid_2_node[MAX_APICID];
#ifdef CONFIG_X86_32
u8 apicid_2_node[MAX_APICID];
+static int low_mappings;
#endif
/* State of each CPU */
#endif
/* State of each CPU */
@@
-299,7
+300,7
@@
static void __cpuinit smp_callin(void)
/*
* Activate a secondary processor.
*/
/*
* Activate a secondary processor.
*/
-void __cpuinit start_secondary(void *unused)
+
static
void __cpuinit start_secondary(void *unused)
{
/*
* Don't put *anything* before cpu_init(), SMP booting is too
{
/*
* Don't put *anything* before cpu_init(), SMP booting is too
@@
-326,6
+327,12
@@
void __cpuinit start_secondary(void *unused)
enable_8259A_irq(0);
}
enable_8259A_irq(0);
}
+#ifdef CONFIG_X86_32
+ while (low_mappings)
+ cpu_relax();
+ __flush_tlb_all();
+#endif
+
/* This must be done before setting cpu_online_map */
set_cpu_sibling_map(raw_smp_processor_id());
wmb();
/* This must be done before setting cpu_online_map */
set_cpu_sibling_map(raw_smp_processor_id());
wmb();
@@
-1040,14
+1047,20
@@
int __cpuinit native_cpu_up(unsigned int cpu)
#ifdef CONFIG_X86_32
/* init low mem mapping */
clone_pgd_range(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY,
#ifdef CONFIG_X86_32
/* init low mem mapping */
clone_pgd_range(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY,
-
min_t(unsigned long, KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY));
+ min_t(unsigned long, KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY));
flush_tlb_all();
flush_tlb_all();
-#endif
+ low_mappings = 1;
+
+ err = do_boot_cpu(apicid, cpu);
+ zap_low_mappings();
+ low_mappings = 0;
+#else
err = do_boot_cpu(apicid, cpu);
err = do_boot_cpu(apicid, cpu);
- if (err < 0) {
+#endif
+ if (err) {
Dprintk("do_boot_cpu failed %d\n", err);
Dprintk("do_boot_cpu failed %d\n", err);
- return
err
;
+ return
-EIO
;
}
/*
}
/*
@@
-1149,14
+1162,10
@@
static int __init smp_sanity_check(unsigned max_cpus)
"forcing use of dummy APIC emulation.\n");
smpboot_clear_io_apic();
#ifdef CONFIG_X86_32
"forcing use of dummy APIC emulation.\n");
smpboot_clear_io_apic();
#ifdef CONFIG_X86_32
- if (nmi_watchdog == NMI_LOCAL_APIC) {
- printk(KERN_INFO "activating minimal APIC for"
- "NMI watchdog use.\n");
- connect_bsp_APIC();
- setup_local_APIC();
- end_local_APIC_setup();
- }
+ connect_bsp_APIC();
#endif
#endif
+ setup_local_APIC();
+ end_local_APIC_setup();
return -1;
}
return -1;
}
@@
-1263,9
+1272,6
@@
void __init native_smp_cpus_done(unsigned int max_cpus)
setup_ioapic_dest();
#endif
check_nmi_watchdog();
setup_ioapic_dest();
#endif
check_nmi_watchdog();
-#ifdef CONFIG_X86_32
- zap_low_mappings();
-#endif
}
#ifdef CONFIG_HOTPLUG_CPU
}
#ifdef CONFIG_HOTPLUG_CPU
@@
-1310,7
+1316,7
@@
static void remove_siblinginfo(int cpu)
cpu_clear(cpu, cpu_sibling_setup_map);
}
cpu_clear(cpu, cpu_sibling_setup_map);
}
-int additional_cpus __initdata = -1;
+
static
int additional_cpus __initdata = -1;
static __init int setup_additional_cpus(char *s)
{
static __init int setup_additional_cpus(char *s)
{
This page took
0.025628 seconds
and
5
git commands to generate.