I think I found it.
This check is backwards and probably made your boot fail.
Changed this to break, because we don't need to search any further if
the current node already starts at/above the limit (remember, we walk a
list sorted by ->node_boot_start here).
I also made the checks more intuitively understandable.
Could you try the following fix on top of this patch?
Hannes
--- a/mm/bootmem.c
+++ b/mm/bootmem.c
@@ -513,10 +513,10 @@ restart:
list_for_each_entry(bdata, &bdata_list, list) {
void *region;
- if (goal && goal < bdata->node_boot_start)
- continue;
- if (limit && limit < bdata->node_boot_start)
+ if (goal && bdata->node_low_pfn <= PFN_DOWN(goal))
continue;
+ if (limit && bdata->node_boot_start >= limit)
+ break;
region = alloc_bootmem_core(bdata, size, align, goal, limit);
if (region)
--