diff options
Diffstat (limited to 'arch/x86/mm')
-rw-r--r-- | arch/x86/mm/init_64.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 0cca62663037..7dc4fbc2d6b0 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -810,7 +810,7 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
810 | void __init reserve_bootmem_generic(unsigned long phys, unsigned len) | 810 | void __init reserve_bootmem_generic(unsigned long phys, unsigned len) |
811 | { | 811 | { |
812 | #ifdef CONFIG_NUMA | 812 | #ifdef CONFIG_NUMA |
813 | int nid = phys_to_nid(phys); | 813 | int nid, next_nid; |
814 | #endif | 814 | #endif |
815 | unsigned long pfn = phys >> PAGE_SHIFT; | 815 | unsigned long pfn = phys >> PAGE_SHIFT; |
816 | 816 | ||
@@ -829,10 +829,16 @@ void __init reserve_bootmem_generic(unsigned long phys, unsigned len) | |||
829 | 829 | ||
830 | /* Should check here against the e820 map to avoid double free */ | 830 | /* Should check here against the e820 map to avoid double free */ |
831 | #ifdef CONFIG_NUMA | 831 | #ifdef CONFIG_NUMA |
832 | reserve_bootmem_node(NODE_DATA(nid), phys, len, BOOTMEM_DEFAULT); | 832 | nid = phys_to_nid(phys); |
833 | next_nid = phys_to_nid(phys + len - 1); | ||
834 | if (nid == next_nid) | ||
835 | reserve_bootmem_node(NODE_DATA(nid), phys, len, BOOTMEM_DEFAULT); | ||
836 | else | ||
837 | reserve_bootmem(phys, len, BOOTMEM_DEFAULT); | ||
833 | #else | 838 | #else |
834 | reserve_bootmem(phys, len, BOOTMEM_DEFAULT); | 839 | reserve_bootmem(phys, len, BOOTMEM_DEFAULT); |
835 | #endif | 840 | #endif |
841 | |||
836 | if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) { | 842 | if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) { |
837 | dma_reserve += len / PAGE_SIZE; | 843 | dma_reserve += len / PAGE_SIZE; |
838 | set_dma_reserve(dma_reserve); | 844 | set_dma_reserve(dma_reserve); |