Skip to contentSkip to conversation

fix free_all_bootmem_core for virtual memmap

PATCH In review Jesse Barnes 1 participant 2 messages Aug 4, 2003 Memory management

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix free_all_bootmem_core for virtual memmap

Currently, free_all_bootmem_core() assumes that the bdata for a given node will begin where the node's memory map begins. This isn't necessarily true on machines that use a virtual memory map (e.g. ia64 discontig machines), so we fix page to point to the first actual page of RAM on the node, which _does_ contain the bdata struct.

Thanks,
Jesse

===== mm/bootmem.c 1.20 vs edited =====

mm/bootmem.c +3 -1
@@ -267,7 +267,7 @@
 
 static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat)
 {
-	struct page *page = pgdat->node_mem_map;
+	struct page *page;
 	bootmem_data_t *bdata = pgdat->bdata;
 	unsigned long i, count, total = 0;
 	unsigned long idx;
@@ -276,6 +276,8 @@
 	if (!bdata->node_bootmem_map) BUG();
 
 	count = 0;
+	/* first existant page of the node */
+	page = virt_to_page(phys_to_virt(bdata->node_boot_start));
 	idx = bdata->node_low_pfn - (bdata->node_boot_start >> PAGE_SHIFT);
 	map = bdata->node_bootmem_map;
 	for (i = 0; i < idx; ) {
#1 lore raw
Quoted 5 lines · jbarnes

Currently, free_all_bootmem_core() assumes that the bdata for a given node will begin where the node's memory map begins. This isn't necessarily true on machines that use a virtual memory map (e.g. ia64 discontig machines), so we fix page to point to the first actual page of RAM on the node, which _does_ contain the bdata struct.

Oops, fix a spelling error.

Jesse

===== mm/bootmem.c 1.20 vs edited =====

mm/bootmem.c +3 -1
@@ -267,7 +267,7 @@
 
 static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat)
 {
-	struct page *page = pgdat->node_mem_map;
+	struct page *page;
 	bootmem_data_t *bdata = pgdat->bdata;
 	unsigned long i, count, total = 0;
 	unsigned long idx;
@@ -276,6 +276,8 @@
 	if (!bdata->node_bootmem_map) BUG();
 
 	count = 0;
+	/* first extant page of the node */
+	page = virt_to_page(phys_to_virt(bdata->node_boot_start));
 	idx = bdata->node_low_pfn - (bdata->node_boot_start >> PAGE_SHIFT);
 	map = bdata->node_bootmem_map;
 	for (i = 0; i < idx; ) {