From: Andy Whitcroft It isn't correct to call pfn_to_page when the pfn_valid test fails. This can happen when there are holes in physical memory. SPARSEMEM generates a bogus VA which isn't accessed and EXTREME SPARSEMEM OOPs. Signed-off-by: Bob Picco Signed-off-by: Andy Whitcroft Signed-off-by: Andrew Morton --- mm/bootmem.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff -puN mm/bootmem.c~sparsemem-memory-model-fix-6 mm/bootmem.c --- 25/mm/bootmem.c~sparsemem-memory-model-fix-6 2005-06-09 04:34:37.000000000 -0700 +++ 25-akpm/mm/bootmem.c 2005-06-09 04:34:37.000000000 -0700 @@ -277,11 +277,10 @@ static unsigned long __init free_all_boo for (i = 0; i < idx; ) { unsigned long v = ~map[i / BITS_PER_LONG]; - page = pfn_to_page(pfn); - if (gofast && v == ~0UL) { int j, order; + page = pfn_to_page(pfn); count += BITS_PER_LONG; __ClearPageReserved(page); order = ffs(BITS_PER_LONG) - 1; @@ -296,6 +295,8 @@ static unsigned long __init free_all_boo page += BITS_PER_LONG; } else if (v) { unsigned long m; + + page = pfn_to_page(pfn); for (m = 1; m && i < idx; m<<=1, page++, i++) { if (v & m) { count++; _