zone_local is using node_distance which is a more expensive call than necessary. On x86, it's another function call in the allocator fast path and increases cache footprint. This patch makes the assumption zones on the preferred node will share the same node ID. The necessary information should already be cache hot. Cc: <stable@xxxxxxxxxx> # 3.12 Signed-off-by: Mel Gorman <mgorman@xxxxxxx> Acked-by: Rik van Riel <riel@xxxxxxxxxx> --- mm/page_alloc.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 2cd694c..5aeb2c6 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1822,9 +1822,10 @@ static void zlc_clear_zones_full(struct zonelist *zonelist) bitmap_zero(zlc->fullzones, MAX_ZONES_PER_ZONELIST); } -static bool zone_local(struct zone *local_zone, struct zone *zone) +/* Returns if the zone is is on the same node as the preferred node */ +static bool zone_preferred_node(struct zone *preferred_zone, struct zone *zone) { - return node_distance(local_zone->node, zone->node) == LOCAL_DISTANCE; + return zone_to_nid(preferred_zone) == zone_to_nid(zone); } static bool zone_allows_reclaim(struct zone *local_zone, struct zone *zone) @@ -1864,7 +1865,7 @@ static void zlc_clear_zones_full(struct zonelist *zonelist) { } -static bool zone_local(struct zone *local_zone, struct zone *zone) +static bool zone_preferred_node(struct zone *preferred_zone, struct zone *zone) { return true; } @@ -1909,7 +1910,7 @@ static bool zone_distribute_age(gfp_t gfp_mask, struct zone *preferred_zone, * back to remote zones that do not partake in the fairness round-robin * cycle of this zonelist. */ - if (zone_reclaim_mode && !zone_local(preferred_zone, zone)) + if (zone_reclaim_mode && !zone_preferred_node(preferred_zone, zone)) return true; return false; @@ -2420,7 +2421,7 @@ static void prepare_slowpath(gfp_t gfp_mask, unsigned int order, * thrash fairness information for zones that are not * actually part of this zonelist's round-robin cycle. */ - if (zone_reclaim_mode && !zone_local(preferred_zone, zone)) + if (zone_reclaim_mode && !zone_preferred_node(preferred_zone, zone)) continue; mod_zone_page_state(zone, NR_ALLOC_BATCH, high_wmark_pages(zone) - -- 1.8.4 -- 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>