When dumping the statistics for zones in the allowed nodes in the function show_free_areas(), skip_free_areas_node() got called for multiple times to figure out the same information: the allowed nodes for dump. It's reasonable to get the allowed nodes at once. Signed-off-by: Gavin Shan <shangw@xxxxxxxxxxxxxxxxxx> --- mm/page_alloc.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 7892f84..211004e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2765,11 +2765,19 @@ out: */ void show_free_areas(unsigned int filter) { - int cpu; + int nid, cpu; + nodemask_t allownodes; struct zone *zone; + /* Figure out the allowed nodes for dump */ + nodes_clear(allownodes); + for_each_online_node(nid) { + if (!skip_free_areas_node(filter, nid)) + node_set(nid, allownodes); + } + for_each_populated_zone(zone) { - if (skip_free_areas_node(filter, zone_to_nid(zone))) + if (!node_isset(zone_to_nid(zone), allownodes)) continue; show_node(zone); printk("%s per-cpu:\n", zone->name); @@ -2812,7 +2820,7 @@ void show_free_areas(unsigned int filter) for_each_populated_zone(zone) { int i; - if (skip_free_areas_node(filter, zone_to_nid(zone))) + if (!node_isset(zone_to_nid(zone), allownodes)) continue; show_node(zone); printk("%s" @@ -2881,7 +2889,7 @@ void show_free_areas(unsigned int filter) for_each_populated_zone(zone) { unsigned long nr[MAX_ORDER], flags, order, total = 0; - if (skip_free_areas_node(filter, zone_to_nid(zone))) + if (!node_isset(zone_to_nid(zone), allownodes)) continue; show_node(zone); printk("%s: ", zone->name); -- 1.7.9.5 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>