[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200308222609.932307492@linutronix.de>
Date: Sun, 08 Mar 2020 23:24:09 +0100
From: Thomas Gleixner <tglx@...utronix.de>
To: LKML <linux-kernel@...r.kernel.org>
Cc: x86@...nel.org, Steven Rostedt <rostedt@...dmis.org>,
Brian Gerst <brgerst@...il.com>,
Juergen Gross <jgross@...e.com>,
Frederic Weisbecker <frederic@...nel.org>,
Alexandre Chartre <alexandre.chartre@...cle.com>
Subject: [patch part-II V2 10/13] x86/entry/common: Split prepare_exit_to_usermode() and syscall_return_slowpath()
Split the functions into traceable and probale parts and a part protected
from instrumentation.
This is required because after calling user_exit_irqsoff() kprobes and
tracepoints/function entry/exit which can be utilized by e.g. BPF are not
longer safe vs. RCU.
Preparatory step to move irq flags tracing to C code.
Signed-off-by: Thomas Gleixner <tglx@...utronix.de>
---
V2: New patch to reduce the churn
---
arch/x86/entry/common.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -206,7 +206,7 @@ static void exit_to_usermode_loop(struct
}
/* Called with IRQs disabled. */
-__visible inline void prepare_exit_to_usermode(struct pt_regs *regs)
+static noinline void __prepare_exit_to_usermode(struct pt_regs *regs)
{
struct thread_info *ti = current_thread_info();
u32 cached_flags;
@@ -245,11 +245,16 @@ static void exit_to_usermode_loop(struct
*/
ti->status &= ~(TS_COMPAT|TS_I386_REGS_POKED);
#endif
+}
- user_enter_irqoff();
+__visible inline notrace void prepare_exit_to_usermode(struct pt_regs *regs)
+{
+ __prepare_exit_to_usermode(regs);
+ user_enter_irqoff();
mds_user_clear_cpu_buffers();
}
+NOKPROBE_SYMBOL(prepare_exit_to_usermode);
#define SYSCALL_EXIT_WORK_FLAGS \
(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
@@ -277,11 +282,7 @@ static void syscall_slow_exit_work(struc
tracehook_report_syscall_exit(regs, step);
}
-/*
- * Called with IRQs on and fully valid regs. Returns with IRQs off in a
- * state such that we can immediately switch to user mode.
- */
-__visible inline void syscall_return_slowpath(struct pt_regs *regs)
+static void __syscall_return_slowpath(struct pt_regs *regs)
{
struct thread_info *ti = current_thread_info();
u32 cached_flags = READ_ONCE(ti->flags);
@@ -302,8 +303,18 @@ static void syscall_slow_exit_work(struc
syscall_slow_exit_work(regs, cached_flags);
local_irq_disable();
+}
+
+/*
+ * Called with IRQs on and fully valid regs. Returns with IRQs off in a
+ * state such that we can immediately switch to user mode.
+ */
+__visible inline notrace void syscall_return_slowpath(struct pt_regs *regs)
+{
+ __syscall_return_slowpath(regs);
prepare_exit_to_usermode(regs);
}
+NOKPROBE_SYMBOL(syscall_return_slowpath);
#ifdef CONFIG_X86_64
static __always_inline
Powered by blists - more mailing lists