entry: Move syscall_enter_from_user_mode() to header file

To allow inlining of syscall_enter_from_user_mode(), move it
to entry-common.h.

Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20231218074520.1998026-4-svens@linux.ibm.com
This commit is contained in:
Sven Schnelle 2023-12-18 08:45:20 +01:00 committed by Thomas Gleixner
parent caf4062e35
commit 221a164035
2 changed files with 26 additions and 33 deletions

View File

@ -134,6 +134,9 @@ static __always_inline void enter_from_user_mode(struct pt_regs *regs)
*/ */
void syscall_enter_from_user_mode_prepare(struct pt_regs *regs); void syscall_enter_from_user_mode_prepare(struct pt_regs *regs);
long syscall_trace_enter(struct pt_regs *regs, long syscall,
unsigned long work);
/** /**
* syscall_enter_from_user_mode_work - Check and handle work before invoking * syscall_enter_from_user_mode_work - Check and handle work before invoking
* a syscall * a syscall
@ -157,7 +160,15 @@ void syscall_enter_from_user_mode_prepare(struct pt_regs *regs);
* ptrace_report_syscall_entry(), __secure_computing(), trace_sys_enter() * ptrace_report_syscall_entry(), __secure_computing(), trace_sys_enter()
* 2) Invocation of audit_syscall_entry() * 2) Invocation of audit_syscall_entry()
*/ */
long syscall_enter_from_user_mode_work(struct pt_regs *regs, long syscall); static __always_inline long syscall_enter_from_user_mode_work(struct pt_regs *regs, long syscall)
{
unsigned long work = READ_ONCE(current_thread_info()->syscall_work);
if (work & SYSCALL_WORK_ENTER)
syscall = syscall_trace_enter(regs, syscall, work);
return syscall;
}
/** /**
* syscall_enter_from_user_mode - Establish state and check and handle work * syscall_enter_from_user_mode - Establish state and check and handle work
@ -176,7 +187,19 @@ long syscall_enter_from_user_mode_work(struct pt_regs *regs, long syscall);
* Returns: The original or a modified syscall number. See * Returns: The original or a modified syscall number. See
* syscall_enter_from_user_mode_work() for further explanation. * syscall_enter_from_user_mode_work() for further explanation.
*/ */
long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall); static __always_inline long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall)
{
long ret;
enter_from_user_mode(regs);
instrumentation_begin();
local_irq_enable();
ret = syscall_enter_from_user_mode_work(regs, syscall);
instrumentation_end();
return ret;
}
/** /**
* local_irq_enable_exit_to_user - Exit to user variant of local_irq_enable() * local_irq_enable_exit_to_user - Exit to user variant of local_irq_enable()

View File

@ -25,7 +25,7 @@ static inline void syscall_enter_audit(struct pt_regs *regs, long syscall)
} }
} }
static long syscall_trace_enter(struct pt_regs *regs, long syscall, long syscall_trace_enter(struct pt_regs *regs, long syscall,
unsigned long work) unsigned long work)
{ {
long ret = 0; long ret = 0;
@ -65,36 +65,6 @@ static long syscall_trace_enter(struct pt_regs *regs, long syscall,
return ret ? : syscall; return ret ? : syscall;
} }
static __always_inline long
__syscall_enter_from_user_work(struct pt_regs *regs, long syscall)
{
unsigned long work = READ_ONCE(current_thread_info()->syscall_work);
if (work & SYSCALL_WORK_ENTER)
syscall = syscall_trace_enter(regs, syscall, work);
return syscall;
}
long syscall_enter_from_user_mode_work(struct pt_regs *regs, long syscall)
{
return __syscall_enter_from_user_work(regs, syscall);
}
noinstr long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall)
{
long ret;
enter_from_user_mode(regs);
instrumentation_begin();
local_irq_enable();
ret = __syscall_enter_from_user_work(regs, syscall);
instrumentation_end();
return ret;
}
noinstr void syscall_enter_from_user_mode_prepare(struct pt_regs *regs) noinstr void syscall_enter_from_user_mode_prepare(struct pt_regs *regs)
{ {
enter_from_user_mode(regs); enter_from_user_mode(regs);