|
@@ -445,6 +445,33 @@ void __cpuinit smp_callin(void)
|
|
|
cpu_set(cpuid, cpu_callin_map);
|
|
|
}
|
|
|
|
|
|
+static inline void set_cpu_sibling_map(int cpu)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (smp_num_siblings > 1) {
|
|
|
+ for_each_cpu(i) {
|
|
|
+ if (cpu_core_id[cpu] == cpu_core_id[i]) {
|
|
|
+ cpu_set(i, cpu_sibling_map[cpu]);
|
|
|
+ cpu_set(cpu, cpu_sibling_map[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ cpu_set(cpu, cpu_sibling_map[cpu]);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (current_cpu_data.x86_num_cores > 1) {
|
|
|
+ for_each_cpu(i) {
|
|
|
+ if (phys_proc_id[cpu] == phys_proc_id[i]) {
|
|
|
+ cpu_set(i, cpu_core_map[cpu]);
|
|
|
+ cpu_set(cpu, cpu_core_map[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ cpu_core_map[cpu] = cpu_sibling_map[cpu];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Setup code on secondary processor (after comming out of the trampoline)
|
|
|
*/
|
|
@@ -474,6 +501,12 @@ void __cpuinit start_secondary(void)
|
|
|
|
|
|
enable_APIC_timer();
|
|
|
|
|
|
+ /*
|
|
|
+ * The sibling maps must be set before turing the online map on for
|
|
|
+ * this cpu
|
|
|
+ */
|
|
|
+ set_cpu_sibling_map(smp_processor_id());
|
|
|
+
|
|
|
/*
|
|
|
* Allow the master to continue.
|
|
|
*/
|
|
@@ -816,51 +849,6 @@ do_rest:
|
|
|
cycles_t cacheflush_time;
|
|
|
unsigned long cache_decay_ticks;
|
|
|
|
|
|
-/*
|
|
|
- * Construct cpu_sibling_map[], so that we can tell the sibling CPU
|
|
|
- * on SMT systems efficiently.
|
|
|
- */
|
|
|
-static __cpuinit void detect_siblings(void)
|
|
|
-{
|
|
|
- int cpu;
|
|
|
-
|
|
|
- for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
|
|
- cpus_clear(cpu_sibling_map[cpu]);
|
|
|
- cpus_clear(cpu_core_map[cpu]);
|
|
|
- }
|
|
|
-
|
|
|
- for_each_online_cpu (cpu) {
|
|
|
- struct cpuinfo_x86 *c = cpu_data + cpu;
|
|
|
- int siblings = 0;
|
|
|
- int i;
|
|
|
- if (smp_num_siblings > 1) {
|
|
|
- for_each_online_cpu (i) {
|
|
|
- if (cpu_core_id[cpu] == cpu_core_id[i]) {
|
|
|
- siblings++;
|
|
|
- cpu_set(i, cpu_sibling_map[cpu]);
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- siblings++;
|
|
|
- cpu_set(cpu, cpu_sibling_map[cpu]);
|
|
|
- }
|
|
|
-
|
|
|
- if (siblings != smp_num_siblings) {
|
|
|
- printk(KERN_WARNING
|
|
|
- "WARNING: %d siblings found for CPU%d, should be %d\n",
|
|
|
- siblings, cpu, smp_num_siblings);
|
|
|
- smp_num_siblings = siblings;
|
|
|
- }
|
|
|
- if (c->x86_num_cores > 1) {
|
|
|
- for_each_online_cpu(i) {
|
|
|
- if (phys_proc_id[cpu] == phys_proc_id[i])
|
|
|
- cpu_set(i, cpu_core_map[cpu]);
|
|
|
- }
|
|
|
- } else
|
|
|
- cpu_core_map[cpu] = cpu_sibling_map[cpu];
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Cleanup possible dangling ends...
|
|
|
*/
|
|
@@ -1048,6 +1036,8 @@ void __init smp_prepare_boot_cpu(void)
|
|
|
int me = smp_processor_id();
|
|
|
cpu_set(me, cpu_online_map);
|
|
|
cpu_set(me, cpu_callout_map);
|
|
|
+ cpu_set(0, cpu_sibling_map[0]);
|
|
|
+ cpu_set(0, cpu_core_map[0]);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1107,7 +1097,6 @@ void __init smp_cpus_done(unsigned int max_cpus)
|
|
|
setup_ioapic_dest();
|
|
|
#endif
|
|
|
|
|
|
- detect_siblings();
|
|
|
time_init_gtod();
|
|
|
|
|
|
check_nmi_watchdog();
|
|
@@ -1115,8 +1104,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
|
|
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
|
|
|
|
-static void
|
|
|
-remove_siblinginfo(int cpu)
|
|
|
+static void remove_siblinginfo(int cpu)
|
|
|
{
|
|
|
int sibling;
|
|
|
|