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...@alibaba-inc.com: Force kswapd reclaim no more than needed]
> Link: 
> http://lkml.kernel.org/r/1466518566-30034-12-git-send-email-mgor...@techsingularity.net
> Signed-off-by: Mel Gorman <mgor...@techsingularity.net>
> Signed-off-by: Hillf Danton <hillf...@alibaba-inc.com>
> Acked-by: Vlastimil Babka <vba...@suse.cz>
> ---
>  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 majord...@kvack.org.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"d...@kvack.org";> em...@kvack.org </a>

Reply via email to