The syscall exit path in el0_svc_common() re-evaluates all _TIF_SYSCALL_WORK flags, but this mask contains flags that only matter on entry:
- _TIF_SECCOMP: seccomp filtering is entry-only - _TIF_SYSCALL_EMU: PTRACE_SYSEMU skips the syscall on entry Re-checking them on exit is unnecessary and may trigger redundant work. Switch to _TIF_SYSCALL_EXIT_WORK for the exit-path re-check to evaluate only exit-relevant flags (_TIF_SYSCALL_TRACE, _TIF_SYSCALL_AUDIT, and _TIF_SYSCALL_TRACEPOINT). No functional change intended. Cc: Mark Rutland <[email protected]> Cc: Will Deacon <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Ada Couprie Diaz <[email protected]> Reviewed-by: Ada Couprie Diaz <[email protected]> Reviewed-by: Linus Walleij <[email protected]> Reviewed-by: Yeoreum Yun <[email protected]> Signed-off-by: Jinjie Ruan <[email protected]> --- arch/arm64/kernel/syscall.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c index 0061fc63e7ba..f1f0b6f3e32b 100644 --- a/arch/arm64/kernel/syscall.c +++ b/arch/arm64/kernel/syscall.c @@ -127,7 +127,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr, */ if (!has_syscall_work(flags) && !IS_ENABLED(CONFIG_DEBUG_RSEQ)) { flags = read_thread_flags(); - if (has_syscall_work(flags) || flags & _TIF_SINGLESTEP) + if (unlikely(flags & _TIF_SYSCALL_EXIT_WORK) || flags & _TIF_SINGLESTEP) arm64_syscall_exit_to_user_mode_work(regs); return; } -- 2.34.1

