• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * include/linux/topology.h
3  *
4  * Written by: Matthew Dobson, IBM Corporation
5  *
6  * Copyright (C) 2002, IBM Corp.
7  *
8  * All rights reserved.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
18  * NON INFRINGEMENT.  See the GNU General Public License for more
19  * details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24  *
25  * Send feedback to <colpatch@us.ibm.com>
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)				\
42 	({						\
43 		node_to_cpumask_ptr(__tmp__, node);	\
44 		cpus_weight(*__tmp__);			\
45 	})
46 #endif
47 
48 #define for_each_node_with_cpus(node)			\
49 	for_each_online_node(node)			\
50 		if (nr_cpus_node(node))
51 
52 int arch_update_cpu_topology(void);
53 
54 /* Conform to ACPI 2.0 SLIT distance definitions */
55 #define LOCAL_DISTANCE		10
56 #define REMOTE_DISTANCE		20
57 #ifndef node_distance
58 #define node_distance(from,to)	((from) == (to) ? LOCAL_DISTANCE : REMOTE_DISTANCE)
59 #endif
60 #ifndef RECLAIM_DISTANCE
61 /*
62  * If the distance between nodes in a system is larger than RECLAIM_DISTANCE
63  * (in whatever arch specific measurement units returned by node_distance())
64  * then switch on zone reclaim on boot.
65  */
66 #define RECLAIM_DISTANCE 20
67 #endif
68 #ifndef PENALTY_FOR_NODE_WITH_CPUS
69 #define PENALTY_FOR_NODE_WITH_CPUS	(1)
70 #endif
71 
72 /*
73  * Below are the 3 major initializers used in building sched_domains:
74  * SD_SIBLING_INIT, for SMT domains
75  * SD_CPU_INIT, for SMP domains
76  * SD_NODE_INIT, for NUMA domains
77  *
78  * Any architecture that cares to do any tuning to these values should do so
79  * by defining their own arch-specific initializer in include/asm/topology.h.
80  * A definition there will automagically override these default initializers
81  * and allow arch-specific performance tuning of sched_domains.
82  * (Only non-zero and non-null fields need be specified.)
83  */
84 
85 #ifdef CONFIG_SCHED_SMT
86 /* MCD - Do we really need this?  It is always on if CONFIG_SCHED_SMT is,
87  * so can't we drop this in favor of CONFIG_SCHED_SMT?
88  */
89 #define ARCH_HAS_SCHED_WAKE_IDLE
90 /* Common values for SMT siblings */
91 #ifndef SD_SIBLING_INIT
92 #define SD_SIBLING_INIT (struct sched_domain) {		\
93 	.min_interval		= 1,			\
94 	.max_interval		= 2,			\
95 	.busy_factor		= 64,			\
96 	.imbalance_pct		= 110,			\
97 	.flags			= SD_LOAD_BALANCE	\
98 				| SD_BALANCE_NEWIDLE	\
99 				| SD_BALANCE_FORK	\
100 				| SD_BALANCE_EXEC	\
101 				| SD_WAKE_AFFINE	\
102 				| SD_WAKE_BALANCE	\
103 				| SD_SHARE_CPUPOWER,	\
104 	.last_balance		= jiffies,		\
105 	.balance_interval	= 1,			\
106 }
107 #endif
108 #endif /* CONFIG_SCHED_SMT */
109 
110 #ifdef CONFIG_SCHED_MC
111 /* Common values for MC siblings. for now mostly derived from SD_CPU_INIT */
112 #ifndef SD_MC_INIT
113 #define SD_MC_INIT (struct sched_domain) {		\
114 	.min_interval		= 1,			\
115 	.max_interval		= 4,			\
116 	.busy_factor		= 64,			\
117 	.imbalance_pct		= 125,			\
118 	.cache_nice_tries	= 1,			\
119 	.busy_idx		= 2,			\
120 	.wake_idx		= 1,			\
121 	.forkexec_idx		= 1,			\
122 	.flags			= SD_LOAD_BALANCE	\
123 				| SD_BALANCE_FORK	\
124 				| SD_BALANCE_EXEC	\
125 				| SD_WAKE_AFFINE	\
126 				| SD_WAKE_BALANCE	\
127 				| SD_SHARE_PKG_RESOURCES\
128 				| sd_balance_for_mc_power()\
129 				| sd_power_saving_flags(),\
130 	.last_balance		= jiffies,		\
131 	.balance_interval	= 1,			\
132 }
133 #endif
134 #endif /* CONFIG_SCHED_MC */
135 
136 /* Common values for CPUs */
137 #ifndef SD_CPU_INIT
138 #define SD_CPU_INIT (struct sched_domain) {		\
139 	.min_interval		= 1,			\
140 	.max_interval		= 4,			\
141 	.busy_factor		= 64,			\
142 	.imbalance_pct		= 125,			\
143 	.cache_nice_tries	= 1,			\
144 	.busy_idx		= 2,			\
145 	.idle_idx		= 1,			\
146 	.newidle_idx		= 2,			\
147 	.wake_idx		= 1,			\
148 	.forkexec_idx		= 1,			\
149 	.flags			= SD_LOAD_BALANCE	\
150 				| SD_BALANCE_EXEC	\
151 				| SD_BALANCE_FORK	\
152 				| SD_WAKE_AFFINE	\
153 				| SD_WAKE_BALANCE	\
154 				| sd_balance_for_package_power()\
155 				| sd_power_saving_flags(),\
156 	.last_balance		= jiffies,		\
157 	.balance_interval	= 1,			\
158 }
159 #endif
160 
161 /* sched_domains SD_ALLNODES_INIT for NUMA machines */
162 #define SD_ALLNODES_INIT (struct sched_domain) {	\
163 	.min_interval		= 64,			\
164 	.max_interval		= 64*num_online_cpus(),	\
165 	.busy_factor		= 128,			\
166 	.imbalance_pct		= 133,			\
167 	.cache_nice_tries	= 1,			\
168 	.busy_idx		= 3,			\
169 	.idle_idx		= 3,			\
170 	.flags			= SD_LOAD_BALANCE	\
171 				| SD_BALANCE_NEWIDLE	\
172 				| SD_WAKE_AFFINE	\
173 				| SD_SERIALIZE,		\
174 	.last_balance		= jiffies,		\
175 	.balance_interval	= 64,			\
176 }
177 
178 #ifdef CONFIG_NUMA
179 #ifndef SD_NODE_INIT
180 #error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!!
181 #endif
182 #endif /* CONFIG_NUMA */
183 
184 #ifndef topology_physical_package_id
185 #define topology_physical_package_id(cpu)	((void)(cpu), -1)
186 #endif
187 #ifndef topology_core_id
188 #define topology_core_id(cpu)			((void)(cpu), 0)
189 #endif
190 #ifndef topology_thread_siblings
191 #define topology_thread_siblings(cpu)		cpumask_of_cpu(cpu)
192 #endif
193 #ifndef topology_core_siblings
194 #define topology_core_siblings(cpu)		cpumask_of_cpu(cpu)
195 #endif
196 
197 #endif /* _LINUX_TOPOLOGY_H */
198