[lkml]   [2012]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH 05/34] vmscan: clear ZONE_CONGESTED for zone with good watermark
    From: Shaohua Li <>

    commit 439423f6894aa0dec22187526827456f5004baed upstream.

    Stable note: Not tracked in Bugzilla. kswapd is responsible for clearing
    ZONE_CONGESTED after it balances a zone and this patch fixes a bug
    where that was failing to happen. Without this patch, processes
    can stall in wait_iff_congested unnecessarily. For users, this can
    look like an interactivity stall but some workloads would see it
    as sudden drop in throughput.

    ZONE_CONGESTED is only cleared in kswapd, but pages can be freed in any
    task. It's possible ZONE_CONGESTED isn't cleared in some cases:

    1. the zone is already balanced just entering balance_pgdat() for
    order-0 because concurrent tasks free memory. In this case, later
    check will skip the zone as it's balanced so the flag isn't cleared.

    2. high order balance fallbacks to order-0. quote from Mel: At the
    end of balance_pgdat(), kswapd uses the following logic;

    If reclaiming at high order {
    for each zone {
    if all_unreclaimable
    if watermark is not met
    order = 0
    loop again

    /* watermark is met */
    clear congested

    i.e. it clears ZONE_CONGESTED if it the zone is balanced. if not,
    it restarts balancing at order-0. However, if the higher zones are
    balanced for order-0, kswapd will miss clearing ZONE_CONGESTED as
    that only happens after a zone is shrunk. This can mean that
    wait_iff_congested() stalls unnecessarily.

    This patch makes kswapd clear ZONE_CONGESTED during its initial
    highmem->dma scan for zones that are already balanced.

    Signed-off-by: Shaohua Li <>
    Acked-by: Mel Gorman <>
    Reviewed-by: Minchan Kim <>
    Signed-off-by: Andrew Morton <>
    Signed-off-by: Linus Torvalds <>
    Signed-off-by: Mel Gorman <>
    mm/vmscan.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/mm/vmscan.c b/mm/vmscan.c
    index bdfdec3..72340b84 100644
    --- a/mm/vmscan.c
    +++ b/mm/vmscan.c
    @@ -2456,6 +2456,9 @@ loop_again:
    high_wmark_pages(zone), 0, 0)) {
    end_zone = i;
    + } else {
    + /* If balanced, clear the congested flag */
    + zone_clear_flag(zone, ZONE_CONGESTED);
    if (i < 0)

     \ /
      Last update: 2012-07-19 17:21    [W:0.029 / U:18.312 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site