mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
[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: Mel Gorman <mel@csn.ul.ie> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
e10a4437cb
commit
a6af2bc3d5
@ -2877,20 +2877,23 @@ static void __init sort_node_map(void)
|
||||
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)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Regions in the early_node_map can be in any order */
|
||||
sort_node_map();
|
||||
unsigned long min_pfn = ULONG_MAX;
|
||||
|
||||
/* Assuming a sorted map, the first range found has the starting pfn */
|
||||
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);
|
||||
return 0;
|
||||
if (min_pfn == ULONG_MAX) {
|
||||
printk(KERN_WARNING
|
||||
"Could not find start_pfn for node %lu\n", nid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return min_pfn;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2939,6 +2942,9 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn)
|
||||
unsigned long nid;
|
||||
enum zone_type i;
|
||||
|
||||
/* Sort early_node_map as initialisation assumes it is sorted */
|
||||
sort_node_map();
|
||||
|
||||
/* Record where the zone boundaries are */
|
||||
memset(arch_zone_lowest_possible_pfn, 0,
|
||||
sizeof(arch_zone_lowest_possible_pfn));
|
||||
|
Loading…
Reference in New Issue
Block a user