diff -urNp ref/mm/bootmem.c 2.4.20pre5aa1/mm/bootmem.c
--- ref/mm/bootmem.c	Thu Aug 29 02:13:21 2002
+++ 2.4.20pre5aa1/mm/bootmem.c	Thu Aug 29 20:40:37 2002
@@ -246,14 +246,15 @@ static unsigned long __init free_all_boo
 {
 	struct page *page = pgdat->node_mem_map;
 	bootmem_data_t *bdata = pgdat->bdata;
-	unsigned long i, count, total = 0;
-	unsigned long idx;
+	unsigned long count, total = 0;
+	long idx, i;
 
 	if (!bdata->node_bootmem_map) BUG();
 
 	count = 0;
 	idx = bdata->node_low_pfn - (bdata->node_boot_start >> PAGE_SHIFT);
-	for (i = 0; i < idx; i++, page++) {
+	page += --idx;
+	for (i = idx; i >= 0; i--, page--) {
 		if (!test_bit(i, bdata->node_bootmem_map)) {
 			count++;
 			ClearPageReserved(page);
@@ -269,7 +270,9 @@ static unsigned long __init free_all_boo
 	 */
 	page = virt_to_page(bdata->node_bootmem_map);
 	count = 0;
-	for (i = 0; i < ((bdata->node_low_pfn-(bdata->node_boot_start >> PAGE_SHIFT))/8 + PAGE_SIZE-1)/PAGE_SIZE; i++,page++) {
+	idx = ((bdata->node_low_pfn-(bdata->node_boot_start >> PAGE_SHIFT))/8 + PAGE_SIZE-1)/PAGE_SIZE;
+	page += --idx;
+	for (i = idx; i >= 0; i--, page--) {
 		count++;
 		ClearPageReserved(page);
 		set_page_count(page, 1);
