Hi Arnd, On 11/8/23 12:58, Arnd Bergmann wrote: > From: Arnd Bergmann <arnd@xxxxxxxx> > > The VDSO functions are defined as globals in the kernel sources but intended > to be called from userspace, so there is no need to declare them in a kernel > side header. > > Without a prototype, this now causes warnings such as > > arch/mips/vdso/vgettimeofday.c:14:5: error: no previous prototype for '__vdso_clock_gettime' [-Werror=missing-prototypes] > arch/mips/vdso/vgettimeofday.c:28:5: error: no previous prototype for '__vdso_gettimeofday' [-Werror=missing-prototypes] > arch/mips/vdso/vgettimeofday.c:36:5: error: no previous prototype for '__vdso_clock_getres' [-Werror=missing-prototypes] > arch/mips/vdso/vgettimeofday.c:42:5: error: no previous prototype for '__vdso_clock_gettime64' [-Werror=missing-prototypes] > arch/sparc/vdso/vclock_gettime.c:254:1: error: no previous prototype for '__vdso_clock_gettime' [-Werror=missing-prototypes] > arch/sparc/vdso/vclock_gettime.c:282:1: error: no previous prototype for '__vdso_clock_gettime_stick' [-Werror=missing-prototypes] > arch/sparc/vdso/vclock_gettime.c:307:1: error: no previous prototype for '__vdso_gettimeofday' [-Werror=missing-prototypes] > arch/sparc/vdso/vclock_gettime.c:343:1: error: no previous prototype for '__vdso_gettimeofday_stick' [-Werror=missing-prototypes] > > Most architectures have already added workarounds for these by adding > declarations somewhere, but since these are all compatible, we should > really just have one copy, with an #ifdef check for the 32-bit vs > 64-bit variant and use that everywhere. > I agree, it is a good idea to have a single header for this purpose. > Unfortunately, the sparc version is currently incompatible since > that never added support for __vdso_clock_gettime64() in 32-bit > userland. For the moment, I'm leaving this one out, as I can't > easily test it and it requires a larger rework. > > Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx> Reviewed-by: Vincenzo Frascino <vincenzo.frascino@xxxxxxx> > --- > arch/arm/include/asm/vdso.h | 5 ----- > arch/arm/vdso/vgettimeofday.c | 1 + > arch/arm64/kernel/vdso32/vgettimeofday.c | 1 + > arch/csky/kernel/vdso/vgettimeofday.c | 11 +---------- > arch/loongarch/vdso/vgettimeofday.c | 7 +------ > arch/mips/vdso/vgettimeofday.c | 1 + > arch/riscv/kernel/vdso/vgettimeofday.c | 7 +------ > arch/x86/entry/vdso/vclock_gettime.c | 10 +--------- > arch/x86/include/asm/vdso/gettimeofday.h | 2 -- > arch/x86/um/vdso/um_vdso.c | 1 + > include/vdso/gettime.h | 23 +++++++++++++++++++++++ > 11 files changed, 31 insertions(+), 38 deletions(-) > create mode 100644 include/vdso/gettime.h > > diff --git a/arch/arm/include/asm/vdso.h b/arch/arm/include/asm/vdso.h > index 422c3afa806a..5b85889f82ee 100644 > --- a/arch/arm/include/asm/vdso.h > +++ b/arch/arm/include/asm/vdso.h > @@ -24,11 +24,6 @@ static inline void arm_install_vdso(struct mm_struct *mm, unsigned long addr) > > #endif /* CONFIG_VDSO */ > > -int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts); > -int __vdso_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts); > -int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz); > -int __vdso_clock_getres(clockid_t clock_id, struct old_timespec32 *res); > - > #endif /* __ASSEMBLY__ */ > > #endif /* __KERNEL__ */ > diff --git a/arch/arm/vdso/vgettimeofday.c b/arch/arm/vdso/vgettimeofday.c > index a003beacac76..3554aa35f1ba 100644 > --- a/arch/arm/vdso/vgettimeofday.c > +++ b/arch/arm/vdso/vgettimeofday.c > @@ -8,6 +8,7 @@ > #include <linux/types.h> > #include <asm/vdso.h> > #include <asm/unwind.h> > +#include <vdso/gettime.h> > > int __vdso_clock_gettime(clockid_t clock, > struct old_timespec32 *ts) > diff --git a/arch/arm64/kernel/vdso32/vgettimeofday.c b/arch/arm64/kernel/vdso32/vgettimeofday.c > index 5acff29c5991..e23c7f4ef26b 100644 > --- a/arch/arm64/kernel/vdso32/vgettimeofday.c > +++ b/arch/arm64/kernel/vdso32/vgettimeofday.c > @@ -5,6 +5,7 @@ > * Copyright (C) 2018 ARM Limited > * > */ > +#include <vdso/gettime.h> > > int __vdso_clock_gettime(clockid_t clock, > struct old_timespec32 *ts) > diff --git a/arch/csky/kernel/vdso/vgettimeofday.c b/arch/csky/kernel/vdso/vgettimeofday.c > index c4831145eed5..55af30e83752 100644 > --- a/arch/csky/kernel/vdso/vgettimeofday.c > +++ b/arch/csky/kernel/vdso/vgettimeofday.c > @@ -2,36 +2,27 @@ > > #include <linux/time.h> > #include <linux/types.h> > +#include <vdso/gettime.h> > > extern > -int __vdso_clock_gettime(clockid_t clock, > - struct old_timespec32 *ts); > int __vdso_clock_gettime(clockid_t clock, > struct old_timespec32 *ts) > { > return __cvdso_clock_gettime32(clock, ts); > } > > -int __vdso_clock_gettime64(clockid_t clock, > - struct __kernel_timespec *ts); > int __vdso_clock_gettime64(clockid_t clock, > struct __kernel_timespec *ts) > { > return __cvdso_clock_gettime(clock, ts); > } > > -extern > -int __vdso_gettimeofday(struct __kernel_old_timeval *tv, > - struct timezone *tz); > int __vdso_gettimeofday(struct __kernel_old_timeval *tv, > struct timezone *tz) > { > return __cvdso_gettimeofday(tv, tz); > } > > -extern > -int __vdso_clock_getres(clockid_t clock_id, > - struct old_timespec32 *res); > int __vdso_clock_getres(clockid_t clock_id, > struct old_timespec32 *res) > { > diff --git a/arch/loongarch/vdso/vgettimeofday.c b/arch/loongarch/vdso/vgettimeofday.c > index 8f22863bd7ea..0885c1f3a89d 100644 > --- a/arch/loongarch/vdso/vgettimeofday.c > +++ b/arch/loongarch/vdso/vgettimeofday.c > @@ -5,23 +5,18 @@ > * Copyright (C) 2020-2022 Loongson Technology Corporation Limited > */ > #include <linux/types.h> > +#include <vdso/gettime.h> > > -extern > -int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts); > int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts) > { > return __cvdso_clock_gettime(clock, ts); > } > > -extern > -int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz); > int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz) > { > return __cvdso_gettimeofday(tv, tz); > } > > -extern > -int __vdso_clock_getres(clockid_t clock_id, struct __kernel_timespec *res); > int __vdso_clock_getres(clockid_t clock_id, struct __kernel_timespec *res) > { > return __cvdso_clock_getres(clock_id, res); > diff --git a/arch/mips/vdso/vgettimeofday.c b/arch/mips/vdso/vgettimeofday.c > index 6b83b6376a4b..604afea3f336 100644 > --- a/arch/mips/vdso/vgettimeofday.c > +++ b/arch/mips/vdso/vgettimeofday.c > @@ -9,6 +9,7 @@ > */ > #include <linux/time.h> > #include <linux/types.h> > +#include <vdso/gettime.h> > > #if _MIPS_SIM != _MIPS_SIM_ABI64 > int __vdso_clock_gettime(clockid_t clock, > diff --git a/arch/riscv/kernel/vdso/vgettimeofday.c b/arch/riscv/kernel/vdso/vgettimeofday.c > index cc0d80699c31..b35057802584 100644 > --- a/arch/riscv/kernel/vdso/vgettimeofday.c > +++ b/arch/riscv/kernel/vdso/vgettimeofday.c > @@ -8,23 +8,18 @@ > > #include <linux/time.h> > #include <linux/types.h> > +#include <vdso/gettime.h> > > -extern > -int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts); > int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts) > { > return __cvdso_clock_gettime(clock, ts); > } > > -extern > -int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz); > int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz) > { > return __cvdso_gettimeofday(tv, tz); > } > > -extern > -int __vdso_clock_getres(clockid_t clock_id, struct __kernel_timespec *res); > int __vdso_clock_getres(clockid_t clock_id, struct __kernel_timespec *res) > { > return __cvdso_clock_getres(clock_id, res); > diff --git a/arch/x86/entry/vdso/vclock_gettime.c b/arch/x86/entry/vdso/vclock_gettime.c > index 7d70935b6758..0debc194bd78 100644 > --- a/arch/x86/entry/vdso/vclock_gettime.c > +++ b/arch/x86/entry/vdso/vclock_gettime.c > @@ -11,12 +11,10 @@ > #include <linux/time.h> > #include <linux/kernel.h> > #include <linux/types.h> > +#include <vdso/gettime.h> > > #include "../../../../lib/vdso/gettimeofday.c" > > -extern int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz); > -extern __kernel_old_time_t __vdso_time(__kernel_old_time_t *t); > - > int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz) > { > return __cvdso_gettimeofday(tv, tz); > @@ -35,9 +33,6 @@ __kernel_old_time_t time(__kernel_old_time_t *t) __attribute__((weak, alias("__v > > #if defined(CONFIG_X86_64) && !defined(BUILD_VDSO32_64) > /* both 64-bit and x32 use these */ > -extern int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts); > -extern int __vdso_clock_getres(clockid_t clock, struct __kernel_timespec *res); > - > int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts) > { > return __cvdso_clock_gettime(clock, ts); > @@ -56,9 +51,6 @@ int clock_getres(clockid_t, struct __kernel_timespec *) > > #else > /* i386 only */ > -extern int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts); > -extern int __vdso_clock_getres(clockid_t clock, struct old_timespec32 *res); > - > int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts) > { > return __cvdso_clock_gettime32(clock, ts); > diff --git a/arch/x86/include/asm/vdso/gettimeofday.h b/arch/x86/include/asm/vdso/gettimeofday.h > index c81858d903dc..a46edb0e0cf7 100644 > --- a/arch/x86/include/asm/vdso/gettimeofday.h > +++ b/arch/x86/include/asm/vdso/gettimeofday.h > @@ -337,8 +337,6 @@ u64 vdso_calc_delta(u64 cycles, u64 last, u64 mask, u32 mult) > } > #define vdso_calc_delta vdso_calc_delta > > -int __vdso_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts); > - > #endif /* !__ASSEMBLY__ */ > > #endif /* __ASM_VDSO_GETTIMEOFDAY_H */ > diff --git a/arch/x86/um/vdso/um_vdso.c b/arch/x86/um/vdso/um_vdso.c > index ff0f3b4b6c45..63768dd347ce 100644 > --- a/arch/x86/um/vdso/um_vdso.c > +++ b/arch/x86/um/vdso/um_vdso.c > @@ -12,6 +12,7 @@ > #include <linux/time.h> > #include <linux/getcpu.h> > #include <asm/unistd.h> > +#include <vdso/gettime.h> > > int __vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts) > { > diff --git a/include/vdso/gettime.h b/include/vdso/gettime.h > new file mode 100644 > index 000000000000..c50d152e7b3e > --- /dev/null > +++ b/include/vdso/gettime.h > @@ -0,0 +1,23 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef _VDSO_GETTIME_H > +#define _VDSO_GETTIME_H > + > +#include <linux/types.h> > + > +struct __kernel_timespec; > +struct timezone; > + > +#if !defined(CONFIG_64BIT) || defined(BUILD_VDSO32_64) > +struct old_timespec32; > +int __vdso_clock_getres(clockid_t clock, struct old_timespec32 *res); > +int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts); > +#else > +int __vdso_clock_getres(clockid_t clock, struct __kernel_timespec *res); > +int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts); > +#endif > + > +__kernel_old_time_t __vdso_time(__kernel_old_time_t *t); > +int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz); > +int __vdso_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts); > + > +#endif -- Regards, Vincenzo