diff options
| -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); |
