• Charan Teja Reddy's avatar
    mm/compaction: correct deferral logic for proactive compaction · 40d7e203
    Charan Teja Reddy authored
    should_proactive_compact_node() returns true when sum of the weighted
    fragmentation score of all the zones in the node is greater than the
    wmark_high of compaction, which then triggers the proactive compaction
    that operates on the individual zones of the node.  But proactive
    compaction runs on the zone only when its weighted fragmentation score
    is greater than wmark_low(=wmark_high - 10).
    
    This means that the sum of the weighted fragmentation scores of all the
    zones can exceed the wmark_high but individual weighted fragmentation zone
    scores can still be less than wmark_low which makes the unnecessary
    trigger of the proactive compaction only to return doing nothing.
    
    Issue with the return of proactive compaction with out even trying is its
    deferral.  It is simply deferred for 1 << COMPACT_MAX_DEFER_SHIFT if the
    scores across the proactive compaction is same, thinking that compaction
    didn't make any progress but in reality it didn't even try.  With the
    delay between successive retries for proactive compaction is 500msec, it
    can result into the deferral for ~30sec with out even trying the proactive
    compaction.
    
    Test scenario is that: compaction_proactiveness=50 thus the wmark_low = 50
    and wmark_high = 60.  System have 2 zones(Normal and Movable) with sizes
    5GB and 6GB respectively.  After opening some apps on the android, the
    weighted fragmentation scores of these zones are 47 and 49 respectively.
    Since the sum of these fragmentation scores are above the wmark_high which
    triggers the proactive compaction and there since the individual zones
    weighted fragmentation scores are below wmark_low, it returns without
    trying the proactive compaction.  As a result the weighted fragmentation
    scores of the zones are still 47 and 49 which makes the existing logic to
    defer the compaction thinking that noprogress is made across the
    compaction.
    
    Fix this by checking just zone fragmentation score, not the weighted, in
    __compact_finished() and use the zones weighted fragmentation score in
    fragmentation_score_node().  In the test case above, If the weighted
    average of is above wmark_high, then individual score (not adjusted) of
    atleast one zone has to be above wmark_high.  Thus it avoids the
    unnecessary trigger and deferrals of the proactive compaction.
    
    Link: https://lkml.kernel.org/r/1610989938-31374-1-git-send-email-charante@codeaurora.org
    
    Signed-off-by: default avatarCharan Teja Reddy <charante@codeaurora.org>
    Suggested-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Reviewed-by: default avatarKhalid Aziz <khalid.aziz@oracle.com>
    Acked-by: default avatarDavid Rientjes <rientjes@google.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Nitin Gupta <ngupta@nitingupta.dev>
    Cc: Vinayak Menon <vinmenon@codeaurora.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    40d7e203
compaction.c 81.3 KB