1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifndef _LINUX_TOPOLOGY_H
28#define _LINUX_TOPOLOGY_H
29
30#include <linux/cpumask.h>
31#include <linux/bitops.h>
32#include <linux/mmzone.h>
33#include <linux/smp.h>
34#include <asm/topology.h>
35
36#ifndef node_has_online_mem
37#define node_has_online_mem(nid) (1)
38#endif
39
40#ifndef nr_cpus_node
41#define nr_cpus_node(node) cpumask_weight(cpumask_of_node(node))
42#endif
43
44#define for_each_node_with_cpus(node) \
45 for_each_online_node(node) \
46 if (nr_cpus_node(node))
47
48int arch_update_cpu_topology(void);
49
50
51#define LOCAL_DISTANCE 10
52#define REMOTE_DISTANCE 20
53#ifndef node_distance
54#define node_distance(from,to) ((from) == (to) ? LOCAL_DISTANCE : REMOTE_DISTANCE)
55#endif
56#ifndef RECLAIM_DISTANCE
57
58
59
60
61
62#define RECLAIM_DISTANCE 20
63#endif
64#ifndef PENALTY_FOR_NODE_WITH_CPUS
65#define PENALTY_FOR_NODE_WITH_CPUS (1)
66#endif
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81#ifdef CONFIG_SCHED_SMT
82
83
84
85#define ARCH_HAS_SCHED_WAKE_IDLE
86
87#ifndef SD_SIBLING_INIT
88#define SD_SIBLING_INIT (struct sched_domain) { \
89 .min_interval = 1, \
90 .max_interval = 2, \
91 .busy_factor = 64, \
92 .imbalance_pct = 110, \
93 \
94 .flags = 1*SD_LOAD_BALANCE \
95 | 1*SD_BALANCE_NEWIDLE \
96 | 1*SD_BALANCE_EXEC \
97 | 1*SD_BALANCE_FORK \
98 | 0*SD_BALANCE_WAKE \
99 | 1*SD_WAKE_AFFINE \
100 | 1*SD_SHARE_CPUPOWER \
101 | 0*SD_POWERSAVINGS_BALANCE \
102 | 0*SD_SHARE_PKG_RESOURCES \
103 | 0*SD_SERIALIZE \
104 | 0*SD_PREFER_SIBLING \
105 , \
106 .last_balance = jiffies, \
107 .balance_interval = 1, \
108 .smt_gain = 1178, \
109}
110#endif
111#endif
112
113#ifdef CONFIG_SCHED_MC
114
115#ifndef SD_MC_INIT
116#define SD_MC_INIT (struct sched_domain) { \
117 .min_interval = 1, \
118 .max_interval = 4, \
119 .busy_factor = 64, \
120 .imbalance_pct = 125, \
121 .cache_nice_tries = 1, \
122 .busy_idx = 2, \
123 .wake_idx = 0, \
124 .forkexec_idx = 0, \
125 \
126 .flags = 1*SD_LOAD_BALANCE \
127 | 1*SD_BALANCE_NEWIDLE \
128 | 1*SD_BALANCE_EXEC \
129 | 1*SD_BALANCE_FORK \
130 | 0*SD_BALANCE_WAKE \
131 | 1*SD_WAKE_AFFINE \
132 | 0*SD_PREFER_LOCAL \
133 | 0*SD_SHARE_CPUPOWER \
134 | 1*SD_SHARE_PKG_RESOURCES \
135 | 0*SD_SERIALIZE \
136 | sd_balance_for_mc_power() \
137 | sd_power_saving_flags() \
138 , \
139 .last_balance = jiffies, \
140 .balance_interval = 1, \
141}
142#endif
143#endif
144
145
146#ifndef SD_CPU_INIT
147#define SD_CPU_INIT (struct sched_domain) { \
148 .min_interval = 1, \
149 .max_interval = 4, \
150 .busy_factor = 64, \
151 .imbalance_pct = 125, \
152 .cache_nice_tries = 1, \
153 .busy_idx = 2, \
154 .idle_idx = 1, \
155 .newidle_idx = 0, \
156 .wake_idx = 0, \
157 .forkexec_idx = 0, \
158 \
159 .flags = 1*SD_LOAD_BALANCE \
160 | 1*SD_BALANCE_NEWIDLE \
161 | 1*SD_BALANCE_EXEC \
162 | 1*SD_BALANCE_FORK \
163 | 0*SD_BALANCE_WAKE \
164 | 1*SD_WAKE_AFFINE \
165 | 0*SD_PREFER_LOCAL \
166 | 0*SD_SHARE_CPUPOWER \
167 | 0*SD_SHARE_PKG_RESOURCES \
168 | 0*SD_SERIALIZE \
169 | sd_balance_for_package_power() \
170 | sd_power_saving_flags() \
171 , \
172 .last_balance = jiffies, \
173 .balance_interval = 1, \
174}
175#endif
176
177
178#define SD_ALLNODES_INIT (struct sched_domain) { \
179 .min_interval = 64, \
180 .max_interval = 64*num_online_cpus(), \
181 .busy_factor = 128, \
182 .imbalance_pct = 133, \
183 .cache_nice_tries = 1, \
184 .busy_idx = 3, \
185 .idle_idx = 3, \
186 .flags = 1*SD_LOAD_BALANCE \
187 | 1*SD_BALANCE_NEWIDLE \
188 | 0*SD_BALANCE_EXEC \
189 | 0*SD_BALANCE_FORK \
190 | 0*SD_BALANCE_WAKE \
191 | 0*SD_WAKE_AFFINE \
192 | 0*SD_SHARE_CPUPOWER \
193 | 0*SD_POWERSAVINGS_BALANCE \
194 | 0*SD_SHARE_PKG_RESOURCES \
195 | 1*SD_SERIALIZE \
196 | 0*SD_PREFER_SIBLING \
197 , \
198 .last_balance = jiffies, \
199 .balance_interval = 64, \
200}
201
202#ifdef CONFIG_NUMA
203#ifndef SD_NODE_INIT
204#error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!!
205#endif
206#endif
207
208#ifndef topology_physical_package_id
209#define topology_physical_package_id(cpu) ((void)(cpu), -1)
210#endif
211#ifndef topology_core_id
212#define topology_core_id(cpu) ((void)(cpu), 0)
213#endif
214#ifndef topology_thread_cpumask
215#define topology_thread_cpumask(cpu) cpumask_of(cpu)
216#endif
217#ifndef topology_core_cpumask
218#define topology_core_cpumask(cpu) cpumask_of(cpu)
219#endif
220
221
222#ifndef numa_node_id
223#define numa_node_id() (cpu_to_node(raw_smp_processor_id()))
224#endif
225
226#endif
227