• Nicolas Saenz Julienne's avatar
    mm/page_alloc: remotely drain per-cpu lists · 443c2acc
    Nicolas Saenz Julienne authored
    Some setups, notably NOHZ_FULL CPUs, are too busy to handle the per-cpu
    drain work queued by __drain_all_pages().  So introduce a new mechanism to
    remotely drain the per-cpu lists.  It is made possible by remotely locking
    'struct per_cpu_pages' new per-cpu spinlocks.  A benefit of this new
    scheme is that drain operations are now migration safe.
    
    There was no observed performance degradation vs.  the previous scheme. 
    Both netperf and hackbench were run in parallel to triggering the
    __drain_all_pages(NULL, true) code path around ~100 times per second.  The
    new scheme performs a bit better (~5%), although the important point here
    is there are no performance regressions vs.  the previous mechanism. 
    Per-cpu lists draining happens only in slow paths.
    
    Minchan Kim tested an earlier version and reported;
    
    	My workload is not NOHZ CPUs but run apps under heavy memory
    	pressure so they goes to direct reclaim and be stuck on
    	drain_all_pages until work on workqueue run.
    
    	unit: nanosecond
    	max(dur)        avg(dur)                count(dur)
    	166713013       487511.77786438033      1283
    
    	From traces, system encountered the drain_all_pages 1283 times and
    	worst case was 166ms and avg was 487us.
    
    	The other problem was alloc_contig_range in CMA. The PCP draining
    	takes several hundred millisecond sometimes though there is no
    	memory pressure or a few of pages to be migrated out but CPU were
    	fully booked.
    
    	Your patch perfectly removed those wasted time.
    
    Link: https://lkml.kernel.org/r/20220624125423.6126-7-mgorman@techsingularity.net
    
    Signed-off-by: default avatarNicolas Saenz Julienne <nsaenzju@redhat.com>
    Signed-off-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Tested-by: default avatarYu Zhao <yuzhao@google.com>
    Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Marcelo Tosatti <mtosatti@redhat.com>
    Cc: Marek Szyprowski <m.szyprowski@samsung.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Minchan Kim <minchan@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    443c2acc
page_alloc.c 266 KB