Message ID | 20191217214728.2886-11-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [v2,01/16] linux: Fix vDSO macros build with time64 interfaces | expand |
On Dez 17 2019, Adhemerval Zanella wrote: > diff --git a/sysdeps/unix/sysv/linux/clock_gettime.c b/sysdeps/unix/sysv/linux/clock_gettime.c > index 9be1f779e3..2a8ad0acc5 100644 > --- a/sysdeps/unix/sysv/linux/clock_gettime.c > +++ b/sysdeps/unix/sysv/linux/clock_gettime.c > @@ -43,13 +43,21 @@ __clock_gettime64 (clockid_t clock_id, struct __timespec64 *tp) > int r; > /* Old 32-bit ABI with possible 64-bit time_t support. */ > # ifdef __NR_clock_gettime64 > + /* Avoid issue a __NR_clock_gettime64 syscall on kernels that do not > + support 64-bit time_t. */ > + static int time64_support = 1; > + if (atomic_load_relaxed (&time64_support) == 1) Just != 0 should be enough. Andreas.
On 18/12/2019 05:53, Andreas Schwab wrote: > On Dez 17 2019, Adhemerval Zanella wrote: > >> diff --git a/sysdeps/unix/sysv/linux/clock_gettime.c b/sysdeps/unix/sysv/linux/clock_gettime.c >> index 9be1f779e3..2a8ad0acc5 100644 >> --- a/sysdeps/unix/sysv/linux/clock_gettime.c >> +++ b/sysdeps/unix/sysv/linux/clock_gettime.c >> @@ -43,13 +43,21 @@ __clock_gettime64 (clockid_t clock_id, struct __timespec64 *tp) >> int r; >> /* Old 32-bit ABI with possible 64-bit time_t support. */ >> # ifdef __NR_clock_gettime64 >> + /* Avoid issue a __NR_clock_gettime64 syscall on kernels that do not >> + support 64-bit time_t. */ >> + static int time64_support = 1; >> + if (atomic_load_relaxed (&time64_support) == 1) > > Just != 0 should be enough. > > Andreas. Ack.
On 18/12/19 3:17 am, Adhemerval Zanella wrote: > This patch avoid probing the __NR_clock_getttime64 syscall each time > __clock_gettime64 is issued on a kernel without 64 bit time support. > Once ENOSYS is obtained, only 32-bit clock_gettime are used. > > The following snippet: > > clock_gettime (CLOCK_REALTIME, &(struct timespec) { 0 }); > clock_gettime (CLOCK_MONOTONIC, &(struct timespec) { 0 }); > clock_gettime (CLOCK_BOOTTIME, &(struct timespec) { 0 }); > clock_gettime (20, &(struct timespec) { 0 }); > > On a kernel without 64 bit time support and with vDSO support results > on the following syscalls: > > syscall_0x193(0, 0xff87ba30, [...]) = -1 ENOSYS (Function not implemented) > clock_gettime(CLOCK_BOOTTIME, {tv_sec=927082, tv_nsec=474382032}) = 0 > clock_gettime(0x14 /* CLOCK_??? */, 0xff87b9f8) = -1 EINVAL (Invalid argument) > > While on a kernel without vDSO support: > > syscall_0x193(0, 0xbec95550, 0xb6ed2000, 0x1, 0xbec95550, 0) = -1 (errno 38) > clock_gettime(CLOCK_REALTIME, {tv_sec=1576615930, tv_nsec=638250162}) = 0 > clock_gettime(CLOCK_MONOTONIC, {tv_sec=1665478, tv_nsec=638779620}) = 0 > clock_gettime(CLOCK_BOOTTIME, {tv_sec=1675418, tv_nsec=292932704}) = 0 > clock_gettime(0x14 /* CLOCK_??? */, 0xbec95530) = -1 EINVAL (Invalid argument) > > Checked on i686-linux-gnu on 4.15 kernel. > --- > sysdeps/unix/sysv/linux/clock_gettime.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > OK. Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
diff --git a/sysdeps/unix/sysv/linux/clock_gettime.c b/sysdeps/unix/sysv/linux/clock_gettime.c index 9be1f779e3..2a8ad0acc5 100644 --- a/sysdeps/unix/sysv/linux/clock_gettime.c +++ b/sysdeps/unix/sysv/linux/clock_gettime.c @@ -43,13 +43,21 @@ __clock_gettime64 (clockid_t clock_id, struct __timespec64 *tp) int r; /* Old 32-bit ABI with possible 64-bit time_t support. */ # ifdef __NR_clock_gettime64 + /* Avoid issue a __NR_clock_gettime64 syscall on kernels that do not + support 64-bit time_t. */ + static int time64_support = 1; + if (atomic_load_relaxed (&time64_support) == 1) + { # ifdef HAVE_CLOCK_GETTIME64_VSYSCALL - r = INLINE_VSYSCALL (clock_gettime64, 2, clock_id, tp); + r = INLINE_VSYSCALL (clock_gettime64, 2, clock_id, tp); # else - r = INLINE_SYSCALL_CALL (clock_gettime64, clock_id, tp); + r = INLINE_SYSCALL_CALL (clock_gettime64, clock_id, tp); # endif - if (r == 0 || errno != ENOSYS) - return r; + if (r == 0 || errno != ENOSYS) + return r; + + atomic_store_relaxed (&time64_support, 0); + } # endif /* Fallback code that uses 32-bit support. */ struct timespec tp32;