[PATCH v3 1/2] powerpc/syscall: Remove TIF_SYSCALL_RET
From: Renzo Davoli
Date: Fri Oct 30 2026 - 04:51:36 EST
Commit 69cb2be898be ("powerpc/syscall: Fix syscall skip handling for
seccomp and ptrace") added TIF_SYSCALL_RET, set by
syscall_set_return_value(), so that system_call_exception() skips a
system call whose return value has already been set.
The flag is set with set_thread_flag(), i.e. on current rather than on
the task passed to syscall_set_return_value(). When the caller is a
tracer, as with PTRACE_SET_SYSCALL_INFO and op ==
PTRACE_SYSCALL_INFO_EXIT, the flag ends up on the tracer, and the next
system call of the tracer is silently not executed. Setting it on the
right task would not be enough either: at a syscall-exit stop the flag
would then skip the next system call of the tracee.
The flag is not needed anymore. Commit 05c033db7e9a ("entry, treewide:
Make syscall_enter_from_user_mode[_work]() indicate syscall execution")
made syscall_enter_from_user_mode_randomize_stack() return false when
ptrace or seccomp skip the system call, and every in-kernel caller of
syscall_set_return_value() on the syscall entry path (SECCOMP_RET_ERRNO,
SECCOMP_RET_TRACE without a tracer, SECCOMP_RET_USER_NOTIF) also makes
it return false. A system call with an invalid number, including
syscall(-1), still gets -ENOSYS.
Remove the flag.
Fixes: 69cb2be898be ("powerpc/syscall: Fix syscall skip handling for seccomp and ptrace")
Cc: stable@xxxxxxxxxxxxxxx # v7.3
Suggested-by: Michal Suchánek <msuchanek@xxxxxxx>
Assisted-by: claude-opus-5-5
Signed-off-by: Renzo Davoli <renzo@xxxxxxxxxxx>
---
arch/powerpc/include/asm/syscall.h | 6 ------
arch/powerpc/include/asm/thread_info.h | 1 -
arch/powerpc/kernel/syscall.c | 4 +---
3 files changed, 1 insertion(+), 10 deletions(-)
diff --git a/arch/powerpc/include/asm/syscall.h b/arch/powerpc/include/asm/syscall.h
index 32be22b995cc..4b3c52ed6e9d 100644
--- a/arch/powerpc/include/asm/syscall.h
+++ b/arch/powerpc/include/asm/syscall.h
@@ -98,12 +98,6 @@ static inline void syscall_set_return_value(struct task_struct *task,
regs->gpr[3] = val;
}
}
- /*
- * Mark that a return value has been explicitly set by seccomp or
- * ptrace so that system_call_exception() can skip the syscall
- * unconditionally, even when the user requested syscall(-1).
- */
- set_thread_flag(TIF_SYSCALL_RET);
}
static inline void syscall_get_arguments(struct task_struct *task,
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index 1e069a2e7ce8..0487e94d3416 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -120,7 +120,6 @@ void arch_setup_new_exec(void);
#endif
#define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */
#define TIF_32BIT 20 /* 32 bit binary */
-#define TIF_SYSCALL_RET 21 /* syscall error value set */
/* as above, but as bit values */
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
diff --git a/arch/powerpc/kernel/syscall.c b/arch/powerpc/kernel/syscall.c
index 8529827d697f..f7412556a9e8 100644
--- a/arch/powerpc/kernel/syscall.c
+++ b/arch/powerpc/kernel/syscall.c
@@ -18,9 +18,7 @@ notrace long system_call_exception(struct pt_regs *regs, unsigned long r0)
long ret;
syscall_fn f;
- if (unlikely(!syscall_enter_from_user_mode_randomize_stack(regs, &r0) ||
- test_thread_flag(TIF_SYSCALL_RET))) {
- clear_thread_flag(TIF_SYSCALL_RET);
+ if (unlikely(!syscall_enter_from_user_mode_randomize_stack(regs, &r0))) {
return syscall_get_error(current, regs);
}
--
2.55.0