entry_Add_enter_from_user_mode_wrapper

To be called from architecture specific code if the combo interfaces are
not suitable. It simply calls __enter_from_user_mode(). This way
__enter_from_user_mode will still be inlined because it is declared static
__always_inline.

[ tglx: Amend comments and move it to a different location in the header ]

Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20201201142755.31931-4-svens@linux.ibm.com
This commit is contained in:
Sven Schnelle 2020-12-01 15:27:53 +01:00 committed by Thomas Gleixner
parent bb793562f0
commit 96e2fbccd0
2 changed files with 29 additions and 11 deletions

View File

@ -101,6 +101,27 @@ static inline __must_check int arch_syscall_enter_tracehook(struct pt_regs *regs
} }
#endif #endif
/**
* enter_from_user_mode - Establish state when coming from user mode
*
* Syscall/interrupt entry disables interrupts, but user mode is traced as
* interrupts enabled. Also with NO_HZ_FULL RCU might be idle.
*
* 1) Tell lockdep that interrupts are disabled
* 2) Invoke context tracking if enabled to reactivate RCU
* 3) Trace interrupts off state
*
* 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 and interrupts are still
* disabled. The subsequent functions can be instrumented.
*
* This is invoked when there is architecture specific functionality to be
* done between establishing state and enabling interrupts. The caller must
* enable interrupts before invoking syscall_enter_from_user_mode_work().
*/
void enter_from_user_mode(struct pt_regs *regs);
/** /**
* syscall_enter_from_user_mode_prepare - Establish state and enable interrupts * syscall_enter_from_user_mode_prepare - Establish state and enable interrupts
* @regs: Pointer to currents pt_regs * @regs: Pointer to currents pt_regs
@ -110,7 +131,8 @@ static inline __must_check int arch_syscall_enter_tracehook(struct pt_regs *regs
* function returns all state is correct, interrupts are enabled and the * function returns all state is correct, interrupts are enabled and the
* subsequent functions can be instrumented. * subsequent functions can be instrumented.
* *
* This handles lockdep, RCU (context tracking) and tracing state. * 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 * This is invoked when there is extra architecture specific functionality
* to be done between establishing state and handling user mode entry work. * to be done between establishing state and handling user mode entry work.

View File

@ -10,16 +10,7 @@
#define CREATE_TRACE_POINTS #define CREATE_TRACE_POINTS
#include <trace/events/syscalls.h> #include <trace/events/syscalls.h>
/** /* See comment for enter_from_user_mode() in entry-common.h */
* __enter_from_user_mode - Establish state when coming from user mode
*
* Syscall/interrupt entry disables interrupts, but user mode is traced as
* interrupts enabled. Also with NO_HZ_FULL RCU might be idle.
*
* 1) Tell lockdep that interrupts are disabled
* 2) Invoke context tracking if enabled to reactivate RCU
* 3) Trace interrupts off state
*/
static __always_inline void __enter_from_user_mode(struct pt_regs *regs) static __always_inline void __enter_from_user_mode(struct pt_regs *regs)
{ {
arch_check_user_regs(regs); arch_check_user_regs(regs);
@ -33,6 +24,11 @@ static __always_inline void __enter_from_user_mode(struct pt_regs *regs)
instrumentation_end(); instrumentation_end();
} }
void noinstr enter_from_user_mode(struct pt_regs *regs)
{
__enter_from_user_mode(regs);
}
static inline void syscall_enter_audit(struct pt_regs *regs, long syscall) static inline void syscall_enter_audit(struct pt_regs *regs, long syscall)
{ {
if (unlikely(audit_context())) { if (unlikely(audit_context())) {