Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
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 <linux/percpu.h> 35: #include <asm/topology.h> 36: 37: #ifndef node_has_online_mem 38: #define node_has_online_mem(nid) (1) 39: #endif 40: 41: #ifndef nr_cpus_node 42: #define nr_cpus_node(node) cpumask_weight(cpumask_of_node(node)) 43: #endif 44: 45: #define for_each_node_with_cpus(node) \ 46: for_each_online_node(node) \ 47: if (nr_cpus_node(node)) 48: 49: int arch_update_cpu_topology(void); 50: 51: /* Conform to ACPI 2.0 SLIT distance definitions */ 52: #define LOCAL_DISTANCE 10 53: #define REMOTE_DISTANCE 20 54: #ifndef node_distance 55: #define node_distance(from,to) ((from) == (to) ? LOCAL_DISTANCE : REMOTE_DISTANCE) 56: #endif 57: #ifndef RECLAIM_DISTANCE 58: /* 59: * If the distance between nodes in a system is larger than RECLAIM_DISTANCE 60: * (in whatever arch specific measurement units returned by node_distance()) 61: * then switch on zone reclaim on boot. 62: */ 63: #define RECLAIM_DISTANCE 30 64: #endif 65: #ifndef PENALTY_FOR_NODE_WITH_CPUS 66: #define PENALTY_FOR_NODE_WITH_CPUS (1) 67: #endif 68: 69: /* 70: * Below are the 3 major initializers used in building sched_domains: 71: * SD_SIBLING_INIT, for SMT domains 72: * SD_CPU_INIT, for SMP domains 73: * 74: * Any architecture that cares to do any tuning to these values should do so 75: * by defining their own arch-specific initializer in include/asm/topology.h. 76: * A definition there will automagically override these default initializers 77: * and allow arch-specific performance tuning of sched_domains. 78: * (Only non-zero and non-null fields need be specified.) 79: */ 80: 81: #ifdef CONFIG_SCHED_SMT 82: /* MCD - Do we really need this? It is always on if CONFIG_SCHED_SMT is, 83: * so can't we drop this in favor of CONFIG_SCHED_SMT? 84: */ 85: #define ARCH_HAS_SCHED_WAKE_IDLE 86: /* Common values for SMT siblings */ 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: | 1*SD_SHARE_PKG_RESOURCES \ 102: | 0*SD_SERIALIZE \ 103: | 0*SD_PREFER_SIBLING \ 104: | arch_sd_sibling_asym_packing() \ 105: , \ 106: .last_balance = jiffies, \ 107: .balance_interval = 1, \ 108: .smt_gain = 1178, /* 15% */ \ 109: .max_newidle_lb_cost = 0, \ 110: .next_decay_max_lb_cost = jiffies, \ 111: } 112: #endif 113: #endif /* CONFIG_SCHED_SMT */ 114: 115: #ifdef CONFIG_SCHED_MC 116: /* Common values for MC siblings. for now mostly derived from SD_CPU_INIT */ 117: #ifndef SD_MC_INIT 118: #define SD_MC_INIT (struct sched_domain) { \ 119: .min_interval = 1, \ 120: .max_interval = 4, \ 121: .busy_factor = 64, \ 122: .imbalance_pct = 125, \ 123: .cache_nice_tries = 1, \ 124: .busy_idx = 2, \ 125: .wake_idx = 0, \ 126: .forkexec_idx = 0, \ 127: \ 128: .flags = 1*SD_LOAD_BALANCE \ 129: | 1*SD_BALANCE_NEWIDLE \ 130: | 1*SD_BALANCE_EXEC \ 131: | 1*SD_BALANCE_FORK \ 132: | 0*SD_BALANCE_WAKE \ 133: | 1*SD_WAKE_AFFINE \ 134: | 0*SD_SHARE_CPUPOWER \ 135: | 1*SD_SHARE_PKG_RESOURCES \ 136: | 0*SD_SERIALIZE \ 137: , \ 138: .last_balance = jiffies, \ 139: .balance_interval = 1, \ 140: .max_newidle_lb_cost = 0, \ 141: .next_decay_max_lb_cost = jiffies, \ 142: } 143: #endif 144: #endif /* CONFIG_SCHED_MC */ 145: 146: /* Common values for CPUs */ 147: #ifndef SD_CPU_INIT 148: #define SD_CPU_INIT (struct sched_domain) { \ 149: .min_interval = 1, \ 150: .max_interval = 4, \ 151: .busy_factor = 64, \ 152: .imbalance_pct = 125, \ 153: .cache_nice_tries = 1, \ 154: .busy_idx = 2, \ 155: .idle_idx = 1, \ 156: .newidle_idx = 0, \ 157: .wake_idx = 0, \ 158: .forkexec_idx = 0, \ 159: \ 160: .flags = 1*SD_LOAD_BALANCE \ 161: | 1*SD_BALANCE_NEWIDLE \ 162: | 1*SD_BALANCE_EXEC \ 163: | 1*SD_BALANCE_FORK \ 164: | 0*SD_BALANCE_WAKE \ 165: | 1*SD_WAKE_AFFINE \ 166: | 0*SD_SHARE_CPUPOWER \ 167: | 0*SD_SHARE_PKG_RESOURCES \ 168: | 0*SD_SERIALIZE \ 169: | 1*SD_PREFER_SIBLING \ 170: , \ 171: .last_balance = jiffies, \ 172: .balance_interval = 1, \ 173: .max_newidle_lb_cost = 0, \ 174: .next_decay_max_lb_cost = jiffies, \ 175: } 176: #endif 177: 178: #ifdef CONFIG_SCHED_BOOK 179: #ifndef SD_BOOK_INIT 180: #error Please define an appropriate SD_BOOK_INIT in include/asm/topology.h!!! 181: #endif 182: #endif /* CONFIG_SCHED_BOOK */ 183: 184: #ifdef CONFIG_USE_PERCPU_NUMA_NODE_ID 185: DECLARE_PER_CPU(int, numa_node); 186: 187: #ifndef numa_node_id 188: /* Returns the number of the current Node. */ 189: static inline int numa_node_id(void) 190: { 191: return __this_cpu_read(numa_node); 192: } 193: #endif 194: 195: #ifndef cpu_to_node 196: static inline int cpu_to_node(int cpu) 197: { 198: return per_cpu(numa_node, cpu); 199: } 200: #endif 201: 202: #ifndef set_numa_node 203: static inline void set_numa_node(int node) 204: { 205: this_cpu_write(numa_node, node); 206: } 207: #endif 208: 209: #ifndef set_cpu_numa_node 210: static inline void set_cpu_numa_node(int cpu, int node) 211: { 212: per_cpu(numa_node, cpu) = node; 213: } 214: #endif 215: 216: #else /* !CONFIG_USE_PERCPU_NUMA_NODE_ID */ 217: 218: /* Returns the number of the current Node. */ 219: #ifndef numa_node_id 220: static inline int numa_node_id(void) 221: { 222: return cpu_to_node(raw_smp_processor_id()); 223: } 224: #endif 225: 226: #endif /* [!]CONFIG_USE_PERCPU_NUMA_NODE_ID */ 227: 228: #ifdef CONFIG_HAVE_MEMORYLESS_NODES 229: 230: /* 231: * N.B., Do NOT reference the '_numa_mem_' per cpu variable directly. 232: * It will not be defined when CONFIG_HAVE_MEMORYLESS_NODES is not defined. 233: * Use the accessor functions set_numa_mem(), numa_mem_id() and cpu_to_mem(). 234: */ 235: DECLARE_PER_CPU(int, _numa_mem_); 236: 237: #ifndef set_numa_mem 238: static inline void set_numa_mem(int node) 239: { 240: this_cpu_write(_numa_mem_, node); 241: } 242: #endif 243: 244: #ifndef numa_mem_id 245: /* Returns the number of the nearest Node with memory */ 246: static inline int numa_mem_id(void) 247: { 248: return __this_cpu_read(_numa_mem_); 249: } 250: #endif 251: 252: #ifndef cpu_to_mem 253: static inline int cpu_to_mem(int cpu) 254: { 255: return per_cpu(_numa_mem_, cpu); 256: } 257: #endif 258: 259: #ifndef set_cpu_numa_mem 260: static inline void set_cpu_numa_mem(int cpu, int node) 261: { 262: per_cpu(_numa_mem_, cpu) = node; 263: } 264: #endif 265: 266: #else /* !CONFIG_HAVE_MEMORYLESS_NODES */ 267: 268: #ifndef numa_mem_id 269: /* Returns the number of the nearest Node with memory */ 270: static inline int numa_mem_id(void) 271: { 272: return numa_node_id(); 273: } 274: #endif 275: 276: #ifndef cpu_to_mem 277: static inline int cpu_to_mem(int cpu) 278: { 279: return cpu_to_node(cpu); 280: } 281: #endif 282: 283: #endif /* [!]CONFIG_HAVE_MEMORYLESS_NODES */ 284: 285: #ifndef topology_physical_package_id 286: #define topology_physical_package_id(cpu) ((void)(cpu), -1) 287: #endif 288: #ifndef topology_core_id 289: #define topology_core_id(cpu) ((void)(cpu), 0) 290: #endif 291: #ifndef topology_thread_cpumask 292: #define topology_thread_cpumask(cpu) cpumask_of(cpu) 293: #endif 294: #ifndef topology_core_cpumask 295: #define topology_core_cpumask(cpu) cpumask_of(cpu) 296: #endif 297: 298: #endif /* _LINUX_TOPOLOGY_H */ 299: