Currently, multiple architectures (LoongArch, RISC-V, S390, Powerpc) provide identical stubs for arch_syscall_is_vdso_sigreturn() that simply return false. This results in redundant boilerplate code across the tree.
Introduce a default __weak implementation of arch_syscall_is_vdso_sigreturn() directly in syscall_user_dispatch.c that returns false. This allows architectures that do not utilize a vDSO sigreturn to entirely drop their redundant inline definitions. Architectures requiring a specialized check (such as x86) will continue to override this fallback with their strong symbol definitions. Clean up the redundant implementations in loongarch, riscv, s390 and powerpc. Cc: Thomas Gleixner <[email protected]> Signed-off-by: Jinjie Ruan <[email protected]> --- arch/loongarch/include/asm/syscall.h | 5 ----- arch/powerpc/include/asm/syscall.h | 5 ----- arch/riscv/include/asm/syscall.h | 5 ----- arch/s390/include/asm/syscall.h | 5 ----- include/linux/syscall_user_dispatch.h | 1 + kernel/entry/syscall_user_dispatch.c | 5 +++++ 6 files changed, 6 insertions(+), 20 deletions(-) diff --git a/arch/loongarch/include/asm/syscall.h b/arch/loongarch/include/asm/syscall.h index df8ea223c77b..946886794ced 100644 --- a/arch/loongarch/include/asm/syscall.h +++ b/arch/loongarch/include/asm/syscall.h @@ -85,9 +85,4 @@ static inline int syscall_get_arch(struct task_struct *task) #endif } -static inline bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs) -{ - return false; -} - #endif /* __ASM_LOONGARCH_SYSCALL_H */ diff --git a/arch/powerpc/include/asm/syscall.h b/arch/powerpc/include/asm/syscall.h index 834fcc4f7b54..4b3c52ed6e9d 100644 --- a/arch/powerpc/include/asm/syscall.h +++ b/arch/powerpc/include/asm/syscall.h @@ -139,9 +139,4 @@ static inline int syscall_get_arch(struct task_struct *task) else return AUDIT_ARCH_PPC64; } - -static inline bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs) -{ - return false; -} #endif /* _ASM_SYSCALL_H */ diff --git a/arch/riscv/include/asm/syscall.h b/arch/riscv/include/asm/syscall.h index 8067e666a4ca..987c9a78806f 100644 --- a/arch/riscv/include/asm/syscall.h +++ b/arch/riscv/include/asm/syscall.h @@ -112,11 +112,6 @@ static inline void syscall_handler(struct pt_regs *regs, ulong syscall) regs->a0 = fn(regs); } -static inline bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs) -{ - return false; -} - asmlinkage long sys_riscv_flush_icache(uintptr_t, uintptr_t, uintptr_t); asmlinkage long sys_riscv_hwprobe(struct riscv_hwprobe *, size_t, size_t, diff --git a/arch/s390/include/asm/syscall.h b/arch/s390/include/asm/syscall.h index 4271e4169f45..5f310caad1fc 100644 --- a/arch/s390/include/asm/syscall.h +++ b/arch/s390/include/asm/syscall.h @@ -89,11 +89,6 @@ static inline int syscall_get_arch(struct task_struct *task) return AUDIT_ARCH_S390X; } -static inline bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs) -{ - return false; -} - #define SYSCALL_FMT_0 #define SYSCALL_FMT_1 , "0" (r2) #define SYSCALL_FMT_2 , "d" (r3) SYSCALL_FMT_1 diff --git a/include/linux/syscall_user_dispatch.h b/include/linux/syscall_user_dispatch.h index 3858a6ffdd5c..73d69e02807d 100644 --- a/include/linux/syscall_user_dispatch.h +++ b/include/linux/syscall_user_dispatch.h @@ -10,6 +10,7 @@ #ifdef CONFIG_GENERIC_ENTRY +bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs); int set_syscall_user_dispatch(unsigned long mode, unsigned long offset, unsigned long len, char __user *selector); diff --git a/kernel/entry/syscall_user_dispatch.c b/kernel/entry/syscall_user_dispatch.c index d89dffcc2d64..acf545774d37 100644 --- a/kernel/entry/syscall_user_dispatch.c +++ b/kernel/entry/syscall_user_dispatch.c @@ -32,6 +32,11 @@ static void trigger_sigsys(struct pt_regs *regs) force_sig_info(&info); } +bool __weak arch_syscall_is_vdso_sigreturn(struct pt_regs *regs) +{ + return false; +} + bool syscall_user_dispatch(struct pt_regs *regs) { struct syscall_user_dispatch *sd = ¤t->syscall_dispatch; -- 2.34.1
