• Johannes Weiner's avatar
    workingset: fix confusion around eviction vs refault container · f78dfc7b
    Johannes Weiner authored
    Refault decisions are made based on the lruvec where the page was evicted,
    as that determined its LRU order while it was alive.  Stats and workingset
    aging must then occur on the lruvec of the new page, as that's the node
    and cgroup that experience the refault and that's the lruvec whose
    nonresident info ages out by a new resident page.  Those lruvecs could be
    different when a page is shared between cgroups, or the refaulting page is
    allocated on a different node.
    
    There are currently two mix-ups:
    
    1. When swap is available, the resident anon set must be considered
       when comparing the refault distance. The comparison is made against
       the right anon set, but the check for swap is not. When pages get
       evicted from a cgroup with swap, and refault in one without, this
       can incorrectly consider a hot refault as cold - and vice
       versa. Fix that by using the eviction cgroup for the swap check.
    
    2. The stats and workingset age are updated against the wrong lruvec
       altogether: the right cgroup but the wrong NUMA node. When a page
       refaults on a different NUMA node, this will have confusing stats
       and distort the workingset age on a different lruvec - again
       possibly resulting in hot/cold misclassifications down the line.
    
    Fix the swap check and the refault pgdat to address both concerns.
    
    This was found during code review.  It hasn't caused notable issues in
    production, suggesting that those refault-migrations are relatively rare
    in practice.
    
    Link: https://lkml.kernel.org/r/20230104222944.2380117-1-nphamcs@gmail.comSigned-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Co-developed-by: default avatarNhat Pham <nphamcs@gmail.com>
    Signed-off-by: default avatarNhat Pham <nphamcs@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    f78dfc7b
workingset.c 24.6 KB