login
Header Space

 
 

[PATCH 10/12] x86_64: make reserve_bootmem_generic to use new reserve_bootmem

Score:
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Andrew Morton <akpm@...>, Ingo Molnar <mingo@...>
Cc: Christoph Lameter <clameter@...>, kernel list <linux-kernel@...>
Date: Wednesday, March 19, 2008 - 5:04 pm

[PATCH] x86_64: make reserve_bootmem_generic to use new reserve_bootmem

	[PATCH] mm: make reserve_bootmem can crossed the nodes

provides new resever_bootmem, let reserve_bootmem_generic use that.

acctualy reserve_bootme_generic is used to reserve initramdisk.
so we can make sure even bootloader or kexec load that cross the nodes, reserve_bootmem
still works.

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>


Index: linux-2.6/arch/x86/mm/init_64.c
===================================================================
--- linux-2.6.orig/arch/x86/mm/init_64.c
+++ linux-2.6/arch/x86/mm/init_64.c
@@ -648,7 +648,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;
 
@@ -667,10 +667,14 @@ 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
 #endif
+	reserve_bootmem(phys, len, BOOTMEM_DEFAULT);
+
 	if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) {
 		dma_reserve += len / PAGE_SIZE;
 		set_dma_reserve(dma_reserve);
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 10/12] x86_64: make reserve_bootmem_generic to use ne..., Yinghai Lu, (Wed Mar 19, 5:04 pm)
speck-geostationary