fix free_all_bootmem_core for virtual memmap
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; ) {
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; ) {