[PATCH] x86-64: Reverse order of bootmem lists
Andi Kleen [Mon, 12 Sep 2005 16:49:24 +0000 (18:49 +0200)]
This leads to bootmem allocating first from node 0 instead
of from the last node.  This avoids swiotlb allocating on the last node, which
doesn't really work on a machine with >4GB.

Note: there is a better patch around from someone else that gets
rid of the pgdat list completely.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

mm/bootmem.c

index c1330cc..8ec4e4c 100644 (file)
@@ -61,9 +61,17 @@ static unsigned long __init init_bootmem_core (pg_data_t *pgdat,
 {
        bootmem_data_t *bdata = pgdat->bdata;
        unsigned long mapsize = ((end - start)+7)/8;
-
-       pgdat->pgdat_next = pgdat_list;
-       pgdat_list = pgdat;
+       static struct pglist_data *pgdat_last;
+
+       pgdat->pgdat_next = NULL;
+       /* Add new nodes last so that bootmem always starts
+          searching in the first nodes, not the last ones */
+       if (pgdat_last)
+               pgdat_last->pgdat_next = pgdat;
+       else {
+               pgdat_list = pgdat;     
+               pgdat_last = pgdat;
+       }
 
        mapsize = ALIGN(mapsize, sizeof(long));
        bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT);