• Zhongkun He's avatar
    mm:page_alloc: fix the NULL ac->nodemask in __alloc_pages_slowpath() · 435b3894
    Zhongkun He authored
    should_reclaim_retry() is not ALLOC_CPUSET aware and that means that it
    considers reclaimability of NUMA nodes which are outside of the cpuset. 
    If other nodes have a lot of reclaimable memory then should_reclaim_retry
    would instruct page allocator to retry even though there is no memory
    reclaimable on the cpuset nodemask.  This is not really a huge problem
    because the number of retries without any reclaim progress is bound but it
    could be certainly improved.  This is a cold path so this shouldn't really
    have a measurable impact on performance on most workloads.
    
    1.Test step and the machines.
    ------------
    root@vm:/sys/fs/cgroup/test# numactl -H | grep size
    node 0 size: 9477 MB
    node 1 size: 10079 MB
    node 2 size: 10079 MB
    node 3 size: 10078 MB
    
    root@vm:/sys/fs/cgroup/test# cat cpuset.mems
        2
    
    root@vm:/sys/fs/cgroup/test# stress --vm 1 --vm-bytes 12g  --vm-keep
    stress: info: [33430] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
    stress: FAIL: [33430] (425) <-- worker 33431 got signal 9
    stress: WARN: [33430] (427) now reaping child worker processes
    stress: FAIL: [33430] (461) failed run completed in 2s
    
    2. reclaim_retry_zone info:
    
    We can only alloc pages from node=2, but the reclaim_retry_zone is
    node=0 and return true.
    
    root@vm:/sys/kernel/debug/tracing# cat trace
    stress-33431   [001] ..... 13223.617311: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=1 wmark_check=1
    stress-33431   [001] ..... 13223.617682: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=2 wmark_check=1
    stress-33431   [001] ..... 13223.618103: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=3 wmark_check=1
    stress-33431   [001] ..... 13223.618454: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=4 wmark_check=1
    stress-33431   [001] ..... 13223.618770: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=5 wmark_check=1
    stress-33431   [001] ..... 13223.619150: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=6 wmark_check=1
    stress-33431   [001] ..... 13223.619510: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=7 wmark_check=1
    stress-33431   [001] ..... 13223.619850: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=8 wmark_check=1
    stress-33431   [001] ..... 13223.620171: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=9 wmark_check=1
    stress-33431   [001] ..... 13223.620533: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=10 wmark_check=1
    stress-33431   [001] ..... 13223.620894: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=11 wmark_check=1
    stress-33431   [001] ..... 13223.621224: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=12 wmark_check=1
    stress-33431   [001] ..... 13223.621551: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=13 wmark_check=1
    stress-33431   [001] ..... 13223.621847: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=14 wmark_check=1
    stress-33431   [001] ..... 13223.622200: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=15 wmark_check=1
    stress-33431   [001] ..... 13223.622580: reclaim_retry_zone: node=0 zone=Normal   order=0 reclaimable=4260 available=1772019 min_wmark=5962 no_progress_loops=16 wmark_check=1
    
    With this patch, we can check the right node and get less retry in
    __alloc_pages_slowpath() because there is nothing to do.
    
    Link: https://lkml.kernel.org/r/20240822092612.3209286-1-hezhongkun.hzk@bytedance.comSigned-off-by: default avatarZhongkun He <hezhongkun.hzk@bytedance.com>
    Suggested-by: default avatarMichal Hocko <mhocko@suse.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Zefan Li <lizefan.x@bytedance.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    435b3894
compaction.c 92.6 KB