Re: [patch V4 11/36] entry: Remove syscall_enter_from_user_mode_prepare()

Mathieu Desnoyers
2025-09-09T13:33:41Z

On 2025-09-08 17:31, Thomas Gleixner wrote:
> Open code the only user in the x86 syscall code and reduce the zoo of
> functions.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: x86@kernel.org

Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>

>
> ---
> arch/x86/entry/syscall_32.c | 3 ++-
> include/linux/entry-common.h | 26 +++++---------------------
> kernel/entry/syscall-common.c | 8 --------
> 3 files changed, 7 insertions(+), 30 deletions(-)
>
> --- a/arch/x86/entry/syscall_32.c
> +++ b/arch/x86/entry/syscall_32.c
> @@ -274,9 +274,10 @@ static noinstr bool __do_fast_syscall_32
> * fetch EBP before invoking any of the syscall entry work
> * functions.
> */
> - syscall_enter_from_user_mode_prepare(regs);
> + enter_from_user_mode(regs);
>
> instrumentation_begin();
> + local_irq_enable();
> /* Fetch EBP from where the vDSO stashed it. */
> if (IS_ENABLED(CONFIG_X86_64)) {
> /*
> --- a/include/linux/entry-common.h
> +++ b/include/linux/entry-common.h
> @@ -45,23 +45,6 @@
> SYSCALL_WORK_SYSCALL_EXIT_TRAP | \
> ARCH_SYSCALL_WORK_EXIT)
>
> -/**
> - * syscall_enter_from_user_mode_prepare - Establish state and enable interrupts
> - * @regs: Pointer to currents pt_regs
> - *
> - * Invoked from architecture specific syscall entry code with interrupts
> - * disabled. The calling code has to be non-instrumentable. When the
> - * function returns all state is correct, interrupts are enabled and the
> - * subsequent functions can be instrumented.
> - *
> - * This handles lockdep, RCU (context tracking) and tracing state, i.e.
> - * the functionality provided by enter_from_user_mode().
> - *
> - * This is invoked when there is extra architecture specific functionality
> - * to be done between establishing state and handling user mode entry work.
> - */
> -void syscall_enter_from_user_mode_prepare(struct pt_regs *regs);
> -
> long syscall_trace_enter(struct pt_regs *regs, long syscall, unsigned long work);
>
> /**
> @@ -71,8 +54,8 @@ long syscall_trace_enter(struct pt_regs
> * @syscall: The syscall number
> *
> * Invoked from architecture specific syscall entry code with interrupts
> - * enabled after invoking syscall_enter_from_user_mode_prepare() and extra
> - * architecture specific work.
> + * enabled after invoking enter_from_user_mode(), enabling interrupts and
> + * extra architecture specific work.
> *
> * Returns: The original or a modified syscall number
> *
> @@ -108,8 +91,9 @@ static __always_inline long syscall_ente
> * function returns all state is correct, interrupts are enabled and the
> * subsequent functions can be instrumented.
> *
> - * This is combination of syscall_enter_from_user_mode_prepare() and
> - * syscall_enter_from_user_mode_work().
> + * This is the combination of enter_from_user_mode() and
> + * syscall_enter_from_user_mode_work() to be used when there is no
> + * architecture specific work to be done between the two.
> *
> * Returns: The original or a modified syscall number. See
> * syscall_enter_from_user_mode_work() for further explanation.
> --- a/kernel/entry/syscall-common.c
> +++ b/kernel/entry/syscall-common.c
> @@ -63,14 +63,6 @@ long syscall_trace_enter(struct pt_regs
> return ret ? : syscall;
> }
>
> -noinstr void syscall_enter_from_user_mode_prepare(struct pt_regs *regs)
> -{
> - enter_from_user_mode(regs);
> - instrumentation_begin();
> - local_irq_enable();
> - instrumentation_end();
> -}
> -
> /*
> * If SYSCALL_EMU is set, then the only reason to report is when
> * SINGLESTEP is set (i.e. PTRACE_SYSEMU_SINGLESTEP). This syscall
>
>

--
Mathieu Desnoyers
EfficiOS Inc.