diff options
-rw-r--r-- | arch/ia64/mm/numa.c | 15 | ||||
-rw-r--r-- | mm/page_alloc.c | 15 |
2 files changed, 28 insertions, 2 deletions
diff --git a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c index def782e31aac..4248492b9321 100644 --- a/arch/ia64/mm/numa.c +++ b/arch/ia64/mm/numa.c | |||
@@ -61,13 +61,26 @@ paddr_to_nid(unsigned long paddr) | |||
61 | int __meminit __early_pfn_to_nid(unsigned long pfn) | 61 | int __meminit __early_pfn_to_nid(unsigned long pfn) |
62 | { | 62 | { |
63 | int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec; | 63 | int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec; |
64 | /* | ||
65 | * NOTE: The following SMP-unsafe globals are only used early in boot | ||
66 | * when the kernel is running single-threaded. | ||
67 | */ | ||
68 | static int __meminitdata last_ssec, last_esec; | ||
69 | static int __meminitdata last_nid; | ||
70 | |||
71 | if (section >= last_ssec && section < last_esec) | ||
72 | return last_nid; | ||
64 | 73 | ||
65 | for (i = 0; i < num_node_memblks; i++) { | 74 | for (i = 0; i < num_node_memblks; i++) { |
66 | ssec = node_memblk[i].start_paddr >> PA_SECTION_SHIFT; | 75 | ssec = node_memblk[i].start_paddr >> PA_SECTION_SHIFT; |
67 | esec = (node_memblk[i].start_paddr + node_memblk[i].size + | 76 | esec = (node_memblk[i].start_paddr + node_memblk[i].size + |
68 | ((1L << PA_SECTION_SHIFT) - 1)) >> PA_SECTION_SHIFT; | 77 | ((1L << PA_SECTION_SHIFT) - 1)) >> PA_SECTION_SHIFT; |
69 | if (section >= ssec && section < esec) | 78 | if (section >= ssec && section < esec) { |
79 | last_ssec = ssec; | ||
80 | last_esec = esec; | ||
81 | last_nid = node_memblk[i].nid; | ||
70 | return node_memblk[i].nid; | 82 | return node_memblk[i].nid; |
83 | } | ||
71 | } | 84 | } |
72 | 85 | ||
73 | return -1; | 86 | return -1; |
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 | } |