2006-10-27 08:34:12

by mel

[permalink] [raw]
Subject: [PATCH] Calculation fix for memory holes beyong the end of physical memory

absent_pages_in_range() made the assumption that users of the arch-independent
zone-sizing API would not care about holes beyound the end of physical memory.
This was not the case and was "fixed" in a patch called "Account for holes
that are outside the range of physical memory". However, when given a range
that started before a hole in "real" memory and ended beyond the end of memory,
it would get the result wrong. The bug is in mainline but a patch is below.

It has been tested successfully on a number of machines and
architectures. Additional credit to Keith Mannthey for discovering the problem,
helping identify the correct fix and confirming it Worked For Him.

Signed-off-by: Mel Gorman <[email protected]>
---
diff -rup -X /usr/src/patchset-0.6/bin//dontdiff linux-2.6.19-rc2-mm2-clean/mm/page_alloc.c linux-2.6.19-rc2-mm2-fix_hole_pages/mm/page_alloc.c
--- linux-2.6.19-rc2-mm2-clean/mm/page_alloc.c 2006-10-23 09:53:24.000000000 +0100
+++ linux-2.6.19-rc2-mm2-fix_hole_pages/mm/page_alloc.c 2006-10-26 10:33:30.000000000 +0100
@@ -2511,7 +2511,7 @@ unsigned long __init __absent_pages_in_r

/* Account for ranges past physical memory on this node */
if (range_end_pfn > prev_end_pfn)
- hole_pages = range_end_pfn -
+ hole_pages += range_end_pfn -
max(range_start_pfn, prev_end_pfn);

return hole_pages;