Commit a6af2bc3 authored by Mel Gorman's avatar Mel Gorman Committed by Linus Torvalds

[PATCH] Avoid excessive sorting of early_node_map[]

find_min_pfn_for_node() and find_min_pfn_with_active_regions() sort
early_node_map[] on every call.  This is an excessive amount of sorting and
that can be avoided.  This patch always searches the whole early_node_map[]
in find_min_pfn_for_node() instead of returning the first value found.  The
map is then only sorted once when required.  Successfully boot tested on a
number of machines.

[akpm@osdl.org: cleanup]
Signed-off-by: default avatarMel Gorman <mel@csn.ul.ie>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e10a4437
...@@ -2877,20 +2877,23 @@ static void __init sort_node_map(void) ...@@ -2877,20 +2877,23 @@ static void __init sort_node_map(void)
cmp_node_active_region, NULL); cmp_node_active_region, NULL);
} }
/* Find the lowest pfn for a node. This depends on a sorted early_node_map */ /* Find the lowest pfn for a node */
unsigned long __init find_min_pfn_for_node(unsigned long nid) unsigned long __init find_min_pfn_for_node(unsigned long nid)
{ {
int i; int i;
unsigned long min_pfn = ULONG_MAX;
/* Regions in the early_node_map can be in any order */
sort_node_map();
/* Assuming a sorted map, the first range found has the starting pfn */ /* Assuming a sorted map, the first range found has the starting pfn */
for_each_active_range_index_in_nid(i, nid) for_each_active_range_index_in_nid(i, nid)
return early_node_map[i].start_pfn; min_pfn = min(min_pfn, early_node_map[i].start_pfn);
printk(KERN_WARNING "Could not find start_pfn for node %lu\n", nid); if (min_pfn == ULONG_MAX) {
printk(KERN_WARNING
"Could not find start_pfn for node %lu\n", nid);
return 0; return 0;
}
return min_pfn;
} }
/** /**
...@@ -2939,6 +2942,9 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn) ...@@ -2939,6 +2942,9 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn)
unsigned long nid; unsigned long nid;
enum zone_type i; enum zone_type i;
/* Sort early_node_map as initialisation assumes it is sorted */
sort_node_map();
/* Record where the zone boundaries are */ /* Record where the zone boundaries are */
memset(arch_zone_lowest_possible_pfn, 0, memset(arch_zone_lowest_possible_pfn, 0,
sizeof(arch_zone_lowest_possible_pfn)); sizeof(arch_zone_lowest_possible_pfn));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment