Messages in this thread | | | Subject | Re: [patch part-II V2 10/13] x86/entry/common: Split prepare_exit_to_usermode() and syscall_return_slowpath() | From | Alexandre Chartre <> | Date | Tue, 10 Mar 2020 14:37:30 +0100 |
| |
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@linutronix.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@oracle.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 >
| |