Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb0cd8d4 authored by Ashok Raj's avatar Ashok Raj Committed by Linus Torvalds
Browse files

[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: default avatarAshok Raj <ashok.raj@intel.com>
Acked-by: default avatarAndi Kleen <ak@muc.de>
Acked-by: default avatarZwane Mwaikambo <zwane@arm.linux.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 76e4f660
Loading
Loading
Loading
Loading
+36 −48
Original line number Diff line number Diff line
@@ -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 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid)
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;