Skip to content

Commit

Permalink
Allow nodes to exist that only contain ZONE_MOVABLE
Browse files Browse the repository at this point in the history
With the introduction of kernelcore=, a configurable zone is created on
request.  In some cases, this value will be small enough that some nodes
contain only ZONE_MOVABLE.  On some NUMA configurations when this occurs,
arch-independent zone-sizing will get the size of the memory holes within
the node incorrect.  The value of present_pages goes negative and the boot
fails.

This patch fixes the bug in the calculation of the size of the hole.  The
test case is to boot test a NUMA machine with a low value of kernelcore=
before and after the patch is applied.  While this bug exists in early
kernel it cannot be triggered in practice.

This patch has been boot-tested on a variety machines with and without
kernelcore= set.

Signed-off-by: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Mel Gorman authored and Linus Torvalds committed Jul 26, 2007
1 parent ee2077d commit b5445f9
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions mm/page_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2775,11 +2775,11 @@ unsigned long __meminit __absent_pages_in_range(int nid,
if (i == -1)
return 0;

prev_end_pfn = min(early_node_map[i].start_pfn, range_end_pfn);

/* 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;
hole_pages = prev_end_pfn - range_start_pfn;

/* Find all holes for the zone within the node */
for (; i != -1; i = next_active_region_index_in_nid(i, nid)) {
Expand Down

0 comments on commit b5445f9

Please sign in to comment.