Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.26-rc9 223 lines 5.6 kB view raw
1/* 2 * Written by: Matthew Dobson, IBM Corporation 3 * 4 * Copyright (C) 2002, IBM Corp. 5 * 6 * All rights reserved. 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, but 14 * WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 16 * NON INFRINGEMENT. See the GNU General Public License for more 17 * details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22 * 23 * Send feedback to <colpatch@us.ibm.com> 24 */ 25#ifndef _ASM_X86_TOPOLOGY_H 26#define _ASM_X86_TOPOLOGY_H 27 28#ifdef CONFIG_X86_32 29# ifdef CONFIG_X86_HT 30# define ENABLE_TOPO_DEFINES 31# endif 32#else 33# ifdef CONFIG_SMP 34# define ENABLE_TOPO_DEFINES 35# endif 36#endif 37 38#ifdef CONFIG_NUMA 39#include <linux/cpumask.h> 40#include <asm/mpspec.h> 41 42/* Mappings between logical cpu number and node number */ 43#ifdef CONFIG_X86_32 44extern int cpu_to_node_map[]; 45#else 46/* Returns the number of the current Node. */ 47#define numa_node_id() (early_cpu_to_node(raw_smp_processor_id())) 48#endif 49 50DECLARE_PER_CPU(int, x86_cpu_to_node_map); 51 52#ifdef CONFIG_SMP 53extern int x86_cpu_to_node_map_init[]; 54extern void *x86_cpu_to_node_map_early_ptr; 55#else 56#define x86_cpu_to_node_map_early_ptr NULL 57#endif 58 59extern cpumask_t node_to_cpumask_map[]; 60 61#define NUMA_NO_NODE (-1) 62 63/* Returns the number of the node containing CPU 'cpu' */ 64#ifdef CONFIG_X86_32 65#define early_cpu_to_node(cpu) cpu_to_node(cpu) 66static inline int cpu_to_node(int cpu) 67{ 68 return cpu_to_node_map[cpu]; 69} 70 71#else /* CONFIG_X86_64 */ 72 73#ifdef CONFIG_SMP 74static inline int early_cpu_to_node(int cpu) 75{ 76 int *cpu_to_node_map = x86_cpu_to_node_map_early_ptr; 77 78 if (cpu_to_node_map) 79 return cpu_to_node_map[cpu]; 80 else if (per_cpu_offset(cpu)) 81 return per_cpu(x86_cpu_to_node_map, cpu); 82 else 83 return NUMA_NO_NODE; 84} 85#else 86#define early_cpu_to_node(cpu) cpu_to_node(cpu) 87#endif 88 89static inline int cpu_to_node(int cpu) 90{ 91#ifdef CONFIG_DEBUG_PER_CPU_MAPS 92 if (x86_cpu_to_node_map_early_ptr) { 93 printk("KERN_NOTICE cpu_to_node(%d): usage too early!\n", 94 (int)cpu); 95 dump_stack(); 96 return ((int *)x86_cpu_to_node_map_early_ptr)[cpu]; 97 } 98#endif 99 return per_cpu(x86_cpu_to_node_map, cpu); 100} 101 102#ifdef CONFIG_NUMA 103 104/* Returns a pointer to the cpumask of CPUs on Node 'node'. */ 105#define node_to_cpumask_ptr(v, node) \ 106 cpumask_t *v = &(node_to_cpumask_map[node]) 107 108#define node_to_cpumask_ptr_next(v, node) \ 109 v = &(node_to_cpumask_map[node]) 110#endif 111 112#endif /* CONFIG_X86_64 */ 113 114/* 115 * Returns the number of the node containing Node 'node'. This 116 * architecture is flat, so it is a pretty simple function! 117 */ 118#define parent_node(node) (node) 119 120/* Returns a bitmask of CPUs on Node 'node'. */ 121static inline cpumask_t node_to_cpumask(int node) 122{ 123 return node_to_cpumask_map[node]; 124} 125 126/* Returns the number of the first CPU on Node 'node'. */ 127static inline int node_to_first_cpu(int node) 128{ 129 cpumask_t mask = node_to_cpumask(node); 130 131 return first_cpu(mask); 132} 133 134#define pcibus_to_node(bus) __pcibus_to_node(bus) 135#define pcibus_to_cpumask(bus) __pcibus_to_cpumask(bus) 136 137#ifdef CONFIG_X86_32 138extern unsigned long node_start_pfn[]; 139extern unsigned long node_end_pfn[]; 140extern unsigned long node_remap_size[]; 141#define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid]) 142 143# define SD_CACHE_NICE_TRIES 1 144# define SD_IDLE_IDX 1 145# define SD_NEWIDLE_IDX 2 146# define SD_FORKEXEC_IDX 0 147 148#else 149 150# define SD_CACHE_NICE_TRIES 2 151# define SD_IDLE_IDX 2 152# define SD_NEWIDLE_IDX 2 153# define SD_FORKEXEC_IDX 1 154 155#endif 156 157/* sched_domains SD_NODE_INIT for NUMAQ machines */ 158#define SD_NODE_INIT (struct sched_domain) { \ 159 .min_interval = 8, \ 160 .max_interval = 32, \ 161 .busy_factor = 32, \ 162 .imbalance_pct = 125, \ 163 .cache_nice_tries = SD_CACHE_NICE_TRIES, \ 164 .busy_idx = 3, \ 165 .idle_idx = SD_IDLE_IDX, \ 166 .newidle_idx = SD_NEWIDLE_IDX, \ 167 .wake_idx = 1, \ 168 .forkexec_idx = SD_FORKEXEC_IDX, \ 169 .flags = SD_LOAD_BALANCE \ 170 | SD_BALANCE_EXEC \ 171 | SD_BALANCE_FORK \ 172 | SD_SERIALIZE \ 173 | SD_WAKE_BALANCE, \ 174 .last_balance = jiffies, \ 175 .balance_interval = 1, \ 176} 177 178#ifdef CONFIG_X86_64_ACPI_NUMA 179extern int __node_distance(int, int); 180#define node_distance(a, b) __node_distance(a, b) 181#endif 182 183#else /* CONFIG_NUMA */ 184 185#endif 186 187#include <asm-generic/topology.h> 188 189extern cpumask_t cpu_coregroup_map(int cpu); 190 191#ifdef ENABLE_TOPO_DEFINES 192#define topology_physical_package_id(cpu) (cpu_data(cpu).phys_proc_id) 193#define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) 194#define topology_core_siblings(cpu) (per_cpu(cpu_core_map, cpu)) 195#define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu)) 196#endif 197 198static inline void arch_fix_phys_package_id(int num, u32 slot) 199{ 200} 201 202struct pci_bus; 203void set_pci_bus_resources_arch_default(struct pci_bus *b); 204 205#ifdef CONFIG_SMP 206#define mc_capable() (boot_cpu_data.x86_max_cores > 1) 207#define smt_capable() (smp_num_siblings > 1) 208#endif 209 210#ifdef CONFIG_NUMA 211extern int get_mp_bus_to_node(int busnum); 212extern void set_mp_bus_to_node(int busnum, int node); 213#else 214static inline int get_mp_bus_to_node(int busnum) 215{ 216 return 0; 217} 218static inline void set_mp_bus_to_node(int busnum, int node) 219{ 220} 221#endif 222 223#endif