diff options
author | Andreas Herrmann <andreas.herrmann3@amd.com> | 2010-09-30 08:41:56 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2010-10-01 19:18:32 -0400 |
commit | d4fbe4f03557e1fd4d9bbb3a1957aad560f39e96 (patch) | |
tree | 5f827daeae5444dd48a2897dda4bafa9194613f7 /arch/x86/kernel/smpboot.c | |
parent | 6057b4d331f19a3ea51aec463ea7839c128b3227 (diff) |
x86, amd: Use compute unit information to determine thread siblings
This information is vital for different load balancing policies.
Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
LKML-Reference: <20100930124156.GF20545@loge.amd.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
-rw-r--r-- | arch/x86/kernel/smpboot.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 8b3bfc4dd708..bc2cc444844a 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -397,6 +397,19 @@ void __cpuinit smp_store_cpu_info(int id) | |||
397 | identify_secondary_cpu(c); | 397 | identify_secondary_cpu(c); |
398 | } | 398 | } |
399 | 399 | ||
400 | static void __cpuinit link_thread_siblings(int cpu1, int cpu2) | ||
401 | { | ||
402 | struct cpuinfo_x86 *c1 = &cpu_data(cpu1); | ||
403 | struct cpuinfo_x86 *c2 = &cpu_data(cpu2); | ||
404 | |||
405 | cpumask_set_cpu(cpu1, cpu_sibling_mask(cpu2)); | ||
406 | cpumask_set_cpu(cpu2, cpu_sibling_mask(cpu1)); | ||
407 | cpumask_set_cpu(cpu1, cpu_core_mask(cpu2)); | ||
408 | cpumask_set_cpu(cpu2, cpu_core_mask(cpu1)); | ||
409 | cpumask_set_cpu(cpu1, c2->llc_shared_map); | ||
410 | cpumask_set_cpu(cpu2, c1->llc_shared_map); | ||
411 | } | ||
412 | |||
400 | 413 | ||
401 | void __cpuinit set_cpu_sibling_map(int cpu) | 414 | void __cpuinit set_cpu_sibling_map(int cpu) |
402 | { | 415 | { |
@@ -409,14 +422,13 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
409 | for_each_cpu(i, cpu_sibling_setup_mask) { | 422 | for_each_cpu(i, cpu_sibling_setup_mask) { |
410 | struct cpuinfo_x86 *o = &cpu_data(i); | 423 | struct cpuinfo_x86 *o = &cpu_data(i); |
411 | 424 | ||
412 | if (c->phys_proc_id == o->phys_proc_id && | 425 | if (cpu_has(c, X86_FEATURE_TOPOEXT)) { |
413 | c->cpu_core_id == o->cpu_core_id) { | 426 | if (c->phys_proc_id == o->phys_proc_id && |
414 | cpumask_set_cpu(i, cpu_sibling_mask(cpu)); | 427 | c->compute_unit_id == o->compute_unit_id) |
415 | cpumask_set_cpu(cpu, cpu_sibling_mask(i)); | 428 | link_thread_siblings(cpu, i); |
416 | cpumask_set_cpu(i, cpu_core_mask(cpu)); | 429 | } else if (c->phys_proc_id == o->phys_proc_id && |
417 | cpumask_set_cpu(cpu, cpu_core_mask(i)); | 430 | c->cpu_core_id == o->cpu_core_id) { |
418 | cpumask_set_cpu(i, c->llc_shared_map); | 431 | link_thread_siblings(cpu, i); |
419 | cpumask_set_cpu(cpu, o->llc_shared_map); | ||
420 | } | 432 | } |
421 | } | 433 | } |
422 | } else { | 434 | } else { |