On Fri, Jul 01, 2016 at 09:01:19PM +0100, Mel Gorman wrote: > kswapd scans from highest to lowest for a zone that requires balancing. > This was necessary when reclaim was per-zone to fairly age pages on lower > zones. Now that we are reclaiming on a per-node basis, any eligible zone > can be used and pages will still be aged fairly. This patch avoids > reclaiming excessively unless buffer_heads are over the limit and it's > necessary to reclaim from a higher zone than requested by the waker of > kswapd to relieve low memory pressure. > > [hillf.zj@xxxxxxxxxxxxxxx: Force kswapd reclaim no more than needed] > Link: http://lkml.kernel.org/r/1466518566-30034-12-git-send-email-mgorman@xxxxxxxxxxxxxxxxxxx > Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> > Signed-off-by: Hillf Danton <hillf.zj@xxxxxxxxxxxxxxx> > Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > mm/vmscan.c | 56 ++++++++++++++++++++++++-------------------------------- > 1 file changed, 24 insertions(+), 32 deletions(-) > > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 911142d25de2..2f898ba2ee2e 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -3141,31 +3141,36 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int classzone_idx) > > sc.nr_reclaimed = 0; > > - /* Scan from the highest requested zone to dma */ > - for (i = classzone_idx; i >= 0; i--) { > - zone = pgdat->node_zones + i; > - if (!populated_zone(zone)) > - continue; > - > - /* > - * If the number of buffer_heads in the machine > - * exceeds the maximum allowed level and this node > - * has a highmem zone, force kswapd to reclaim from > - * it to relieve lowmem pressure. > - */ > - if (buffer_heads_over_limit && is_highmem_idx(i)) { > - classzone_idx = i; > - break; > - } > + /* > + * If the number of buffer_heads in the machine exceeds the > + * maximum allowed level then reclaim from all zones. This is > + * not specific to highmem as highmem may not exist but it is > + * it is expected that buffer_heads are stripped in writeback. > + */ > + if (buffer_heads_over_limit) { > + for (i = MAX_NR_ZONES - 1; i >= 0; i--) { > + zone = pgdat->node_zones + i; > + if (!populated_zone(zone)) > + continue; > > - if (!zone_balanced(zone, order, 0)) { > classzone_idx = i; > break; > } > } > > - if (i < 0) > - goto out; > + /* > + * Only reclaim if there are no eligible zones. Check from > + * high to low zone to avoid prematurely clearing pgdat > + * congested state. I cannot understand "prematurely clearing pgdat congested state". Could you add more words to clear it out? > + */ > + for (i = classzone_idx; i >= 0; i--) { > + zone = pgdat->node_zones + i; > + if (!populated_zone(zone)) > + continue; > + > + if (zone_balanced(zone, sc.order, classzone_idx)) If buffer_head is over limit, old logic force to reclaim highmem but this zone_balanced logic will prevent it. > + goto out; > + } > > /* > * Do some background aging of the anon list, to give > @@ -3211,19 +3216,6 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int classzone_idx) > break; > > /* > - * Stop reclaiming if any eligible zone is balanced and clear > - * node writeback or congested. > - */ > - for (i = 0; i <= classzone_idx; i++) { > - zone = pgdat->node_zones + i; > - if (!populated_zone(zone)) > - continue; > - > - if (zone_balanced(zone, sc.order, classzone_idx)) > - goto out; > - } > - > - /* > * Raise priority if scanning rate is too low or there was no > * progress in reclaiming pages > */ > -- > 2.6.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> -- 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>