Blame view

include/linux/topology.h 8.36 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
  /*
   * include/linux/topology.h
   *
   * Written by: Matthew Dobson, IBM Corporation
   *
   * Copyright (C) 2002, IBM Corp.
   *
32525d022   Ingo Molnar   sched: whitespace...
8
   * All rights reserved.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
   * NON INFRINGEMENT.  See the GNU General Public License for more
   * details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   *
   * Send feedback to <colpatch@us.ibm.com>
   */
  #ifndef _LINUX_TOPOLOGY_H
  #define _LINUX_TOPOLOGY_H
  
  #include <linux/cpumask.h>
  #include <linux/bitops.h>
  #include <linux/mmzone.h>
  #include <linux/smp.h>
728120192   Lee Schermerhorn   numa: add generic...
34
  #include <linux/percpu.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
39
40
41
  #include <asm/topology.h>
  
  #ifndef node_has_online_mem
  #define node_has_online_mem(nid) (1)
  #endif
  
  #ifndef nr_cpus_node
a70f73028   Rusty Russell   cpumask: replace ...
42
  #define nr_cpus_node(node) cpumask_weight(cpumask_of_node(node))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
  #endif
7c16ec585   Mike Travis   cpumask: reduce s...
44
45
  #define for_each_node_with_cpus(node)			\
  	for_each_online_node(node)			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  		if (nr_cpus_node(node))
ee79d1bdb   Heiko Carstens   sched: let arch_u...
47
  int arch_update_cpu_topology(void);
22e52b072   Heiko Carstens   sched: add arch_u...
48

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
51
  /* Conform to ACPI 2.0 SLIT distance definitions */
  #define LOCAL_DISTANCE		10
  #define REMOTE_DISTANCE		20
f787a5030   Ingo Molnar   [PATCH] sched: sm...
52
  #ifndef node_distance
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
54
  #define node_distance(from,to)	((from) == (to) ? LOCAL_DISTANCE : REMOTE_DISTANCE)
  #endif
9eeff2395   Christoph Lameter   [PATCH] Zone recl...
55
56
57
58
59
60
61
62
  #ifndef RECLAIM_DISTANCE
  /*
   * If the distance between nodes in a system is larger than RECLAIM_DISTANCE
   * (in whatever arch specific measurement units returned by node_distance())
   * then switch on zone reclaim on boot.
   */
  #define RECLAIM_DISTANCE 20
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  #ifndef PENALTY_FOR_NODE_WITH_CPUS
  #define PENALTY_FOR_NODE_WITH_CPUS	(1)
  #endif
  
  /*
   * Below are the 3 major initializers used in building sched_domains:
   * SD_SIBLING_INIT, for SMT domains
   * SD_CPU_INIT, for SMP domains
   * SD_NODE_INIT, for NUMA domains
   *
   * Any architecture that cares to do any tuning to these values should do so
   * by defining their own arch-specific initializer in include/asm/topology.h.
   * A definition there will automagically override these default initializers
   * and allow arch-specific performance tuning of sched_domains.
7c16ec585   Mike Travis   cpumask: reduce s...
77
   * (Only non-zero and non-null fields need be specified.)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
   */
7c16ec585   Mike Travis   cpumask: reduce s...
79

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
83
84
85
86
  #ifdef CONFIG_SCHED_SMT
  /* MCD - Do we really need this?  It is always on if CONFIG_SCHED_SMT is,
   * so can't we drop this in favor of CONFIG_SCHED_SMT?
   */
  #define ARCH_HAS_SCHED_WAKE_IDLE
  /* Common values for SMT siblings */
  #ifndef SD_SIBLING_INIT
47734f89b   Ingo Molnar   sched: Clean up t...
87
88
89
90
91
92
93
94
95
96
  #define SD_SIBLING_INIT (struct sched_domain) {				\
  	.min_interval		= 1,					\
  	.max_interval		= 2,					\
  	.busy_factor		= 64,					\
  	.imbalance_pct		= 110,					\
  									\
  	.flags			= 1*SD_LOAD_BALANCE			\
  				| 1*SD_BALANCE_NEWIDLE			\
  				| 1*SD_BALANCE_EXEC			\
  				| 1*SD_BALANCE_FORK			\
182a85f8a   Peter Zijlstra   sched: Disable wa...
97
  				| 0*SD_BALANCE_WAKE			\
47734f89b   Ingo Molnar   sched: Clean up t...
98
  				| 1*SD_WAKE_AFFINE			\
47734f89b   Ingo Molnar   sched: Clean up t...
99
100
  				| 1*SD_SHARE_CPUPOWER			\
  				| 0*SD_POWERSAVINGS_BALANCE		\
50b926e43   Mike Galbraith   sched: Fix vmark ...
101
  				| 1*SD_SHARE_PKG_RESOURCES		\
47734f89b   Ingo Molnar   sched: Clean up t...
102
  				| 0*SD_SERIALIZE			\
47734f89b   Ingo Molnar   sched: Clean up t...
103
  				| 0*SD_PREFER_SIBLING			\
2ec57d448   Michael Neuling   sched: Fix spelli...
104
  				| arch_sd_sibling_asym_packing()	\
47734f89b   Ingo Molnar   sched: Clean up t...
105
106
107
108
  				,					\
  	.last_balance		= jiffies,				\
  	.balance_interval	= 1,					\
  	.smt_gain		= 1178,	/* 15% */			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
111
  }
  #endif
  #endif /* CONFIG_SCHED_SMT */
89c4710ee   Siddha, Suresh B   [PATCH] sched: cl...
112
113
114
  #ifdef CONFIG_SCHED_MC
  /* Common values for MC siblings. for now mostly derived from SD_CPU_INIT */
  #ifndef SD_MC_INIT
47734f89b   Ingo Molnar   sched: Clean up t...
115
116
117
118
119
120
121
  #define SD_MC_INIT (struct sched_domain) {				\
  	.min_interval		= 1,					\
  	.max_interval		= 4,					\
  	.busy_factor		= 64,					\
  	.imbalance_pct		= 125,					\
  	.cache_nice_tries	= 1,					\
  	.busy_idx		= 2,					\
78e7ed53c   Peter Zijlstra   sched: Tweak wake...
122
  	.wake_idx		= 0,					\
b8a543ea5   Peter Zijlstra   sched: Reduce for...
123
  	.forkexec_idx		= 0,					\
47734f89b   Ingo Molnar   sched: Clean up t...
124
125
  									\
  	.flags			= 1*SD_LOAD_BALANCE			\
840a06531   Ingo Molnar   sched: Turn on SD...
126
  				| 1*SD_BALANCE_NEWIDLE			\
47734f89b   Ingo Molnar   sched: Clean up t...
127
128
  				| 1*SD_BALANCE_EXEC			\
  				| 1*SD_BALANCE_FORK			\
182a85f8a   Peter Zijlstra   sched: Disable wa...
129
  				| 0*SD_BALANCE_WAKE			\
47734f89b   Ingo Molnar   sched: Clean up t...
130
  				| 1*SD_WAKE_AFFINE			\
799e2205e   Peter Zijlstra   sched: Disable SD...
131
  				| 0*SD_PREFER_LOCAL			\
47734f89b   Ingo Molnar   sched: Clean up t...
132
133
134
  				| 0*SD_SHARE_CPUPOWER			\
  				| 1*SD_SHARE_PKG_RESOURCES		\
  				| 0*SD_SERIALIZE			\
47734f89b   Ingo Molnar   sched: Clean up t...
135
136
137
138
139
  				| sd_balance_for_mc_power()		\
  				| sd_power_saving_flags()		\
  				,					\
  	.last_balance		= jiffies,				\
  	.balance_interval	= 1,					\
89c4710ee   Siddha, Suresh B   [PATCH] sched: cl...
140
141
142
  }
  #endif
  #endif /* CONFIG_SCHED_MC */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
144
  /* Common values for CPUs */
  #ifndef SD_CPU_INIT
47734f89b   Ingo Molnar   sched: Clean up t...
145
146
147
148
149
150
151
152
  #define SD_CPU_INIT (struct sched_domain) {				\
  	.min_interval		= 1,					\
  	.max_interval		= 4,					\
  	.busy_factor		= 64,					\
  	.imbalance_pct		= 125,					\
  	.cache_nice_tries	= 1,					\
  	.busy_idx		= 2,					\
  	.idle_idx		= 1,					\
0ec9fab3d   Mike Galbraith   sched: Improve la...
153
  	.newidle_idx		= 0,					\
78e7ed53c   Peter Zijlstra   sched: Tweak wake...
154
  	.wake_idx		= 0,					\
b8a543ea5   Peter Zijlstra   sched: Reduce for...
155
  	.forkexec_idx		= 0,					\
47734f89b   Ingo Molnar   sched: Clean up t...
156
157
  									\
  	.flags			= 1*SD_LOAD_BALANCE			\
840a06531   Ingo Molnar   sched: Turn on SD...
158
  				| 1*SD_BALANCE_NEWIDLE			\
47734f89b   Ingo Molnar   sched: Clean up t...
159
160
  				| 1*SD_BALANCE_EXEC			\
  				| 1*SD_BALANCE_FORK			\
182a85f8a   Peter Zijlstra   sched: Disable wa...
161
  				| 0*SD_BALANCE_WAKE			\
6bd7821f9   Peter Zijlstra   sched: Fix some d...
162
  				| 1*SD_WAKE_AFFINE			\
799e2205e   Peter Zijlstra   sched: Disable SD...
163
  				| 0*SD_PREFER_LOCAL			\
47734f89b   Ingo Molnar   sched: Clean up t...
164
165
166
  				| 0*SD_SHARE_CPUPOWER			\
  				| 0*SD_SHARE_PKG_RESOURCES		\
  				| 0*SD_SERIALIZE			\
47734f89b   Ingo Molnar   sched: Clean up t...
167
168
169
170
171
  				| sd_balance_for_package_power()	\
  				| sd_power_saving_flags()		\
  				,					\
  	.last_balance		= jiffies,				\
  	.balance_interval	= 1,					\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
173
  }
  #endif
9c1cfda20   John Hawkes   [PATCH] cpusets: ...
174
  /* sched_domains SD_ALLNODES_INIT for NUMA machines */
47734f89b   Ingo Molnar   sched: Clean up t...
175
176
177
178
179
180
181
182
183
184
185
186
  #define SD_ALLNODES_INIT (struct sched_domain) {			\
  	.min_interval		= 64,					\
  	.max_interval		= 64*num_online_cpus(),			\
  	.busy_factor		= 128,					\
  	.imbalance_pct		= 133,					\
  	.cache_nice_tries	= 1,					\
  	.busy_idx		= 3,					\
  	.idle_idx		= 3,					\
  	.flags			= 1*SD_LOAD_BALANCE			\
  				| 1*SD_BALANCE_NEWIDLE			\
  				| 0*SD_BALANCE_EXEC			\
  				| 0*SD_BALANCE_FORK			\
c88d59108   Peter Zijlstra   sched: Merge sele...
187
  				| 0*SD_BALANCE_WAKE			\
6bd7821f9   Peter Zijlstra   sched: Fix some d...
188
  				| 0*SD_WAKE_AFFINE			\
47734f89b   Ingo Molnar   sched: Clean up t...
189
190
191
192
  				| 0*SD_SHARE_CPUPOWER			\
  				| 0*SD_POWERSAVINGS_BALANCE		\
  				| 0*SD_SHARE_PKG_RESOURCES		\
  				| 1*SD_SERIALIZE			\
47734f89b   Ingo Molnar   sched: Clean up t...
193
194
195
196
  				| 0*SD_PREFER_SIBLING			\
  				,					\
  	.last_balance		= jiffies,				\
  	.balance_interval	= 64,					\
9c1cfda20   John Hawkes   [PATCH] cpusets: ...
197
  }
01a08546a   Heiko Carstens   sched: Add book s...
198
199
200
201
202
  #ifdef CONFIG_SCHED_BOOK
  #ifndef SD_BOOK_INIT
  #error Please define an appropriate SD_BOOK_INIT in include/asm/topology.h!!!
  #endif
  #endif /* CONFIG_SCHED_BOOK */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
204
205
206
  #ifdef CONFIG_NUMA
  #ifndef SD_NODE_INIT
  #error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!!
  #endif
728120192   Lee Schermerhorn   numa: add generic...
207

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
  #endif /* CONFIG_NUMA */
728120192   Lee Schermerhorn   numa: add generic...
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
  #ifdef CONFIG_USE_PERCPU_NUMA_NODE_ID
  DECLARE_PER_CPU(int, numa_node);
  
  #ifndef numa_node_id
  /* Returns the number of the current Node. */
  static inline int numa_node_id(void)
  {
  	return __this_cpu_read(numa_node);
  }
  #endif
  
  #ifndef cpu_to_node
  static inline int cpu_to_node(int cpu)
  {
  	return per_cpu(numa_node, cpu);
  }
  #endif
  
  #ifndef set_numa_node
  static inline void set_numa_node(int node)
  {
  	percpu_write(numa_node, node);
  }
  #endif
  
  #ifndef set_cpu_numa_node
  static inline void set_cpu_numa_node(int cpu, int node)
  {
  	per_cpu(numa_node, cpu) = node;
  }
  #endif
  
  #else	/* !CONFIG_USE_PERCPU_NUMA_NODE_ID */
  
  /* Returns the number of the current Node. */
  #ifndef numa_node_id
  static inline int numa_node_id(void)
  {
  	return cpu_to_node(raw_smp_processor_id());
  }
  #endif
  
  #endif	/* [!]CONFIG_USE_PERCPU_NUMA_NODE_ID */
7aac78988   Lee Schermerhorn   numa: introduce n...
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
  #ifdef CONFIG_HAVE_MEMORYLESS_NODES
  
  /*
   * N.B., Do NOT reference the '_numa_mem_' per cpu variable directly.
   * It will not be defined when CONFIG_HAVE_MEMORYLESS_NODES is not defined.
   * Use the accessor functions set_numa_mem(), numa_mem_id() and cpu_to_mem().
   */
  DECLARE_PER_CPU(int, _numa_mem_);
  
  #ifndef set_numa_mem
  static inline void set_numa_mem(int node)
  {
  	percpu_write(_numa_mem_, node);
  }
  #endif
  
  #ifndef numa_mem_id
  /* Returns the number of the nearest Node with memory */
  static inline int numa_mem_id(void)
  {
  	return __this_cpu_read(_numa_mem_);
  }
  #endif
  
  #ifndef cpu_to_mem
  static inline int cpu_to_mem(int cpu)
  {
  	return per_cpu(_numa_mem_, cpu);
  }
  #endif
  
  #ifndef set_cpu_numa_mem
  static inline void set_cpu_numa_mem(int cpu, int node)
  {
  	per_cpu(_numa_mem_, cpu) = node;
  }
  #endif
  
  #else	/* !CONFIG_HAVE_MEMORYLESS_NODES */
7aac78988   Lee Schermerhorn   numa: introduce n...
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
  #ifndef numa_mem_id
  /* Returns the number of the nearest Node with memory */
  static inline int numa_mem_id(void)
  {
  	return numa_node_id();
  }
  #endif
  
  #ifndef cpu_to_mem
  static inline int cpu_to_mem(int cpu)
  {
  	return cpu_to_node(cpu);
  }
  #endif
  
  #endif	/* [!]CONFIG_HAVE_MEMORYLESS_NODES */
c50cbb05a   Ben Hutchings   cpu topology: alw...
307
308
309
310
311
312
  #ifndef topology_physical_package_id
  #define topology_physical_package_id(cpu)	((void)(cpu), -1)
  #endif
  #ifndef topology_core_id
  #define topology_core_id(cpu)			((void)(cpu), 0)
  #endif
fbd59a8d1   Rusty Russell   cpumask: Use topo...
313
314
315
316
317
318
  #ifndef topology_thread_cpumask
  #define topology_thread_cpumask(cpu)		cpumask_of(cpu)
  #endif
  #ifndef topology_core_cpumask
  #define topology_core_cpumask(cpu)		cpumask_of(cpu)
  #endif
c50cbb05a   Ben Hutchings   cpu topology: alw...
319

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
  #endif /* _LINUX_TOPOLOGY_H */