lkml.org 
[lkml]   [2021]   [Oct]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 4/4] selftests: futex: Add support for 32-bit systems with 64-bit time_t
    Date
    From: Alistair Francis <alistair.francis@wdc.com>

    Some 32-bit architectures (such are 32-bit RISC-V) only have a 64-bit
    time_t and as such don't have the SYS_futex syscall. This patch will
    allow us to use the SYS_futex_time64 syscall on those platforms.

    This also converts the futex calls to be y2038 safe (when built for a
    5.1+ kernel).

    Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
    ---
    .../futex/functional/futex_requeue_pi.c | 2 +-
    .../selftests/futex/include/futextest.h | 44 ++++++++++++++++++-
    2 files changed, 43 insertions(+), 3 deletions(-)

    diff --git a/tools/testing/selftests/futex/functional/futex_requeue_pi.c b/tools/testing/selftests/futex/functional/futex_requeue_pi.c
    index 1ee5518ee6b7f..d3673996fed4e 100644
    --- a/tools/testing/selftests/futex/functional/futex_requeue_pi.c
    +++ b/tools/testing/selftests/futex/functional/futex_requeue_pi.c
    @@ -294,7 +294,7 @@ int unit_test(int broadcast, long lock, int third_party_owner, long timeout_ns)
    secs = (ts.tv_nsec + timeout_ns) / 1000000000;
    ts.tv_nsec = ((int64_t)ts.tv_nsec + timeout_ns) % 1000000000;
    ts.tv_sec += secs;
    - info("ts.tv_sec = %ld\n", ts.tv_sec);
    + info("ts.tv_sec = %lld\n", ts.tv_sec);
    info("ts.tv_nsec = %ld\n", ts.tv_nsec);
    tsp = &ts;
    }
    diff --git a/tools/testing/selftests/futex/include/futextest.h b/tools/testing/selftests/futex/include/futextest.h
    index c786fffecb8a5..b303d0d492ff7 100644
    --- a/tools/testing/selftests/futex/include/futextest.h
    +++ b/tools/testing/selftests/futex/include/futextest.h
    @@ -17,10 +17,12 @@
    #ifndef _FUTEXTEST_H
    #define _FUTEXTEST_H

    +#include <errno.h>
    #include <unistd.h>
    #include <sys/syscall.h>
    #include <sys/types.h>
    #include <linux/futex.h>
    +#include <linux/time_types.h>

    typedef volatile u_int32_t futex_t;
    #define FUTEX_INITIALIZER 0
    @@ -69,14 +71,52 @@ static inline int
    futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
    volatile u_int32_t *uaddr2, int val3, int opflags)
    {
    - return syscall(SYS_futex, uaddr, op | opflags, val, timeout, uaddr2, val3);
    +#if defined(__NR_futex_time64)
    + if (sizeof(*timeout) != sizeof(struct __kernel_old_timespec)) {
    + int ret = syscall(__NR_futex_time64, uaddr, op | opflags, val, timeout,
    + uaddr2, val3);
    + if (ret == 0 || errno != ENOSYS)
    + return ret;
    + }
    +#endif
    +
    +#if defined(__NR_futex)
    + if (sizeof(*timeout) == sizeof(struct __kernel_old_timespec))
    + return syscall(__NR_futex, uaddr, op | opflags, val, timeout, uaddr2, val3);
    +
    + if (timeout && timeout->tv_sec == (long)timeout->tv_sec) {
    + struct __kernel_old_timespec ts32;
    +
    + ts32.tv_sec = (__kernel_long_t) timeout->tv_sec;
    + ts32.tv_nsec = (__kernel_long_t) timeout->tv_nsec;
    +
    + return syscall(__NR_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
    + } else if (!timeout) {
    + return syscall(__NR_futex, uaddr, op | opflags, val, NULL, uaddr2, val3);
    + }
    +#endif
    +
    + errno = ENOSYS;
    + return -1;
    }

    static inline int
    futex_syscall_nr_requeue(volatile u_int32_t *uaddr, int op, u_int32_t val, int nr_requeue,
    volatile u_int32_t *uaddr2, int val3, int opflags)
    {
    - return syscall(SYS_futex, uaddr, op | opflags, val, nr_requeue, uaddr2, val3);
    +#if defined(__NR_futex_time64)
    + int ret = syscall(__NR_futex_time64, uaddr, op | opflags, val, nr_requeue,
    + uaddr2, val3);
    + if (ret == 0 || errno != ENOSYS)
    + return ret;
    +#endif
    +
    +#if defined(__NR_futex)
    + return syscall(__NR_futex, uaddr, op | opflags, val, nr_requeue, uaddr2, val3);
    +#endif
    +
    + errno = ENOSYS;
    + return -1;
    }

    /**
    --
    2.31.1
    \
     
     \ /
      Last update: 2021-10-22 03:35    [W:2.639 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site