diff options
author | Yinghai Lu <yhlu.kernel@gmail.com> | 2008-03-18 15:50:21 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-26 16:51:08 -0400 |
commit | 8b3cd09ed23049fcb02479c6286744b36324ac9d (patch) | |
tree | cc775b442750533d9854466a8da58088349b5d5b /arch/x86/mm/init_64.c | |
parent | a5645a61b3b7e7d7de15e1a642ead600150ce94d (diff) |
x86_64: make reserve_bootmem_generic() use new reserve_bootmem()
"mm: make reserve_bootmem can crossed the nodes" provides new
reserve_bootmem(), let reserve_bootmem_generic() use that.
reserve_bootmem_generic() is used to reserve initramdisk, so this way
we can make sure even when bootloader or kexec load ranges cross the
node memory boundaries, reserve_bootmem still works.
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/mm/init_64.c')
-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); |