提交 cb0cd8d4 编写于 作者: A Ashok Raj 提交者: Linus Torvalds

[PATCH] x86_64: CPU hotplug sibling map cleanup

This patch is a minor cleanup to the cpu sibling/core map.  It is required
that this setup happens on a per-cpu bringup time.
Signed-off-by: NAshok Raj <ashok.raj@intel.com>
Acked-by: NAndi Kleen <ak@muc.de>
Acked-by: NZwane Mwaikambo <zwane@arm.linux.org.uk>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 76e4f660
...@@ -445,6 +445,33 @@ void __cpuinit smp_callin(void) ...@@ -445,6 +445,33 @@ void __cpuinit smp_callin(void)
cpu_set(cpuid, cpu_callin_map); 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) * Setup code on secondary processor (after comming out of the trampoline)
*/ */
...@@ -474,6 +501,12 @@ void __cpuinit start_secondary(void) ...@@ -474,6 +501,12 @@ void __cpuinit start_secondary(void)
enable_APIC_timer(); 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. * Allow the master to continue.
*/ */
...@@ -816,51 +849,6 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid) ...@@ -816,51 +849,6 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid)
cycles_t cacheflush_time; cycles_t cacheflush_time;
unsigned long cache_decay_ticks; 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... * Cleanup possible dangling ends...
*/ */
...@@ -1048,6 +1036,8 @@ void __init smp_prepare_boot_cpu(void) ...@@ -1048,6 +1036,8 @@ void __init smp_prepare_boot_cpu(void)
int me = smp_processor_id(); int me = smp_processor_id();
cpu_set(me, cpu_online_map); cpu_set(me, cpu_online_map);
cpu_set(me, cpu_callout_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) ...@@ -1107,7 +1097,6 @@ void __init smp_cpus_done(unsigned int max_cpus)
setup_ioapic_dest(); setup_ioapic_dest();
#endif #endif
detect_siblings();
time_init_gtod(); time_init_gtod();
check_nmi_watchdog(); check_nmi_watchdog();
...@@ -1115,8 +1104,7 @@ void __init smp_cpus_done(unsigned int max_cpus) ...@@ -1115,8 +1104,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
static void static void remove_siblinginfo(int cpu)
remove_siblinginfo(int cpu)
{ {
int sibling; int sibling;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册