[PATCH] perf bench futex: Define SYS_futex on 32-bit arches with 64-bit time_t

Nylon Chen posted 1 patch 3 weeks, 3 days ago
tools/perf/bench/futex.h | 11 +++++++++++
1 file changed, 11 insertions(+)
[PATCH] perf bench futex: Define SYS_futex on 32-bit arches with 64-bit time_t
Posted by Nylon Chen 3 weeks, 3 days ago
The kernel does not provide sys_futex() on 32-bit architectures that lack
a 32-bit time representation, such as riscv32. Consequently glibc does not
define SYS_futex there, only SYS_futex_time64, and perf bench's futex
benchmarks fail to build:

  bench/futex.h: In function 'futex_syscall':
  bench/futex.h:77:18: error: 'SYS_futex' undeclared (first use in this function)

Define SYS_futex as SYS_futex_time64 when only the latter is available.
The guard and its comment are taken verbatim from
tools/testing/selftests/futex/include/futextest.h, where they were added by
commit 04850819c65c ("selftests/futex: Define SYS_futex on 32-bit
architectures with 64-bit time_t"), keeping the two futex userspace headers
in sync.

No timespec conversion helper is needed on top of this. glibc lays out
struct timespec on 32-bit architectures with 64-bit time_t as
{ int64 tv_sec; int32 tv_nsec; 32-bit pad }, which is compatible with
struct __kernel_timespec, and every futex_wait()/futex_lock_pi()/
futex_wait_requeue_pi() call site in perf bench passes a NULL timeout
anyway, so no timespec ever crosses the syscall boundary here.

Note that an earlier and more ambitious attempt at this was
commit c1ff12dac465 ("perf bench futex: Add support for 32-bit systems
with 64-bit time_t"), reverted by
commit ba4026b09d83 ("Revert "perf bench futex: Add support for 32-bit
systems with 64-bit time_t"") because it included linux/time_types.h,
which is unavailable on older distributions. This change deliberately
avoids that dependency and adds only the one guard needed to fix
compilation.

Signed-off-by: Nylon Chen <nylon.chen@sifive.com>
---
 tools/perf/bench/futex.h | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/tools/perf/bench/futex.h b/tools/perf/bench/futex.h
index fcb72d682cf8..6df8837b365b 100644
--- a/tools/perf/bench/futex.h
+++ b/tools/perf/bench/futex.h
@@ -14,6 +14,17 @@
 #include <sys/types.h>
 #include <linux/futex.h>
 
+/*
+ * SYS_futex is expected from system C library, in glibc some 32-bit
+ * architectures (e.g. RV32) are using 64-bit time_t, therefore it doesn't have
+ * SYS_futex defined but just SYS_futex_time64. Define SYS_futex as
+ * SYS_futex_time64 in this situation to ensure the compilation and the
+ * compatibility.
+ */
+#if !defined(SYS_futex) && defined(SYS_futex_time64)
+#define SYS_futex SYS_futex_time64
+#endif
+
 struct bench_futex_parameters {
 	bool silent;
 	bool fshared;

base-commit: 66498c75b4f8017f62d720d9b59675bdf3abce91
-- 
2.43.7
Re: [PATCH] perf bench futex: Define SYS_futex on 32-bit arches with 64-bit time_t
Posted by Ian Rogers 3 weeks, 2 days ago
On Wed, Sep 2, 2026 at 2:32 AM Nylon Chen <nylon.chen@sifive.com> wrote:
>
> The kernel does not provide sys_futex() on 32-bit architectures that lack
> a 32-bit time representation, such as riscv32. Consequently glibc does not
> define SYS_futex there, only SYS_futex_time64, and perf bench's futex
> benchmarks fail to build:
>
>   bench/futex.h: In function 'futex_syscall':
>   bench/futex.h:77:18: error: 'SYS_futex' undeclared (first use in this function)
>
> Define SYS_futex as SYS_futex_time64 when only the latter is available.
> The guard and its comment are taken verbatim from
> tools/testing/selftests/futex/include/futextest.h, where they were added by
> commit 04850819c65c ("selftests/futex: Define SYS_futex on 32-bit
> architectures with 64-bit time_t"), keeping the two futex userspace headers
> in sync.
>
> No timespec conversion helper is needed on top of this. glibc lays out
> struct timespec on 32-bit architectures with 64-bit time_t as
> { int64 tv_sec; int32 tv_nsec; 32-bit pad }, which is compatible with
> struct __kernel_timespec, and every futex_wait()/futex_lock_pi()/
> futex_wait_requeue_pi() call site in perf bench passes a NULL timeout
> anyway, so no timespec ever crosses the syscall boundary here.
>
> Note that an earlier and more ambitious attempt at this was
> commit c1ff12dac465 ("perf bench futex: Add support for 32-bit systems
> with 64-bit time_t"), reverted by
> commit ba4026b09d83 ("Revert "perf bench futex: Add support for 32-bit
> systems with 64-bit time_t"") because it included linux/time_types.h,
> which is unavailable on older distributions. This change deliberately
> avoids that dependency and adds only the one guard needed to fix
> compilation.
>
> Signed-off-by: Nylon Chen <nylon.chen@sifive.com>

Reviewed-by: Ian Rogers <irogers@google.com>

Thanks,
Ian

> ---
>  tools/perf/bench/futex.h | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/tools/perf/bench/futex.h b/tools/perf/bench/futex.h
> index fcb72d682cf8..6df8837b365b 100644
> --- a/tools/perf/bench/futex.h
> +++ b/tools/perf/bench/futex.h
> @@ -14,6 +14,17 @@
>  #include <sys/types.h>
>  #include <linux/futex.h>
>
> +/*
> + * SYS_futex is expected from system C library, in glibc some 32-bit
> + * architectures (e.g. RV32) are using 64-bit time_t, therefore it doesn't have
> + * SYS_futex defined but just SYS_futex_time64. Define SYS_futex as
> + * SYS_futex_time64 in this situation to ensure the compilation and the
> + * compatibility.
> + */
> +#if !defined(SYS_futex) && defined(SYS_futex_time64)
> +#define SYS_futex SYS_futex_time64
> +#endif
> +
>  struct bench_futex_parameters {
>         bool silent;
>         bool fshared;
>
> base-commit: 66498c75b4f8017f62d720d9b59675bdf3abce91
> --
> 2.43.7
>
Re: [PATCH] perf bench futex: Define SYS_futex on 32-bit arches with 64-bit time_t
Posted by Arnaldo Carvalho de Melo 2 weeks, 3 days ago
On Wed, Sep 02, 2026 at 10:04:14PM -0700, Ian Rogers wrote:
> On Wed, Sep 2, 2026 at 2:32 AM Nylon Chen <nylon.chen@sifive.com> wrote:
> >
> > The kernel does not provide sys_futex() on 32-bit architectures that lack
> > a 32-bit time representation, such as riscv32. Consequently glibc does not
> > define SYS_futex there, only SYS_futex_time64, and perf bench's futex
> > benchmarks fail to build:
> >
> >   bench/futex.h: In function 'futex_syscall':
> >   bench/futex.h:77:18: error: 'SYS_futex' undeclared (first use in this function)
> >
> > Define SYS_futex as SYS_futex_time64 when only the latter is available.
> > The guard and its comment are taken verbatim from
> > tools/testing/selftests/futex/include/futextest.h, where they were added by
> > commit 04850819c65c ("selftests/futex: Define SYS_futex on 32-bit
> > architectures with 64-bit time_t"), keeping the two futex userspace headers
> > in sync.
> >
> > No timespec conversion helper is needed on top of this. glibc lays out
> > struct timespec on 32-bit architectures with 64-bit time_t as
> > { int64 tv_sec; int32 tv_nsec; 32-bit pad }, which is compatible with
> > struct __kernel_timespec, and every futex_wait()/futex_lock_pi()/
> > futex_wait_requeue_pi() call site in perf bench passes a NULL timeout
> > anyway, so no timespec ever crosses the syscall boundary here.
> >
> > Note that an earlier and more ambitious attempt at this was
> > commit c1ff12dac465 ("perf bench futex: Add support for 32-bit systems
> > with 64-bit time_t"), reverted by
> > commit ba4026b09d83 ("Revert "perf bench futex: Add support for 32-bit
> > systems with 64-bit time_t"") because it included linux/time_types.h,
> > which is unavailable on older distributions. This change deliberately
> > avoids that dependency and adds only the one guard needed to fix
> > compilation.
> >
> > Signed-off-by: Nylon Chen <nylon.chen@sifive.com>
> 
> Reviewed-by: Ian Rogers <irogers@google.com>

Thanks, applied to perf-tools-next, for v7.4.

- Arnaldo