• Takero Funaki's avatar
    mm: zswap: fix global shrinker error handling logic · 81920438
    Takero Funaki authored
    This patch fixes the zswap global shrinker, which did not shrink the zpool
    as expected.
    
    The issue addressed is that shrink_worker() did not distinguish between
    unexpected errors and expected errors, such as failed writeback from an
    empty memcg.  The shrinker would stop shrinking after iterating through
    the memcg tree 16 times, even if there was only one empty memcg.
    
    With this patch, the shrinker no longer considers encountering an empty
    memcg, encountering a memcg with writeback disabled, or reaching the end
    of a memcg tree walk as a failure, as long as there are memcgs that are
    candidates for writeback.  Systems with one or more empty memcgs will now
    observe significantly higher zswap writeback activity after the zswap pool
    limit is hit.
    
    To avoid an infinite loop when there are no writeback candidates, this
    patch tracks writeback attempts during memcg tree walks and limits reties
    if no writeback candidates are found.
    
    To handle the empty memcg case, the helper function shrink_memcg() is
    modified to check if the memcg is empty and then return -ENOENT.
    
    Link: https://lkml.kernel.org/r/20240731004918.33182-3-flintglass@gmail.com
    Fixes: a65b0e76 ("zswap: make shrinking memcg-aware")
    Signed-off-by: default avatarTakero Funaki <flintglass@gmail.com>
    Reviewed-by: default avatarChengming Zhou <chengming.zhou@linux.dev>
    Reviewed-by: default avatarNhat Pham <nphamcs@gmail.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Yosry Ahmed <yosryahmed@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    81920438
zswap.c 50.1 KB