diff options
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
| -rw-r--r-- | arch/x86/kernel/smpboot.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index f56f96da77f5..7bd8a0823654 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -349,9 +349,12 @@ static bool __cpuinit match_llc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) | |||
| 349 | 349 | ||
| 350 | static bool __cpuinit match_mc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) | 350 | static bool __cpuinit match_mc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) |
| 351 | { | 351 | { |
| 352 | if (c->phys_proc_id == o->phys_proc_id) | 352 | if (c->phys_proc_id == o->phys_proc_id) { |
| 353 | return topology_sane(c, o, "mc"); | 353 | if (cpu_has(c, X86_FEATURE_AMD_DCM)) |
| 354 | return true; | ||
| 354 | 355 | ||
| 356 | return topology_sane(c, o, "mc"); | ||
| 357 | } | ||
| 355 | return false; | 358 | return false; |
| 356 | } | 359 | } |
| 357 | 360 | ||
| @@ -382,6 +385,15 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
| 382 | if ((i == cpu) || (has_mc && match_llc(c, o))) | 385 | if ((i == cpu) || (has_mc && match_llc(c, o))) |
| 383 | link_mask(llc_shared, cpu, i); | 386 | link_mask(llc_shared, cpu, i); |
| 384 | 387 | ||
| 388 | } | ||
| 389 | |||
| 390 | /* | ||
| 391 | * This needs a separate iteration over the cpus because we rely on all | ||
| 392 | * cpu_sibling_mask links to be set-up. | ||
| 393 | */ | ||
| 394 | for_each_cpu(i, cpu_sibling_setup_mask) { | ||
| 395 | o = &cpu_data(i); | ||
| 396 | |||
| 385 | if ((i == cpu) || (has_mc && match_mc(c, o))) { | 397 | if ((i == cpu) || (has_mc && match_mc(c, o))) { |
| 386 | link_mask(core, cpu, i); | 398 | link_mask(core, cpu, i); |
| 387 | 399 | ||
| @@ -410,15 +422,7 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
| 410 | /* maps the cpu to the sched domain representing multi-core */ | 422 | /* maps the cpu to the sched domain representing multi-core */ |
| 411 | const struct cpumask *cpu_coregroup_mask(int cpu) | 423 | const struct cpumask *cpu_coregroup_mask(int cpu) |
| 412 | { | 424 | { |
| 413 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 425 | return cpu_llc_shared_mask(cpu); |
| 414 | /* | ||
| 415 | * For perf, we return last level cache shared map. | ||
| 416 | * And for power savings, we return cpu_core_map | ||
| 417 | */ | ||
| 418 | if (!(cpu_has(c, X86_FEATURE_AMD_DCM))) | ||
| 419 | return cpu_core_mask(cpu); | ||
| 420 | else | ||
| 421 | return cpu_llc_shared_mask(cpu); | ||
| 422 | } | 426 | } |
| 423 | 427 | ||
| 424 | static void impress_friends(void) | 428 | static void impress_friends(void) |
