lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <20220302154810.42308-20-frederic@kernel.org> Date: Wed, 2 Mar 2022 16:48:10 +0100 From: Frederic Weisbecker <frederic@...nel.org> To: LKML <linux-kernel@...r.kernel.org> Cc: Frederic Weisbecker <frederic@...nel.org>, Peter Zijlstra <peterz@...radead.org>, Phil Auld <pauld@...hat.com>, Alex Belits <abelits@...vell.com>, Nicolas Saenz Julienne <nsaenz@...nel.org>, Xiongfeng Wang <wangxiongfeng2@...wei.com>, Neeraj Upadhyay <quic_neeraju@...cinc.com>, Thomas Gleixner <tglx@...utronix.de>, Yu Liao <liaoyu15@...wei.com>, Boqun Feng <boqun.feng@...il.com>, "Paul E . McKenney" <paulmck@...nel.org>, Marcelo Tosatti <mtosatti@...hat.com>, Paul Gortmaker <paul.gortmaker@...driver.com>, Uladzislau Rezki <uladzislau.rezki@...y.com>, Joel Fernandes <joel@...lfernandes.org> Subject: [PATCH 19/19] context_tracking: Exempt CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK from non-active tracking Since a CPU may save the state of the context tracking using exception_enter() before calling into schedule(), we need all CPUs in the system to track user <-> kernel transitions and not just those that really need it (nohz_full CPUs). The following illustrates the issue that could otherwise happen: CPU 0 (not tracking) CPU 1 (tracking) ------------------- -------------------- // we are past user_enter() // but this CPU is always in // CONTEXT_KERNEL // because it doesn't track user <-> kernel ctx = exception_enter(); //ctx == CONTEXT_KERNEL schedule(); ===========================================> return from schedule(); exception_exit(ctx); //go to user in CONTEXT_KERNEL However CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK doesn't play those games because schedule() can't be called between user_enter() and user_exit() under such config. In this situation we can spare context tracking on the CPUs that don't need it. Signed-off-by: Frederic Weisbecker <frederic@...nel.org> Cc: Paul E. McKenney <paulmck@...nel.org> Cc: Peter Zijlstra <peterz@...radead.org> Cc: Thomas Gleixner <tglx@...utronix.de> Cc: Neeraj Upadhyay <quic_neeraju@...cinc.com> Cc: Uladzislau Rezki <uladzislau.rezki@...y.com> Cc: Joel Fernandes <joel@...lfernandes.org> Cc: Boqun Feng <boqun.feng@...il.com> Cc: Nicolas Saenz Julienne <nsaenz@...nel.org> Cc: Marcelo Tosatti <mtosatti@...hat.com> Cc: Xiongfeng Wang <wangxiongfeng2@...wei.com> Cc: Yu Liao<liaoyu15@...wei.com> Cc: Phil Auld <pauld@...hat.com> Cc: Paul Gortmaker<paul.gortmaker@...driver.com> Cc: Alex Belits <abelits@...vell.com> --- kernel/context_tracking.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/kernel/context_tracking.c b/kernel/context_tracking.c index 87e7b748791c..b1934264f77f 100644 --- a/kernel/context_tracking.c +++ b/kernel/context_tracking.c @@ -374,7 +374,7 @@ void noinstr __ct_user_enter(enum ctx_state state) * when the CPU runs in userspace. */ ct_kernel_exit(true, RCU_DYNTICKS_IDX + state); - } else { + } else if (!IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK)) { /* * Even if context tracking is disabled on this CPU, because it's outside * the full dynticks mask for example, we still have to keep track of the @@ -384,7 +384,8 @@ void noinstr __ct_user_enter(enum ctx_state state) * handler and then migrate to another CPU, that new CPU must know where * the exception returns by the time we call exception_exit(). * This information can only be provided by the previous CPU when it called - * exception_enter(). + * exception_enter(). CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK is + * excused though because it doesn't use exception_enter(). * OTOH we can spare the calls to vtime and RCU when context_tracking.active * is false because we know that CPU is not tickless. */ @@ -460,7 +461,7 @@ void noinstr __ct_user_exit(enum ctx_state state) trace_user_exit(0); instrumentation_end(); } - } else { + } else if (!IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK)) { atomic_sub(state, &ct->state); } } -- 2.25.1
Powered by blists - more mailing lists