Messages in this thread Patches in this message | | | Date | Sat, 26 Apr 2008 22:07:08 +0200 | From | Ingo Molnar <> | Subject | Re: [git pull] "big box" x86 changes, bootmem/sparsemem |
| |
* Linus Torvalds <torvalds@linux-foundation.org> wrote:
> Having preprocessor conditionals that mix things up is not an excuse, > and it might be an argument for not doing the conditional that way (ie > maybe just make sure that when NUMA is not on, nid/next_nid will > always be different, and in a way that the compiler can perhaps see > statically that they are different - so that you can have the > conditional there even with NUMA off, but the compiler will just fold > it away?).
for now i cleaned it up the way below, but i also queued up a cleanup patch separately (second patch attached below) that removes the #ifdef. The current version is the tested one so i'll keep that in the tree and will treat the cleanup separately.
Ingo
------------------------> Subject: x86_64: make reserve_bootmem_generic() use new reserve_bootmem() From: Yinghai Lu <yhlu.kernel@gmail.com> Date: Tue, 18 Mar 2008 12:50:21 -0700
"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> --- arch/x86/mm/init_64.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
Index: linux-x86.q/arch/x86/mm/init_64.c =================================================================== --- linux-x86.q.orig/arch/x86/mm/init_64.c +++ linux-x86.q/arch/x86/mm/init_64.c @@ -810,7 +810,7 @@ void free_initrd_mem(unsigned long start void __init reserve_bootmem_generic(unsigned long phys, unsigned len) { #ifdef CONFIG_NUMA - int nid = phys_to_nid(phys); + int nid, next_nid; #endif unsigned long pfn = phys >> PAGE_SHIFT; @@ -829,10 +829,16 @@ void __init reserve_bootmem_generic(unsi /* Should check here against the e820 map to avoid double free */ #ifdef CONFIG_NUMA - reserve_bootmem_node(NODE_DATA(nid), phys, len, BOOTMEM_DEFAULT); + nid = phys_to_nid(phys); + next_nid = phys_to_nid(phys + len - 1); + if (nid == next_nid) + reserve_bootmem_node(NODE_DATA(nid), phys, len, BOOTMEM_DEFAULT); + else + reserve_bootmem(phys, len, BOOTMEM_DEFAULT); #else reserve_bootmem(phys, len, BOOTMEM_DEFAULT); #endif + if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) { dma_reserve += len / PAGE_SIZE; set_dma_reserve(dma_reserve); -------------> Subject: x86: reserve bootmem cleanup From: Ingo Molnar <mingo@elte.hu> Date: Sat Apr 26 21:50:20 CEST 2008 Signed-off-by: Ingo Molnar <mingo@elte.hu> --- arch/x86/mm/init_64.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) Index: linux-x86.q/arch/x86/mm/init_64.c =================================================================== --- linux-x86.q.orig/arch/x86/mm/init_64.c +++ linux-x86.q/arch/x86/mm/init_64.c @@ -810,10 +810,8 @@ void free_initrd_mem(unsigned long start void __init reserve_bootmem_generic(unsigned long phys, unsigned len) { -#ifdef CONFIG_NUMA - int nid, next_nid; -#endif unsigned long pfn = phys >> PAGE_SHIFT; + int nid, next_nid; if (pfn >= end_pfn) { /* @@ -829,16 +827,12 @@ void __init reserve_bootmem_generic(unsi } /* Should check here against the e820 map to avoid double free */ -#ifdef CONFIG_NUMA nid = phys_to_nid(phys); next_nid = phys_to_nid(phys + len - 1); if (nid == next_nid) reserve_bootmem_node(NODE_DATA(nid), phys, len, BOOTMEM_DEFAULT); else reserve_bootmem(phys, len, BOOTMEM_DEFAULT); -#else - reserve_bootmem(phys, len, BOOTMEM_DEFAULT); -#endif if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) { dma_reserve += len / PAGE_SIZE;
| |