[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210921161323.607817-7-nsaenzju@redhat.com>
Date: Tue, 21 Sep 2021 18:13:24 +0200
From: Nicolas Saenz Julienne <nsaenzju@...hat.com>
To: akpm@...ux-foundation.org, frederic@...nel.org
Cc: linux-kernel@...r.kernel.org, linux-mm@...ck.org,
tglx@...utronix.de, cl@...ux.com, peterz@...radead.org,
juri.lelli@...hat.com, mingo@...hat.com, mtosatti@...hat.com,
nilal@...hat.com, mgorman@...e.de, ppandit@...hat.com,
williams@...hat.com, bigeasy@...utronix.de,
anna-maria@...utronix.de, linux-rt-users@...r.kernel.org,
Nicolas Saenz Julienne <nsaenzju@...hat.com>
Subject: [PATCH 6/6] sched/isolation: Enable 'remote_pcpu_cache_access' on NOHZ_FULL systems
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@linutronix.de/
Signed-off-by: Nicolas Saenz Julienne <nsaenzju@...hat.com>
---
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
Powered by blists - more mailing lists