Skip to content

Commit

Permalink
[PATCH] Account for holes that are outside the range of physical memory
Browse files Browse the repository at this point in the history
absent_pages_in_range() made the assumption that users of the API would not
care about holes beyound the end of physical memory.  This was not the
case.  This patch will account for ranges outside of physical memory as
holes correctly.

Cc: Dave Hansen <haveblue@us.ibm.com>
Cc: Andy Whitcroft <apw@shadowen.org>
Cc: Andi Kleen <ak@muc.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: "Keith Mannthey" <kmannth@gmail.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Yasunori Goto <y-goto@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Mel Gorman authored and Linus Torvalds committed Sep 27, 2006
1 parent 0e0b864 commit 9c7cd68
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
4 changes: 3 additions & 1 deletion arch/x86_64/mm/srat.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,9 @@ static int reserve_hotadd(int node, unsigned long start, unsigned long end)

/* This check might be a bit too strict, but I'm keeping it for now. */
if (absent_pages_in_range(s_pfn, e_pfn) != e_pfn - s_pfn) {
printk(KERN_ERR "SRAT: Hotplug area has existing memory\n");
printk(KERN_ERR
"SRAT: Hotplug area %lu -> %lu has existing memory\n",
s_pfn, e_pfn);
return -1;
}

Expand Down
22 changes: 19 additions & 3 deletions mm/page_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2168,6 +2168,10 @@ unsigned long __init __absent_pages_in_range(int nid,
if (i == -1)
return 0;

/* Account for ranges before physical memory on this node */
if (early_node_map[i].start_pfn > range_start_pfn)
hole_pages = early_node_map[i].start_pfn - range_start_pfn;

prev_end_pfn = early_node_map[i].start_pfn;

/* Find all holes for the zone within the node */
Expand All @@ -2189,6 +2193,11 @@ unsigned long __init __absent_pages_in_range(int nid,
prev_end_pfn = early_node_map[i].end_pfn;
}

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

return hole_pages;
}

Expand All @@ -2210,9 +2219,16 @@ unsigned long __init zone_absent_pages_in_node(int nid,
unsigned long zone_type,
unsigned long *ignored)
{
return __absent_pages_in_range(nid,
arch_zone_lowest_possible_pfn[zone_type],
arch_zone_highest_possible_pfn[zone_type]);
unsigned long node_start_pfn, node_end_pfn;
unsigned long zone_start_pfn, zone_end_pfn;

get_pfn_range_for_nid(nid, &node_start_pfn, &node_end_pfn);
zone_start_pfn = max(arch_zone_lowest_possible_pfn[zone_type],
node_start_pfn);
zone_end_pfn = min(arch_zone_highest_possible_pfn[zone_type],
node_end_pfn);

return __absent_pages_in_range(nid, zone_start_pfn, zone_end_pfn);
}

/* Return the zone index a PFN is in */
Expand Down

0 comments on commit 9c7cd68

Please sign in to comment.