diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-x86/numa_64.h | 19 | ||||
-rw-r--r-- | include/asm-x86/pda.h | 5 | ||||
-rw-r--r-- | include/asm-x86/percpu.h | 46 | ||||
-rw-r--r-- | include/asm-x86/smp.h | 15 | ||||
-rw-r--r-- | include/asm-x86/topology.h | 152 | ||||
-rw-r--r-- | include/linux/mm.h | 1 |
6 files changed, 153 insertions, 85 deletions
diff --git a/include/asm-x86/numa_64.h b/include/asm-x86/numa_64.h index 22e87c9f6a80..b510daf4f4d8 100644 --- a/include/asm-x86/numa_64.h +++ b/include/asm-x86/numa_64.h | |||
@@ -14,11 +14,9 @@ extern int compute_hash_shift(struct bootnode *nodes, int numblks, | |||
14 | 14 | ||
15 | #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) | 15 | #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) |
16 | 16 | ||
17 | extern void numa_add_cpu(int cpu); | ||
18 | extern void numa_init_array(void); | 17 | extern void numa_init_array(void); |
19 | extern int numa_off; | 18 | extern int numa_off; |
20 | 19 | ||
21 | extern void numa_set_node(int cpu, int node); | ||
22 | extern void srat_reserve_add_area(int nodeid); | 20 | extern void srat_reserve_add_area(int nodeid); |
23 | extern int hotadd_percent; | 21 | extern int hotadd_percent; |
24 | 22 | ||
@@ -31,15 +29,16 @@ extern void setup_node_bootmem(int nodeid, unsigned long start, | |||
31 | 29 | ||
32 | #ifdef CONFIG_NUMA | 30 | #ifdef CONFIG_NUMA |
33 | extern void __init init_cpu_to_node(void); | 31 | extern void __init init_cpu_to_node(void); |
34 | 32 | extern void __cpuinit numa_set_node(int cpu, int node); | |
35 | static inline void clear_node_cpumask(int cpu) | 33 | extern void __cpuinit numa_clear_node(int cpu); |
36 | { | 34 | extern void __cpuinit numa_add_cpu(int cpu); |
37 | clear_bit(cpu, (unsigned long *)&node_to_cpumask_map[cpu_to_node(cpu)]); | 35 | extern void __cpuinit numa_remove_cpu(int cpu); |
38 | } | ||
39 | |||
40 | #else | 36 | #else |
41 | #define init_cpu_to_node() do {} while (0) | 37 | static inline void init_cpu_to_node(void) { } |
42 | #define clear_node_cpumask(cpu) do {} while (0) | 38 | static inline void numa_set_node(int cpu, int node) { } |
39 | static inline void numa_clear_node(int cpu) { } | ||
40 | static inline void numa_add_cpu(int cpu, int node) { } | ||
41 | static inline void numa_remove_cpu(int cpu) { } | ||
43 | #endif | 42 | #endif |
44 | 43 | ||
45 | #endif | 44 | #endif |
diff --git a/include/asm-x86/pda.h b/include/asm-x86/pda.h index 101fb9e11954..b34e9a7cc80b 100644 --- a/include/asm-x86/pda.h +++ b/include/asm-x86/pda.h | |||
@@ -22,6 +22,8 @@ struct x8664_pda { | |||
22 | offset 40!!! */ | 22 | offset 40!!! */ |
23 | #endif | 23 | #endif |
24 | char *irqstackptr; | 24 | char *irqstackptr; |
25 | short nodenumber; /* number of current node (32k max) */ | ||
26 | short in_bootmem; /* pda lives in bootmem */ | ||
25 | unsigned int __softirq_pending; | 27 | unsigned int __softirq_pending; |
26 | unsigned int __nmi_count; /* number of NMI on this CPUs */ | 28 | unsigned int __nmi_count; /* number of NMI on this CPUs */ |
27 | short mmu_state; | 29 | short mmu_state; |
@@ -37,8 +39,7 @@ struct x8664_pda { | |||
37 | unsigned irq_spurious_count; | 39 | unsigned irq_spurious_count; |
38 | } ____cacheline_aligned_in_smp; | 40 | } ____cacheline_aligned_in_smp; |
39 | 41 | ||
40 | extern struct x8664_pda *_cpu_pda[]; | 42 | extern struct x8664_pda **_cpu_pda; |
41 | extern struct x8664_pda boot_cpu_pda[]; | ||
42 | extern void pda_init(int); | 43 | extern void pda_init(int); |
43 | 44 | ||
44 | #define cpu_pda(i) (_cpu_pda[i]) | 45 | #define cpu_pda(i) (_cpu_pda[i]) |
diff --git a/include/asm-x86/percpu.h b/include/asm-x86/percpu.h index 736fc3bb8e1e..912a3a17b9db 100644 --- a/include/asm-x86/percpu.h +++ b/include/asm-x86/percpu.h | |||
@@ -143,4 +143,50 @@ do { \ | |||
143 | #define x86_or_percpu(var, val) percpu_to_op("or", per_cpu__##var, val) | 143 | #define x86_or_percpu(var, val) percpu_to_op("or", per_cpu__##var, val) |
144 | #endif /* !__ASSEMBLY__ */ | 144 | #endif /* !__ASSEMBLY__ */ |
145 | #endif /* !CONFIG_X86_64 */ | 145 | #endif /* !CONFIG_X86_64 */ |
146 | |||
147 | #ifdef CONFIG_SMP | ||
148 | |||
149 | /* | ||
150 | * Define the "EARLY_PER_CPU" macros. These are used for some per_cpu | ||
151 | * variables that are initialized and accessed before there are per_cpu | ||
152 | * areas allocated. | ||
153 | */ | ||
154 | |||
155 | #define DEFINE_EARLY_PER_CPU(_type, _name, _initvalue) \ | ||
156 | DEFINE_PER_CPU(_type, _name) = _initvalue; \ | ||
157 | __typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \ | ||
158 | { [0 ... NR_CPUS-1] = _initvalue }; \ | ||
159 | __typeof__(_type) *_name##_early_ptr = _name##_early_map | ||
160 | |||
161 | #define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \ | ||
162 | EXPORT_PER_CPU_SYMBOL(_name) | ||
163 | |||
164 | #define DECLARE_EARLY_PER_CPU(_type, _name) \ | ||
165 | DECLARE_PER_CPU(_type, _name); \ | ||
166 | extern __typeof__(_type) *_name##_early_ptr; \ | ||
167 | extern __typeof__(_type) _name##_early_map[] | ||
168 | |||
169 | #define early_per_cpu_ptr(_name) (_name##_early_ptr) | ||
170 | #define early_per_cpu_map(_name, _idx) (_name##_early_map[_idx]) | ||
171 | #define early_per_cpu(_name, _cpu) \ | ||
172 | (early_per_cpu_ptr(_name) ? \ | ||
173 | early_per_cpu_ptr(_name)[_cpu] : \ | ||
174 | per_cpu(_name, _cpu)) | ||
175 | |||
176 | #else /* !CONFIG_SMP */ | ||
177 | #define DEFINE_EARLY_PER_CPU(_type, _name, _initvalue) \ | ||
178 | DEFINE_PER_CPU(_type, _name) = _initvalue | ||
179 | |||
180 | #define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \ | ||
181 | EXPORT_PER_CPU_SYMBOL(_name) | ||
182 | |||
183 | #define DECLARE_EARLY_PER_CPU(_type, _name) \ | ||
184 | DECLARE_PER_CPU(_type, _name) | ||
185 | |||
186 | #define early_per_cpu(_name, _cpu) per_cpu(_name, _cpu) | ||
187 | #define early_per_cpu_ptr(_name) NULL | ||
188 | /* no early_per_cpu_map() */ | ||
189 | |||
190 | #endif /* !CONFIG_SMP */ | ||
191 | |||
146 | #endif /* _ASM_X86_PERCPU_H_ */ | 192 | #endif /* _ASM_X86_PERCPU_H_ */ |
diff --git a/include/asm-x86/smp.h b/include/asm-x86/smp.h index 514e52b95cef..fc1007321ef6 100644 --- a/include/asm-x86/smp.h +++ b/include/asm-x86/smp.h | |||
@@ -29,21 +29,12 @@ extern int smp_num_siblings; | |||
29 | extern unsigned int num_processors; | 29 | extern unsigned int num_processors; |
30 | extern cpumask_t cpu_initialized; | 30 | extern cpumask_t cpu_initialized; |
31 | 31 | ||
32 | #ifdef CONFIG_SMP | ||
33 | extern u16 x86_cpu_to_apicid_init[]; | ||
34 | extern u16 x86_bios_cpu_apicid_init[]; | ||
35 | extern void *x86_cpu_to_apicid_early_ptr; | ||
36 | extern void *x86_bios_cpu_apicid_early_ptr; | ||
37 | #else | ||
38 | #define x86_cpu_to_apicid_early_ptr NULL | ||
39 | #define x86_bios_cpu_apicid_early_ptr NULL | ||
40 | #endif | ||
41 | |||
42 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); | 32 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); |
43 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); | 33 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); |
44 | DECLARE_PER_CPU(u16, cpu_llc_id); | 34 | DECLARE_PER_CPU(u16, cpu_llc_id); |
45 | DECLARE_PER_CPU(u16, x86_cpu_to_apicid); | 35 | |
46 | DECLARE_PER_CPU(u16, x86_bios_cpu_apicid); | 36 | DECLARE_EARLY_PER_CPU(u16, x86_cpu_to_apicid); |
37 | DECLARE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid); | ||
47 | 38 | ||
48 | /* Static state in head.S used to set up a CPU */ | 39 | /* Static state in head.S used to set up a CPU */ |
49 | extern struct { | 40 | extern struct { |
diff --git a/include/asm-x86/topology.h b/include/asm-x86/topology.h index dcf3f8131d6b..1f97758de4ab 100644 --- a/include/asm-x86/topology.h +++ b/include/asm-x86/topology.h | |||
@@ -35,79 +35,88 @@ | |||
35 | # endif | 35 | # endif |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | /* Node not present */ | ||
39 | #define NUMA_NO_NODE (-1) | ||
40 | |||
38 | #ifdef CONFIG_NUMA | 41 | #ifdef CONFIG_NUMA |
39 | #include <linux/cpumask.h> | 42 | #include <linux/cpumask.h> |
40 | #include <asm/mpspec.h> | 43 | #include <asm/mpspec.h> |
41 | 44 | ||
42 | /* Mappings between logical cpu number and node number */ | ||
43 | #ifdef CONFIG_X86_32 | 45 | #ifdef CONFIG_X86_32 |
44 | extern 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 | |||
50 | DECLARE_PER_CPU(int, x86_cpu_to_node_map); | ||
51 | |||
52 | #ifdef CONFIG_SMP | ||
53 | extern int x86_cpu_to_node_map_init[]; | ||
54 | extern void *x86_cpu_to_node_map_early_ptr; | ||
55 | #else | ||
56 | #define x86_cpu_to_node_map_early_ptr NULL | ||
57 | #endif | ||
58 | 46 | ||
47 | /* Mappings between node number and cpus on that node. */ | ||
59 | extern cpumask_t node_to_cpumask_map[]; | 48 | extern cpumask_t node_to_cpumask_map[]; |
60 | 49 | ||
61 | #define NUMA_NO_NODE (-1) | 50 | /* Mappings between logical cpu number and node number */ |
51 | extern int cpu_to_node_map[]; | ||
62 | 52 | ||
63 | /* Returns the number of the node containing CPU 'cpu' */ | 53 | /* 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) | ||
66 | static inline int cpu_to_node(int cpu) | 54 | static inline int cpu_to_node(int cpu) |
67 | { | 55 | { |
68 | return cpu_to_node_map[cpu]; | 56 | return cpu_to_node_map[cpu]; |
69 | } | 57 | } |
58 | #define early_cpu_to_node(cpu) cpu_to_node(cpu) | ||
70 | 59 | ||
71 | #else /* CONFIG_X86_64 */ | 60 | /* Returns a bitmask of CPUs on Node 'node'. */ |
72 | 61 | static inline cpumask_t node_to_cpumask(int node) | |
73 | #ifdef CONFIG_SMP | ||
74 | static inline int early_cpu_to_node(int cpu) | ||
75 | { | 62 | { |
76 | int *cpu_to_node_map = x86_cpu_to_node_map_early_ptr; | 63 | return node_to_cpumask_map[node]; |
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 | } | 64 | } |
85 | #else | ||
86 | #define early_cpu_to_node(cpu) cpu_to_node(cpu) | ||
87 | #endif | ||
88 | 65 | ||
66 | #else /* CONFIG_X86_64 */ | ||
67 | |||
68 | /* Mappings between node number and cpus on that node. */ | ||
69 | extern cpumask_t *node_to_cpumask_map; | ||
70 | |||
71 | /* Mappings between logical cpu number and node number */ | ||
72 | DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map); | ||
73 | |||
74 | /* Returns the number of the current Node. */ | ||
75 | #define numa_node_id() read_pda(nodenumber) | ||
76 | |||
77 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | ||
78 | extern int cpu_to_node(int cpu); | ||
79 | extern int early_cpu_to_node(int cpu); | ||
80 | extern cpumask_t *_node_to_cpumask_ptr(int node); | ||
81 | extern cpumask_t node_to_cpumask(int node); | ||
82 | |||
83 | #else /* !CONFIG_DEBUG_PER_CPU_MAPS */ | ||
84 | |||
85 | /* Returns the number of the node containing CPU 'cpu' */ | ||
89 | static inline int cpu_to_node(int cpu) | 86 | static inline int cpu_to_node(int cpu) |
90 | { | 87 | { |
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); | 88 | return per_cpu(x86_cpu_to_node_map, cpu); |
100 | } | 89 | } |
101 | 90 | ||
102 | #ifdef CONFIG_NUMA | 91 | /* Same function but used if called before per_cpu areas are setup */ |
92 | static inline int early_cpu_to_node(int cpu) | ||
93 | { | ||
94 | if (early_per_cpu_ptr(x86_cpu_to_node_map)) | ||
95 | return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu]; | ||
96 | |||
97 | return per_cpu(x86_cpu_to_node_map, cpu); | ||
98 | } | ||
103 | 99 | ||
104 | /* Returns a pointer to the cpumask of CPUs on Node 'node'. */ | 100 | /* Returns a pointer to the cpumask of CPUs on Node 'node'. */ |
101 | static inline cpumask_t *_node_to_cpumask_ptr(int node) | ||
102 | { | ||
103 | return &node_to_cpumask_map[node]; | ||
104 | } | ||
105 | |||
106 | /* Returns a bitmask of CPUs on Node 'node'. */ | ||
107 | static inline cpumask_t node_to_cpumask(int node) | ||
108 | { | ||
109 | return node_to_cpumask_map[node]; | ||
110 | } | ||
111 | |||
112 | #endif /* !CONFIG_DEBUG_PER_CPU_MAPS */ | ||
113 | |||
114 | /* Replace default node_to_cpumask_ptr with optimized version */ | ||
105 | #define node_to_cpumask_ptr(v, node) \ | 115 | #define node_to_cpumask_ptr(v, node) \ |
106 | cpumask_t *v = &(node_to_cpumask_map[node]) | 116 | cpumask_t *v = _node_to_cpumask_ptr(node) |
107 | 117 | ||
108 | #define node_to_cpumask_ptr_next(v, node) \ | 118 | #define node_to_cpumask_ptr_next(v, node) \ |
109 | v = &(node_to_cpumask_map[node]) | 119 | v = _node_to_cpumask_ptr(node) |
110 | #endif | ||
111 | 120 | ||
112 | #endif /* CONFIG_X86_64 */ | 121 | #endif /* CONFIG_X86_64 */ |
113 | 122 | ||
@@ -117,20 +126,6 @@ static inline int cpu_to_node(int cpu) | |||
117 | */ | 126 | */ |
118 | #define parent_node(node) (node) | 127 | #define parent_node(node) (node) |
119 | 128 | ||
120 | /* Returns a bitmask of CPUs on Node 'node'. */ | ||
121 | static 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'. */ | ||
127 | static 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) | 129 | #define pcibus_to_node(bus) __pcibus_to_node(bus) |
135 | #define pcibus_to_cpumask(bus) __pcibus_to_cpumask(bus) | 130 | #define pcibus_to_cpumask(bus) __pcibus_to_cpumask(bus) |
136 | 131 | ||
@@ -180,12 +175,44 @@ extern int __node_distance(int, int); | |||
180 | #define node_distance(a, b) __node_distance(a, b) | 175 | #define node_distance(a, b) __node_distance(a, b) |
181 | #endif | 176 | #endif |
182 | 177 | ||
183 | #else /* CONFIG_NUMA */ | 178 | #else /* !CONFIG_NUMA */ |
184 | 179 | ||
180 | #define numa_node_id() 0 | ||
181 | #define cpu_to_node(cpu) 0 | ||
182 | #define early_cpu_to_node(cpu) 0 | ||
183 | |||
184 | static inline cpumask_t *_node_to_cpumask_ptr(int node) | ||
185 | { | ||
186 | return &cpu_online_map; | ||
187 | } | ||
188 | static inline cpumask_t node_to_cpumask(int node) | ||
189 | { | ||
190 | return cpu_online_map; | ||
191 | } | ||
192 | static inline int node_to_first_cpu(int node) | ||
193 | { | ||
194 | return first_cpu(cpu_online_map); | ||
195 | } | ||
196 | |||
197 | /* Replace default node_to_cpumask_ptr with optimized version */ | ||
198 | #define node_to_cpumask_ptr(v, node) \ | ||
199 | cpumask_t *v = _node_to_cpumask_ptr(node) | ||
200 | |||
201 | #define node_to_cpumask_ptr_next(v, node) \ | ||
202 | v = _node_to_cpumask_ptr(node) | ||
185 | #endif | 203 | #endif |
186 | 204 | ||
187 | #include <asm-generic/topology.h> | 205 | #include <asm-generic/topology.h> |
188 | 206 | ||
207 | #ifdef CONFIG_NUMA | ||
208 | /* Returns the number of the first CPU on Node 'node'. */ | ||
209 | static inline int node_to_first_cpu(int node) | ||
210 | { | ||
211 | node_to_cpumask_ptr(mask, node); | ||
212 | return first_cpu(*mask); | ||
213 | } | ||
214 | #endif | ||
215 | |||
189 | extern cpumask_t cpu_coregroup_map(int cpu); | 216 | extern cpumask_t cpu_coregroup_map(int cpu); |
190 | 217 | ||
191 | #ifdef ENABLE_TOPO_DEFINES | 218 | #ifdef ENABLE_TOPO_DEFINES |
@@ -193,6 +220,9 @@ extern cpumask_t cpu_coregroup_map(int cpu); | |||
193 | #define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) | 220 | #define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) |
194 | #define topology_core_siblings(cpu) (per_cpu(cpu_core_map, cpu)) | 221 | #define topology_core_siblings(cpu) (per_cpu(cpu_core_map, cpu)) |
195 | #define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu)) | 222 | #define topology_thread_siblings(cpu) (per_cpu(cpu_sibling_map, cpu)) |
223 | |||
224 | /* indicates that pointers to the topology cpumask_t maps are valid */ | ||
225 | #define arch_provides_topology_pointers yes | ||
196 | #endif | 226 | #endif |
197 | 227 | ||
198 | static inline void arch_fix_phys_package_id(int num, u32 slot) | 228 | static inline void arch_fix_phys_package_id(int num, u32 slot) |
@@ -220,4 +250,4 @@ static inline void set_mp_bus_to_node(int busnum, int node) | |||
220 | } | 250 | } |
221 | #endif | 251 | #endif |
222 | 252 | ||
223 | #endif | 253 | #endif /* _ASM_X86_TOPOLOGY_H */ |
diff --git a/include/linux/mm.h b/include/linux/mm.h index e4de460907c1..3d647b24041f 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -1026,6 +1026,7 @@ extern void mem_init(void); | |||
1026 | extern void show_mem(void); | 1026 | extern void show_mem(void); |
1027 | extern void si_meminfo(struct sysinfo * val); | 1027 | extern void si_meminfo(struct sysinfo * val); |
1028 | extern void si_meminfo_node(struct sysinfo *val, int nid); | 1028 | extern void si_meminfo_node(struct sysinfo *val, int nid); |
1029 | extern int after_bootmem; | ||
1029 | 1030 | ||
1030 | #ifdef CONFIG_NUMA | 1031 | #ifdef CONFIG_NUMA |
1031 | extern void setup_per_cpu_pageset(void); | 1032 | extern void setup_per_cpu_pageset(void); |