All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sched/x86: construct all sibling maps if smt
@ 2013-05-27 17:09 Andrew Jones
  2013-05-29 10:26 ` Andrew Jones
  2013-05-29 12:48 ` [PATCH v2] " Andrew Jones
  0 siblings, 2 replies; 6+ messages in thread
From: Andrew Jones @ 2013-05-27 17:09 UTC (permalink / raw)
  To: tglx, mingo, hpa, x86, a.p.zijlstra, fenghua.yu; +Cc: linux-kernel

Commit 316ad248307fb ("sched/x86: Rewrite set_cpu_sibling_map()") broke
the construction of sibling maps, which also broke the booted_cores
accounting.

Before the rewrite, if smt was present, then each map was updated for
each smt sibling. After the rewrite only cpu_sibling_mask gets updated,
as the llc and core maps depend on 'has_mc = x86_max_cores > 1' instead.
This leads to problems with topologies like the following

(qemu -smp sockets=2,cores=1,threads=2)

processor	: 0
physical id	: 0
siblings	: 1    <= should be 2
core id		: 0
cpu cores	: 1

processor	: 1
physical id	: 0
siblings	: 1    <= should be 2
core id		: 0
cpu cores	: 0    <= should be 1

processor	: 2
physical id	: 1
siblings	: 1    <= should be 2
core id		: 0
cpu cores	: 1

processor	: 3
physical id	: 1
siblings	: 1    <= should be 2
core id		: 0
cpu cores	: 0    <= should be 1

This patch restores the former construction by defining has_mc as
(has_smt || x86_max_cores > 1). This should be fine as there were no
(has_smt && !has_mc) conditions in the context.

Signed-off-by: Andrew Jones <drjones@redhat.com>
---
 arch/x86/kernel/smpboot.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 9c73b51817e47..886a3234eaff3 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -372,15 +372,15 @@ static bool __cpuinit match_mc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)
 
 void __cpuinit set_cpu_sibling_map(int cpu)
 {
-	bool has_mc = boot_cpu_data.x86_max_cores > 1;
 	bool has_smt = smp_num_siblings > 1;
+	bool has_mc = has_smt || boot_cpu_data.x86_max_cores > 1;
 	struct cpuinfo_x86 *c = &cpu_data(cpu);
 	struct cpuinfo_x86 *o;
 	int i;
 
 	cpumask_set_cpu(cpu, cpu_sibling_setup_mask);
 
-	if (!has_smt && !has_mc) {
+	if (!has_mc) {
 		cpumask_set_cpu(cpu, cpu_sibling_mask(cpu));
 		cpumask_set_cpu(cpu, cpu_llc_shared_mask(cpu));
 		cpumask_set_cpu(cpu, cpu_core_mask(cpu));
-- 
1.8.1.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-05-31 12:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-27 17:09 [PATCH] sched/x86: construct all sibling maps if smt Andrew Jones
2013-05-29 10:26 ` Andrew Jones
2013-05-29 11:06   ` Peter Zijlstra
2013-05-29 11:11     ` Ingo Molnar
2013-05-29 12:48 ` [PATCH v2] " Andrew Jones
2013-05-31 12:50   ` [tip:sched/urgent] sched/x86: Construct " tip-bot for Andrew Jones

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.