]>
Commit | Line | Data |
---|---|---|
82094b55 AF |
1 | From: Andreas Herrmann <andreas.herrmann3@amd.com> |
2 | Subject: x86, sched: Workaround broken sched domain creation for AMD Magny-Cours | |
3 | References: fate#307306 | |
4 | Patch-Mainline: yes | |
5 | Commit-ID: 5a925b4282d7f805deafde62001a83dbaf8be275 | |
6 | ||
7 | Signed-off-by: Thomas Renninger <trenn@suse.de> | |
8 | ||
9 | Current sched domain creation code can't handle multi-node processors. | |
10 | When switching to power_savings scheduling errors show up and | |
11 | system might hang later on (due to broken sched domain hierarchy): | |
12 | ||
13 | # echo 0 >> /sys/devices/system/cpu/sched_mc_power_savings | |
14 | CPU0 attaching sched-domain: | |
15 | domain 0: span 0-5 level MC | |
16 | groups: 0 1 2 3 4 5 | |
17 | domain 1: span 0-23 level NODE | |
18 | groups: 0-5 6-11 18-23 12-17 | |
19 | ... | |
20 | # echo 1 >> /sys/devices/system/cpu/sched_mc_power_savings | |
21 | CPU0 attaching sched-domain: | |
22 | domain 0: span 0-11 level MC | |
23 | groups: 0 1 2 3 4 5 6 7 8 9 10 11 | |
24 | ERROR: parent span is not a superset of domain->span | |
25 | domain 1: span 0-5 level CPU | |
26 | ERROR: domain->groups does not contain CPU0 | |
27 | groups: 6-11 (__cpu_power = 12288) | |
28 | ERROR: groups don't span domain->span | |
29 | domain 2: span 0-23 level NODE | |
30 | groups: | |
31 | ERROR: domain->cpu_power not set | |
32 | ||
33 | ERROR: groups don't span domain->span | |
34 | ... | |
35 | ||
36 | Fixing all aspects of power-savings scheduling for Magny-Cours needs | |
37 | some larger changes in the sched domain creation code. | |
38 | ||
39 | As a short-term and temporary workaround avoid the problems by | |
40 | extending "the worst possible hack" ;-( | |
41 | and always use llc_shared_map on AMD Magny-Cours when MC domain span | |
42 | is calculated. | |
43 | ||
44 | With this I get: | |
45 | ||
46 | # echo 1 >> /sys/devices/system/cpu/sched_mc_power_savings | |
47 | CPU0 attaching sched-domain: | |
48 | domain 0: span 0-5 level MC | |
49 | groups: 0 1 2 3 4 5 | |
50 | domain 1: span 0-5 level CPU | |
51 | groups: 0-5 (__cpu_power = 6144) | |
52 | domain 2: span 0-23 level NODE | |
53 | groups: 0-5 (__cpu_power = 6144) 6-11 (__cpu_power = 6144) 18-23 (__cpu_power = 6144) 12-17 (__cpu_power = 6144) | |
54 | ... | |
55 | ||
56 | I.e. no errors during sched domain creation, no system hangs, and also | |
57 | mc_power_savings scheduling works to a certain extend. | |
58 | ||
59 | Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> | |
60 | Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com> | |
61 | Signed-off-by: H. Peter Anvin <hpa@zytor.com> | |
62 | ||
63 | --- | |
64 | arch/x86/kernel/smpboot.c | 3 ++- | |
65 | 1 file changed, 2 insertions(+), 1 deletion(-) | |
66 | ||
67 | Index: linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/smpboot.c | |
68 | =================================================================== | |
69 | --- linux-2.6.27-SLE11_BRANCH.orig/arch/x86/kernel/smpboot.c | |
70 | +++ linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/smpboot.c | |
71 | @@ -502,7 +502,8 @@ cpumask_t cpu_coregroup_map(int cpu) | |
72 | * For perf, we return last level cache shared map. | |
73 | * And for power savings, we return cpu_core_map | |
74 | */ | |
75 | - if (sched_mc_power_savings || sched_smt_power_savings) | |
76 | + if ((sched_mc_power_savings || sched_smt_power_savings) && | |
77 | + !(cpu_has(c, X86_FEATURE_AMD_DCM))) | |
78 | return per_cpu(cpu_core_map, cpu); | |
79 | else | |
80 | return c->llc_shared_map; |