diff options
Diffstat (limited to 'arch/x86/mm/numa_64.c')
-rw-r--r-- | arch/x86/mm/numa_64.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index 3232148756ce..02f13cb99bc2 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
@@ -163,14 +163,27 @@ static void * __init early_node_mem(int nodeid, unsigned long start, | |||
163 | unsigned long end, unsigned long size, | 163 | unsigned long end, unsigned long size, |
164 | unsigned long align) | 164 | unsigned long align) |
165 | { | 165 | { |
166 | unsigned long mem = find_e820_area(start, end, size, align); | 166 | unsigned long mem; |
167 | 167 | ||
168 | /* | ||
169 | * put it on high as possible | ||
170 | * something will go with NODE_DATA | ||
171 | */ | ||
172 | if (start < (MAX_DMA_PFN<<PAGE_SHIFT)) | ||
173 | start = MAX_DMA_PFN<<PAGE_SHIFT; | ||
174 | if (start < (MAX_DMA32_PFN<<PAGE_SHIFT) && | ||
175 | end > (MAX_DMA32_PFN<<PAGE_SHIFT)) | ||
176 | start = MAX_DMA32_PFN<<PAGE_SHIFT; | ||
177 | mem = find_e820_area(start, end, size, align); | ||
168 | if (mem != -1L) | 178 | if (mem != -1L) |
169 | return __va(mem); | 179 | return __va(mem); |
170 | 180 | ||
171 | 181 | /* extend the search scope */ | |
172 | start = __pa(MAX_DMA_ADDRESS); | 182 | end = max_pfn_mapped << PAGE_SHIFT; |
173 | end = max_low_pfn_mapped << PAGE_SHIFT; | 183 | if (end > (MAX_DMA32_PFN<<PAGE_SHIFT)) |
184 | start = MAX_DMA32_PFN<<PAGE_SHIFT; | ||
185 | else | ||
186 | start = MAX_DMA_PFN<<PAGE_SHIFT; | ||
174 | mem = find_e820_area(start, end, size, align); | 187 | mem = find_e820_area(start, end, size, align); |
175 | if (mem != -1L) | 188 | if (mem != -1L) |
176 | return __va(mem); | 189 | return __va(mem); |