[PATCH v16 02/18] syscall_user_dispatch: Introduce a weak fallback for arch_syscall_is_vdso_sigreturn()
Mukesh Kumar Chaurasiya
mkchauras at gmail.com
Fri Jul 3 04:13:11 PDT 2026
On Mon, Jun 29, 2026 at 09:06:00PM +0800, Jinjie Ruan wrote:
> 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 <tglx at kernel.org>
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>
> ---
> 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
>
Build and boot tested on ppc with P11 LPAR. LGTM.
Tested-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras at gmail.com>
Reviewed-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras at gmail.com>
More information about the linux-um
mailing list