tools/perf/bench/futex.h | 11 +++++++++++ 1 file changed, 11 insertions(+)
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
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
>
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
© 2016 - 2026 Red Hat, Inc.