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 .flags = SD_LOAD_BALANCE \
94 | SD_BALANCE_NEWIDLE \
95 | SD_BALANCE_FORK \
96 | SD_BALANCE_EXEC \
97 | SD_WAKE_AFFINE \
98 | SD_WAKE_BALANCE \
99 | SD_SHARE_CPUPOWER, \
100 .last_balance = jiffies, \
101 .balance_interval = 1, \
102}
103#endif
104#endif
105
106#ifdef CONFIG_SCHED_MC
107
108#ifndef SD_MC_INIT
109#define SD_MC_INIT (struct sched_domain) { \
110 .min_interval = 1, \
111 .max_interval = 4, \
112 .busy_factor = 64, \
113 .imbalance_pct = 125, \
114 .cache_nice_tries = 1, \
115 .busy_idx = 2, \
116 .wake_idx = 1, \
117 .forkexec_idx = 1, \
118 .flags = SD_LOAD_BALANCE \
119 | SD_BALANCE_FORK \
120 | SD_BALANCE_EXEC \
121 | SD_WAKE_AFFINE \
122 | SD_WAKE_BALANCE \
123 | SD_SHARE_PKG_RESOURCES\
124 | sd_balance_for_mc_power()\
125 | sd_power_saving_flags(),\
126 .last_balance = jiffies, \
127 .balance_interval = 1, \
128}
129#endif
130#endif
131
132
133#ifndef SD_CPU_INIT
134#define SD_CPU_INIT (struct sched_domain) { \
135 .min_interval = 1, \
136 .max_interval = 4, \
137 .busy_factor = 64, \
138 .imbalance_pct = 125, \
139 .cache_nice_tries = 1, \
140 .busy_idx = 2, \
141 .idle_idx = 1, \
142 .newidle_idx = 2, \
143 .wake_idx = 1, \
144 .forkexec_idx = 1, \
145 .flags = SD_LOAD_BALANCE \
146 | SD_BALANCE_EXEC \
147 | SD_BALANCE_FORK \
148 | SD_WAKE_AFFINE \
149 | SD_WAKE_BALANCE \
150 | sd_balance_for_package_power()\
151 | sd_power_saving_flags(),\
152 .last_balance = jiffies, \
153 .balance_interval = 1, \
154}
155#endif
156
157
158#define SD_ALLNODES_INIT (struct sched_domain) { \
159 .min_interval = 64, \
160 .max_interval = 64*num_online_cpus(), \
161 .busy_factor = 128, \
162 .imbalance_pct = 133, \
163 .cache_nice_tries = 1, \
164 .busy_idx = 3, \
165 .idle_idx = 3, \
166 .flags = SD_LOAD_BALANCE \
167 | SD_BALANCE_NEWIDLE \
168 | SD_WAKE_AFFINE \
169 | SD_SERIALIZE, \
170 .last_balance = jiffies, \
171 .balance_interval = 64, \
172}
173
174#ifdef CONFIG_NUMA
175#ifndef SD_NODE_INIT
176#error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!!
177#endif
178#endif
179
180#ifndef topology_physical_package_id
181#define topology_physical_package_id(cpu) ((void)(cpu), -1)
182#endif
183#ifndef topology_core_id
184#define topology_core_id(cpu) ((void)(cpu), 0)
185#endif
186#ifndef topology_thread_siblings
187#define topology_thread_siblings(cpu) cpumask_of_cpu(cpu)
188#endif
189#ifndef topology_core_siblings
190#define topology_core_siblings(cpu) cpumask_of_cpu(cpu)
191#endif
192#ifndef topology_thread_cpumask
193#define topology_thread_cpumask(cpu) cpumask_of(cpu)
194#endif
195#ifndef topology_core_cpumask
196#define topology_core_cpumask(cpu) cpumask_of(cpu)
197#endif
198
199
200#ifndef numa_node_id
201#define numa_node_id() (cpu_to_node(raw_smp_processor_id()))
202#endif
203
204#endif
205