11
11
#include <linux/mmzone.h>
12
12
#include <linux/export.h>
13
13
#include <linux/nodemask.h>
14
+ #include <linux/numa_memblks.h>
14
15
#include <linux/swap.h>
15
16
#include <linux/memblock.h>
16
17
#include <linux/pfn.h>
29
30
#include "legacy_boot.h"
30
31
31
32
int numa_off ;
32
- unsigned char node_distances [MAX_NUMNODES ][MAX_NUMNODES ];
33
- EXPORT_SYMBOL (node_distances );
34
-
35
- static struct numa_meminfo numa_meminfo ;
36
33
cpumask_t cpus_on_node [MAX_NUMNODES ];
37
34
cpumask_t phys_cpus_on_node [MAX_NUMNODES ];
38
35
EXPORT_SYMBOL (cpus_on_node );
@@ -45,8 +42,6 @@ s16 __cpuid_to_node[CONFIG_NR_CPUS] = {
45
42
};
46
43
EXPORT_SYMBOL (__cpuid_to_node );
47
44
48
- nodemask_t numa_nodes_parsed __initdata ;
49
-
50
45
#ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA
51
46
unsigned long __per_cpu_offset [NR_CPUS ] __read_mostly ;
52
47
EXPORT_SYMBOL (__per_cpu_offset );
@@ -147,48 +142,6 @@ void numa_remove_cpu(unsigned int cpu)
147
142
cpumask_clear_cpu (cpu , & cpus_on_node [nid ]);
148
143
}
149
144
150
- static int __init numa_add_memblk_to (int nid , u64 start , u64 end ,
151
- struct numa_meminfo * mi )
152
- {
153
- /* ignore zero length blks */
154
- if (start == end )
155
- return 0 ;
156
-
157
- /* whine about and ignore invalid blks */
158
- if (start > end || nid < 0 || nid >= MAX_NUMNODES ) {
159
- pr_warn ("NUMA: Warning: invalid memblk node %d [mem %#010Lx-%#010Lx]\n" ,
160
- nid , start , end - 1 );
161
- return 0 ;
162
- }
163
-
164
- if (mi -> nr_blks >= NR_NODE_MEMBLKS ) {
165
- pr_err ("NUMA: too many memblk ranges\n" );
166
- return - EINVAL ;
167
- }
168
-
169
- mi -> blk [mi -> nr_blks ].start = PFN_ALIGN (start );
170
- mi -> blk [mi -> nr_blks ].end = PFN_ALIGN (end - PAGE_SIZE + 1 );
171
- mi -> blk [mi -> nr_blks ].nid = nid ;
172
- mi -> nr_blks ++ ;
173
- return 0 ;
174
- }
175
-
176
- /**
177
- * numa_add_memblk - Add one numa_memblk to numa_meminfo
178
- * @nid: NUMA node ID of the new memblk
179
- * @start: Start address of the new memblk
180
- * @end: End address of the new memblk
181
- *
182
- * Add a new memblk to the default numa_meminfo.
183
- *
184
- * RETURNS:
185
- * 0 on success, -errno on failure.
186
- */
187
- int __init numa_add_memblk (int nid , u64 start , u64 end )
188
- {
189
- return numa_add_memblk_to (nid , start , end , & numa_meminfo );
190
- }
191
-
192
145
static void __init node_mem_init (unsigned int node )
193
146
{
194
147
unsigned long start_pfn , end_pfn ;
@@ -207,18 +160,6 @@ static void __init node_mem_init(unsigned int node)
207
160
208
161
#ifdef CONFIG_ACPI_NUMA
209
162
210
- static void __init add_node_intersection (u32 node , u64 start , u64 size , u32 type )
211
- {
212
- static unsigned long num_physpages ;
213
-
214
- num_physpages += (size >> PAGE_SHIFT );
215
- pr_info ("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx Bytes\n" ,
216
- node , type , start , size );
217
- pr_info (" start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n" ,
218
- start >> PAGE_SHIFT , (start + size ) >> PAGE_SHIFT , num_physpages );
219
- memblock_set_node (start , size , & memblock .memory , node );
220
- }
221
-
222
163
/*
223
164
* add_numamem_region
224
165
*
@@ -230,28 +171,21 @@ static void __init add_node_intersection(u32 node, u64 start, u64 size, u32 type
230
171
*/
231
172
static void __init add_numamem_region (u64 start , u64 end , u32 type )
232
173
{
233
- u32 i ;
234
- u64 ofs = start ;
174
+ u32 node = pa_to_nid (start );
175
+ u64 size = end - start ;
176
+ static unsigned long num_physpages ;
235
177
236
178
if (start >= end ) {
237
179
pr_debug ("Invalid region: %016llx-%016llx\n" , start , end );
238
180
return ;
239
181
}
240
182
241
- for (i = 0 ; i < numa_meminfo .nr_blks ; i ++ ) {
242
- struct numa_memblk * mb = & numa_meminfo .blk [i ];
243
-
244
- if (ofs > mb -> end )
245
- continue ;
246
-
247
- if (end > mb -> end ) {
248
- add_node_intersection (mb -> nid , ofs , mb -> end - ofs , type );
249
- ofs = mb -> end ;
250
- } else {
251
- add_node_intersection (mb -> nid , ofs , end - ofs , type );
252
- break ;
253
- }
254
- }
183
+ num_physpages += (size >> PAGE_SHIFT );
184
+ pr_info ("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx Bytes\n" ,
185
+ node , type , start , size );
186
+ pr_info (" start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n" ,
187
+ start >> PAGE_SHIFT , end >> PAGE_SHIFT , num_physpages );
188
+ memblock_set_node (start , size , & memblock .memory , node );
255
189
}
256
190
257
191
static void __init init_node_memblock (void )
@@ -293,24 +227,6 @@ static void __init init_node_memblock(void)
293
227
}
294
228
}
295
229
296
- static void __init numa_default_distance (void )
297
- {
298
- int row , col ;
299
-
300
- for (row = 0 ; row < MAX_NUMNODES ; row ++ )
301
- for (col = 0 ; col < MAX_NUMNODES ; col ++ ) {
302
- if (col == row )
303
- node_distances [row ][col ] = LOCAL_DISTANCE ;
304
- else
305
- /* We assume that one node per package here!
306
- *
307
- * A SLIT should be used for multiple nodes
308
- * per package to override default setting.
309
- */
310
- node_distances [row ][col ] = REMOTE_DISTANCE ;
311
- }
312
- }
313
-
314
230
/*
315
231
* fake_numa_init() - For Non-ACPI systems
316
232
* Return: 0 on success, -errno on failure.
@@ -335,11 +251,11 @@ int __init init_numa_memory(void)
335
251
for (i = 0 ; i < NR_CPUS ; i ++ )
336
252
set_cpuid_to_node (i , NUMA_NO_NODE );
337
253
338
- numa_default_distance ();
254
+ numa_reset_distance ();
339
255
nodes_clear (numa_nodes_parsed );
340
256
nodes_clear (node_possible_map );
341
257
nodes_clear (node_online_map );
342
- memset ( & numa_meminfo , 0 , sizeof ( numa_meminfo ));
258
+ WARN_ON ( memblock_clear_hotplug ( 0 , PHYS_ADDR_MAX ));
343
259
344
260
/* Parse SRAT and SLIT if provided by firmware. */
345
261
ret = acpi_disabled ? fake_numa_init () : acpi_numa_init ();
0 commit comments