When enabled, 'remote_pcpu_cache_access' allows for remote draining of mm/swap.c's per-cpu LRU caches and mm/page_alloc.c's per-cpu page lists instead of using per-cpu drain work. This comes at the cost of more constraining locking, but NOHZ_FULL setups need this nonetheless: processes running on isolated CPUs are sensitive to any sort of interruption and preempting them in order to satisfy a housekeeping task is bound to break their functional guarantees (i.e. latency, bandwidth, etc...). So enable 'remote_pcpu_cache_access' after having successfully initialized NOHZ_FULL. This is based on previous work by Thomas Gleixner, Anna-Maria Gleixner, and Sebastian Andrzej Siewior[1]. [1] https://patchwork.kernel.org/project/linux-mm/patch/20190424111208.24459-3-bigeasy@xxxxxxxxxxxxx/ Signed-off-by: Nicolas Saenz Julienne <nsaenzju@xxxxxxxxxx> --- kernel/sched/isolation.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c index 7f06eaf12818..4fc4c76f27ab 100644 --- a/kernel/sched/isolation.c +++ b/kernel/sched/isolation.c @@ -8,6 +8,7 @@ * */ #include "sched.h" +#include "../../mm/internal.h" DEFINE_STATIC_KEY_FALSE(housekeeping_overridden); EXPORT_SYMBOL_GPL(housekeeping_overridden); @@ -137,11 +138,17 @@ static int __init housekeeping_setup(char *str, enum hk_flags flags) static int __init housekeeping_nohz_full_setup(char *str) { unsigned int flags; + int ret; flags = HK_FLAG_TICK | HK_FLAG_WQ | HK_FLAG_TIMER | HK_FLAG_RCU | HK_FLAG_MISC | HK_FLAG_KTHREAD; - return housekeeping_setup(str, flags); + ret = housekeeping_setup(str, flags); + if (ret) + /* Avoid LRU cache and mm/page_alloc.c's pcplists drain work */ + static_branch_enable(&remote_pcpu_cache_access); + + return ret; } __setup("nohz_full=", housekeeping_nohz_full_setup); -- 2.31.1