diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index b54c5cbf0200..5a234b64f3ac 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -4187,10 +4187,23 @@ int __meminit __early_pfn_to_nid(unsigned long pfn) | |||
4187 | { | 4187 | { |
4188 | unsigned long start_pfn, end_pfn; | 4188 | unsigned long start_pfn, end_pfn; |
4189 | int i, nid; | 4189 | int i, nid; |
4190 | /* | ||
4191 | * NOTE: The following SMP-unsafe globals are only used early in boot | ||
4192 | * when the kernel is running single-threaded. | ||
4193 | */ | ||
4194 | static unsigned long __meminitdata last_start_pfn, last_end_pfn; | ||
4195 | static int __meminitdata last_nid; | ||
4196 | |||
4197 | if (last_start_pfn <= pfn && pfn < last_end_pfn) | ||
4198 | return last_nid; | ||
4190 | 4199 | ||
4191 | for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, &nid) | 4200 | for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, &nid) |
4192 | if (start_pfn <= pfn && pfn < end_pfn) | 4201 | if (start_pfn <= pfn && pfn < end_pfn) { |
4202 | last_start_pfn = start_pfn; | ||
4203 | last_end_pfn = end_pfn; | ||
4204 | last_nid = nid; | ||
4193 | return nid; | 4205 | return nid; |
4206 | } | ||
4194 | /* This is a memory hole */ | 4207 | /* This is a memory hole */ |
4195 | return -1; | 4208 | return -1; |
4196 | } | 4209 | } |