[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <66bc932f-3ef7-1bcd-c5bc-c546036e2f3f@oracle.com>
Date: Tue, 10 Mar 2020 14:37:30 +0100
From: Alexandre Chartre <alexandre.chartre@...cle.com>
To: Thomas Gleixner <tglx@...utronix.de>,
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>
Subject: Re: [patch part-II V2 10/13] x86/entry/common: Split
prepare_exit_to_usermode() and syscall_return_slowpath()
On 3/8/20 11:24 PM, Thomas Gleixner wrote:
> Split the functions into traceable and probale parts and a part protected
typo: probale -> probeable ?
> 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)
Why noinline?
Reviewed-by: Alexandre Chartre <alexandre.chartre@...cle.com>
alex.
> {
> 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