2021-10-20 22:43:13

by Alistair Francis

[permalink] [raw]
Subject: [PATCH v4 1/4] perf bench futex: Call the futex syscall from a function

From: Alistair Francis <[email protected]>

In preparation for a more complex futex() function let's convert the
current macro into two functions. We need two functions to avoid
compiler failures as the macro is overloaded.

This will allow us to include pre-processor conditionals in the futex
syscall functions.

Signed-off-by: Alistair Francis <[email protected]>
Acked-by: Davidlohr Bueso <[email protected]>
---
tools/perf/bench/futex.h | 43 ++++++++++++++++++++++++----------------
1 file changed, 26 insertions(+), 17 deletions(-)

diff --git a/tools/perf/bench/futex.h b/tools/perf/bench/futex.h
index b3853aac3021c..b97a343e7ec66 100644
--- a/tools/perf/bench/futex.h
+++ b/tools/perf/bench/futex.h
@@ -28,7 +28,7 @@ struct bench_futex_parameters {
};

/**
- * futex() - SYS_futex syscall wrapper
+ * futex_syscall() - SYS_futex syscall wrapper
* @uaddr: address of first futex
* @op: futex op code
* @val: typically expected value of uaddr, but varies by op
@@ -38,17 +38,26 @@ struct bench_futex_parameters {
* @val3: varies by op
* @opflags: flags to be bitwise OR'd with op, such as FUTEX_PRIVATE_FLAG
*
- * futex() is used by all the following futex op wrappers. It can also be
+ * futex_syscall() is used by all the following futex op wrappers. It can also be
* used for misuse and abuse testing. Generally, the specific op wrappers
- * should be used instead. It is a macro instead of an static inline function as
- * some of the types over overloaded (timeout is used for nr_requeue for
- * example).
+ * should be used instead.
*
* These argument descriptions are the defaults for all
* like-named arguments in the following wrappers except where noted below.
*/
-#define futex(uaddr, op, val, timeout, uaddr2, val3, opflags) \
- syscall(SYS_futex, uaddr, op | opflags, val, timeout, uaddr2, val3)
+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, ts32, uaddr2, val3);
+}
+
+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);
+}

/**
* futex_wait() - block on uaddr with optional timeout
@@ -57,7 +66,7 @@ struct bench_futex_parameters {
static inline int
futex_wait(u_int32_t *uaddr, u_int32_t val, struct timespec *timeout, int opflags)
{
- return futex(uaddr, FUTEX_WAIT, val, timeout, NULL, 0, opflags);
+ return futex_syscall(uaddr, FUTEX_WAIT, val, timeout, NULL, 0, opflags);
}

/**
@@ -67,7 +76,7 @@ futex_wait(u_int32_t *uaddr, u_int32_t val, struct timespec *timeout, int opflag
static inline int
futex_wake(u_int32_t *uaddr, int nr_wake, int opflags)
{
- return futex(uaddr, FUTEX_WAKE, nr_wake, NULL, NULL, 0, opflags);
+ return futex_syscall(uaddr, FUTEX_WAKE, nr_wake, NULL, NULL, 0, opflags);
}

/**
@@ -76,7 +85,7 @@ futex_wake(u_int32_t *uaddr, int nr_wake, int opflags)
static inline int
futex_lock_pi(u_int32_t *uaddr, struct timespec *timeout, int opflags)
{
- return futex(uaddr, FUTEX_LOCK_PI, 0, timeout, NULL, 0, opflags);
+ return futex_syscall(uaddr, FUTEX_LOCK_PI, 0, timeout, NULL, 0, opflags);
}

/**
@@ -85,7 +94,7 @@ futex_lock_pi(u_int32_t *uaddr, struct timespec *timeout, int opflags)
static inline int
futex_unlock_pi(u_int32_t *uaddr, int opflags)
{
- return futex(uaddr, FUTEX_UNLOCK_PI, 0, NULL, NULL, 0, opflags);
+ return futex_syscall(uaddr, FUTEX_UNLOCK_PI, 0, NULL, NULL, 0, opflags);
}

/**
@@ -97,8 +106,8 @@ static inline int
futex_cmp_requeue(u_int32_t *uaddr, u_int32_t val, u_int32_t *uaddr2, int nr_wake,
int nr_requeue, int opflags)
{
- return futex(uaddr, FUTEX_CMP_REQUEUE, nr_wake, nr_requeue, uaddr2,
- val, opflags);
+ return futex_syscall_nr_requeue(uaddr, FUTEX_CMP_REQUEUE, nr_wake, nr_requeue, uaddr2,
+ val, opflags);
}

/**
@@ -113,8 +122,8 @@ static inline int
futex_wait_requeue_pi(u_int32_t *uaddr, u_int32_t val, u_int32_t *uaddr2,
struct timespec *timeout, int opflags)
{
- return futex(uaddr, FUTEX_WAIT_REQUEUE_PI, val, timeout, uaddr2, 0,
- opflags);
+ return futex_syscall(uaddr, FUTEX_WAIT_REQUEUE_PI, val, timeout, uaddr2, 0,
+ opflags);
}

/**
@@ -130,8 +139,8 @@ static inline int
futex_cmp_requeue_pi(u_int32_t *uaddr, u_int32_t val, u_int32_t *uaddr2,
int nr_requeue, int opflags)
{
- return futex(uaddr, FUTEX_CMP_REQUEUE_PI, 1, nr_requeue, uaddr2,
- val, opflags);
+ return futex_syscall_nr_requeue(uaddr, FUTEX_CMP_REQUEUE_PI, 1, nr_requeue, uaddr2,
+ val, opflags);
}

#endif /* _FUTEX_H */
--
2.31.1


2021-10-20 22:43:13

by Alistair Francis

[permalink] [raw]
Subject: [PATCH v4 2/4] perf bench futex: Add support for 32-bit systems with 64-bit time_t

From: Alistair Francis <[email protected]>

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 <[email protected]>
Reviewed-by: Arnd Bergmann <[email protected]>
Acked-by: Davidlohr Bueso <[email protected]>
---
tools/perf/bench/futex.h | 43 +++++++++++++++++++++++++++++++++++++---
1 file changed, 40 insertions(+), 3 deletions(-)

diff --git a/tools/perf/bench/futex.h b/tools/perf/bench/futex.h
index b97a343e7ec66..6a7dd86871eb8 100644
--- a/tools/perf/bench/futex.h
+++ b/tools/perf/bench/futex.h
@@ -8,10 +8,12 @@
#ifndef _FUTEX_H
#define _FUTEX_H

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

struct bench_futex_parameters {
bool silent;
@@ -28,7 +30,7 @@ struct bench_futex_parameters {
};

/**
- * futex_syscall() - SYS_futex syscall wrapper
+ * futex_syscall() - __NR_futex syscall wrapper
* @uaddr: address of first futex
* @op: futex op code
* @val: typically expected value of uaddr, but varies by op
@@ -49,14 +51,49 @@ 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, ts32, 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
}

/**
--
2.31.1

2021-10-20 22:43:28

by Alistair Francis

[permalink] [raw]
Subject: [PATCH v4 3/4] selftests: futex: Call the futex syscall from a function

From: Alistair Francis <[email protected]>

Call the futex syscall from a function

In preparation for a more complex futex() function let's convert the
current macro into two functions. We need two functions to avoid
compiler failures as the macro is overloaded.

This will allow us to include pre-processor conditionals in the futex
syscall functions.

Signed-off-by: Alistair Francis <[email protected]>
---
.../selftests/futex/include/futextest.h | 59 +++++++++++--------
1 file changed, 34 insertions(+), 25 deletions(-)

diff --git a/tools/testing/selftests/futex/include/futextest.h b/tools/testing/selftests/futex/include/futextest.h
index ddbcfc9b7bac4..1b133f81e9b7b 100644
--- a/tools/testing/selftests/futex/include/futextest.h
+++ b/tools/testing/selftests/futex/include/futextest.h
@@ -48,7 +48,7 @@ typedef volatile u_int32_t futex_t;
#endif

/**
- * futex() - SYS_futex syscall wrapper
+ * futex_syscall() - SYS_futex syscall wrapper
* @uaddr: address of first futex
* @op: futex op code
* @val: typically expected value of uaddr, but varies by op
@@ -58,17 +58,26 @@ typedef volatile u_int32_t futex_t;
* @val3: varies by op
* @opflags: flags to be bitwise OR'd with op, such as FUTEX_PRIVATE_FLAG
*
- * futex() is used by all the following futex op wrappers. It can also be
+ * futex_syscall() is used by all the following futex op wrappers. It can also be
* used for misuse and abuse testing. Generally, the specific op wrappers
- * should be used instead. It is a macro instead of an static inline function as
- * some of the types over overloaded (timeout is used for nr_requeue for
- * example).
+ * should be used instead.
*
* These argument descriptions are the defaults for all
* like-named arguments in the following wrappers except where noted below.
*/
-#define futex(uaddr, op, val, timeout, uaddr2, val3, opflags) \
- syscall(SYS_futex, uaddr, op | opflags, val, timeout, uaddr2, val3)
+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, ts32, uaddr2, val3);
+}
+
+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);
+}

/**
* futex_wait() - block on uaddr with optional timeout
@@ -77,7 +86,7 @@ typedef volatile u_int32_t futex_t;
static inline int
futex_wait(futex_t *uaddr, futex_t val, struct timespec *timeout, int opflags)
{
- return futex(uaddr, FUTEX_WAIT, val, timeout, NULL, 0, opflags);
+ return futex_syscall(uaddr, FUTEX_WAIT, val, timeout, NULL, 0, opflags);
}

/**
@@ -87,7 +96,7 @@ futex_wait(futex_t *uaddr, futex_t val, struct timespec *timeout, int opflags)
static inline int
futex_wake(futex_t *uaddr, int nr_wake, int opflags)
{
- return futex(uaddr, FUTEX_WAKE, nr_wake, NULL, NULL, 0, opflags);
+ return futex_syscall(uaddr, FUTEX_WAKE, nr_wake, NULL, NULL, 0, opflags);
}

/**
@@ -98,8 +107,8 @@ static inline int
futex_wait_bitset(futex_t *uaddr, futex_t val, struct timespec *timeout,
u_int32_t bitset, int opflags)
{
- return futex(uaddr, FUTEX_WAIT_BITSET, val, timeout, NULL, bitset,
- opflags);
+ return futex_syscall(uaddr, FUTEX_WAIT_BITSET, val, timeout, NULL, bitset,
+ opflags);
}

/**
@@ -109,8 +118,8 @@ futex_wait_bitset(futex_t *uaddr, futex_t val, struct timespec *timeout,
static inline int
futex_wake_bitset(futex_t *uaddr, int nr_wake, u_int32_t bitset, int opflags)
{
- return futex(uaddr, FUTEX_WAKE_BITSET, nr_wake, NULL, NULL, bitset,
- opflags);
+ return futex_syscall(uaddr, FUTEX_WAKE_BITSET, nr_wake, NULL, NULL, bitset,
+ opflags);
}

/**
@@ -121,7 +130,7 @@ static inline int
futex_lock_pi(futex_t *uaddr, struct timespec *timeout, int detect,
int opflags)
{
- return futex(uaddr, FUTEX_LOCK_PI, detect, timeout, NULL, 0, opflags);
+ return futex_syscall(uaddr, FUTEX_LOCK_PI, detect, timeout, NULL, 0, opflags);
}

/**
@@ -130,7 +139,7 @@ futex_lock_pi(futex_t *uaddr, struct timespec *timeout, int detect,
static inline int
futex_unlock_pi(futex_t *uaddr, int opflags)
{
- return futex(uaddr, FUTEX_UNLOCK_PI, 0, NULL, NULL, 0, opflags);
+ return futex_syscall(uaddr, FUTEX_UNLOCK_PI, 0, NULL, NULL, 0, opflags);
}

/**
@@ -140,8 +149,8 @@ static inline int
futex_wake_op(futex_t *uaddr, futex_t *uaddr2, int nr_wake, int nr_wake2,
int wake_op, int opflags)
{
- return futex(uaddr, FUTEX_WAKE_OP, nr_wake, nr_wake2, uaddr2, wake_op,
- opflags);
+ return futex_syscall_nr_requeue(uaddr, FUTEX_WAKE_OP, nr_wake, nr_wake2, uaddr2, wake_op,
+ opflags);
}

/**
@@ -156,8 +165,8 @@ static inline int
futex_requeue(futex_t *uaddr, futex_t *uaddr2, int nr_wake, int nr_requeue,
int opflags)
{
- return futex(uaddr, FUTEX_REQUEUE, nr_wake, nr_requeue, uaddr2, 0,
- opflags);
+ return futex_syscall_nr_requeue(uaddr, FUTEX_REQUEUE, nr_wake, nr_requeue, uaddr2, 0,
+ opflags);
}

/**
@@ -169,8 +178,8 @@ static inline int
futex_cmp_requeue(futex_t *uaddr, futex_t val, futex_t *uaddr2, int nr_wake,
int nr_requeue, int opflags)
{
- return futex(uaddr, FUTEX_CMP_REQUEUE, nr_wake, nr_requeue, uaddr2,
- val, opflags);
+ return futex_syscall_nr_requeue(uaddr, FUTEX_CMP_REQUEUE, nr_wake, nr_requeue, uaddr2,
+ val, opflags);
}

/**
@@ -185,8 +194,8 @@ static inline int
futex_wait_requeue_pi(futex_t *uaddr, futex_t val, futex_t *uaddr2,
struct timespec *timeout, int opflags)
{
- return futex(uaddr, FUTEX_WAIT_REQUEUE_PI, val, timeout, uaddr2, 0,
- opflags);
+ return futex_syscall(uaddr, FUTEX_WAIT_REQUEUE_PI, val, timeout, uaddr2, 0,
+ opflags);
}

/**
@@ -200,8 +209,8 @@ static inline int
futex_cmp_requeue_pi(futex_t *uaddr, futex_t val, futex_t *uaddr2, int nr_wake,
int nr_requeue, int opflags)
{
- return futex(uaddr, FUTEX_CMP_REQUEUE_PI, nr_wake, nr_requeue, uaddr2,
- val, opflags);
+ return futex_syscall_nr_requeue(uaddr, FUTEX_CMP_REQUEUE_PI, nr_wake, nr_requeue, uaddr2,
+ val, opflags);
}

/**
--
2.31.1

2021-10-21 13:28:14

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH v4 1/4] perf bench futex: Call the futex syscall from a function

Em Thu, Oct 21, 2021 at 08:39:17AM +1000, Alistair Francis escreveu:
> From: Alistair Francis <[email protected]>
>
> In preparation for a more complex futex() function let's convert the
> current macro into two functions. We need two functions to avoid
> compiler failures as the macro is overloaded.
>
> This will allow us to include pre-processor conditionals in the futex
> syscall functions.
>
> Signed-off-by: Alistair Francis <[email protected]>
> Acked-by: Davidlohr Bueso <[email protected]>
> ---
> tools/perf/bench/futex.h | 43 ++++++++++++++++++++++++----------------
> 1 file changed, 26 insertions(+), 17 deletions(-)

Right after applying this one:

In file included from bench/futex-hash.c:29:
bench/futex.h: In function ‘futex_syscall’:
bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
| ^~~~
| s32
bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
| ~~~~~~~~~~~~~~~~~^~~~~~~
bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
53 | }
| ^
cc1: all warnings being treated as errors
make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-hash.o] Error 1
make[4]: *** Waiting for unfinished jobs....
In file included from bench/futex-wake-parallel.c:31:
bench/futex.h: In function ‘futex_syscall’:
bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
| ^~~~
| s32
bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
| ~~~~~~~~~~~~~~~~~^~~~~~~
bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
53 | }
| ^
cc1: all warnings being treated as errors
make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-wake-parallel.o] Error 1
In file included from bench/futex-requeue.c:26:
bench/futex.h: In function ‘futex_syscall’:
bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
| ^~~~
| s32
bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
| ~~~~~~~~~~~~~~~~~^~~~~~~
bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
53 | }
| ^
cc1: all warnings being treated as errors
In file included from bench/futex-lock-pi.c:19:
bench/futex.h: In function ‘futex_syscall’:
bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
| ^~~~
| s32
bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
| ~~~~~~~~~~~~~~~~~^~~~~~~
bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
53 | }
| ^
cc1: all warnings being treated as errors
make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-requeue.o] Error 1
make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-lock-pi.o] Error 1
In file included from bench/futex-wake.c:25:
bench/futex.h: In function ‘futex_syscall’:
bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
| ^~~~
| s32
bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
| ~~~~~~~~~~~~~~~~~^~~~~~~
bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
53 | }
| ^
cc1: all warnings being treated as errors
make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-wake.o] Error 1
make[3]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:139: bench] Error 2
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [Makefile.perf:660: /tmp/build/perf/perf-in.o] Error 2
make[1]: *** [Makefile.perf:240: sub-make] Error 2
make: *** [Makefile:113: install-bin] Error 2
make: Leaving directory '/var/home/acme/git/perf/tools/perf'

Performance counter stats for 'make -k BUILD_BPF_SKEL=1 CORESIGHT=1 PYTHON=python3 O=/tmp/build/perf -C tools/perf install-bin':

2,467.00 msec task-clock:u # 1.263 CPUs utilized
2,457.82 msec cpu-clock:u # 1.259 CPUs utilized

1.952573032 seconds time elapsed

1.444401000 seconds user
1.111434000 seconds sys


⬢[acme@toolbox perf]$


2021-10-22 00:37:45

by Alistair Francis

[permalink] [raw]
Subject: Re: [PATCH v4 1/4] perf bench futex: Call the futex syscall from a function

On Thu, Oct 21, 2021 at 11:25 PM Arnaldo Carvalho de Melo
<[email protected]> wrote:
>
> Em Thu, Oct 21, 2021 at 08:39:17AM +1000, Alistair Francis escreveu:
> > From: Alistair Francis <[email protected]>
> >
> > In preparation for a more complex futex() function let's convert the
> > current macro into two functions. We need two functions to avoid
> > compiler failures as the macro is overloaded.
> >
> > This will allow us to include pre-processor conditionals in the futex
> > syscall functions.
> >
> > Signed-off-by: Alistair Francis <[email protected]>
> > Acked-by: Davidlohr Bueso <[email protected]>
> > ---
> > tools/perf/bench/futex.h | 43 ++++++++++++++++++++++++----------------
> > 1 file changed, 26 insertions(+), 17 deletions(-)
>
> Right after applying this one:
>
> In file included from bench/futex-hash.c:29:
> bench/futex.h: In function ‘futex_syscall’:
> bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
> 52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
> | ^~~~
> | s32

Sorry about that. There is a copy and paste error here. I have fixed this patch.

Alistair

> bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
> bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
> 49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
> | ~~~~~~~~~~~~~~~~~^~~~~~~
> bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
> 53 | }
> | ^
> cc1: all warnings being treated as errors
> make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-hash.o] Error 1
> make[4]: *** Waiting for unfinished jobs....
> In file included from bench/futex-wake-parallel.c:31:
> bench/futex.h: In function ‘futex_syscall’:
> bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
> 52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
> | ^~~~
> | s32
> bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
> bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
> 49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
> | ~~~~~~~~~~~~~~~~~^~~~~~~
> bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
> 53 | }
> | ^
> cc1: all warnings being treated as errors
> make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-wake-parallel.o] Error 1
> In file included from bench/futex-requeue.c:26:
> bench/futex.h: In function ‘futex_syscall’:
> bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
> 52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
> | ^~~~
> | s32
> bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
> bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
> 49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
> | ~~~~~~~~~~~~~~~~~^~~~~~~
> bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
> 53 | }
> | ^
> cc1: all warnings being treated as errors
> In file included from bench/futex-lock-pi.c:19:
> bench/futex.h: In function ‘futex_syscall’:
> bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
> 52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
> | ^~~~
> | s32
> bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
> bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
> 49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
> | ~~~~~~~~~~~~~~~~~^~~~~~~
> bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
> 53 | }
> | ^
> cc1: all warnings being treated as errors
> make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-requeue.o] Error 1
> make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-lock-pi.o] Error 1
> In file included from bench/futex-wake.c:25:
> bench/futex.h: In function ‘futex_syscall’:
> bench/futex.h:52:61: error: ‘ts32’ undeclared (first use in this function); did you mean ‘s32’?
> 52 | return syscall(SYS_futex, uaddr, op | opflags, val, ts32, uaddr2, val3);
> | ^~~~
> | s32
> bench/futex.h:52:61: note: each undeclared identifier is reported only once for each function it appears in
> bench/futex.h:49:82: error: unused parameter ‘timeout’ [-Werror=unused-parameter]
> 49 | futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
> | ~~~~~~~~~~~~~~~~~^~~~~~~
> bench/futex.h:53:1: error: control reaches end of non-void function [-Werror=return-type]
> 53 | }
> | ^
> cc1: all warnings being treated as errors
> make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/bench/futex-wake.o] Error 1
> make[3]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:139: bench] Error 2
> make[3]: *** Waiting for unfinished jobs....
> make[2]: *** [Makefile.perf:660: /tmp/build/perf/perf-in.o] Error 2
> make[1]: *** [Makefile.perf:240: sub-make] Error 2
> make: *** [Makefile:113: install-bin] Error 2
> make: Leaving directory '/var/home/acme/git/perf/tools/perf'
>
> Performance counter stats for 'make -k BUILD_BPF_SKEL=1 CORESIGHT=1 PYTHON=python3 O=/tmp/build/perf -C tools/perf install-bin':
>
> 2,467.00 msec task-clock:u # 1.263 CPUs utilized
> 2,457.82 msec cpu-clock:u # 1.259 CPUs utilized
>
> 1.952573032 seconds time elapsed
>
> 1.444401000 seconds user
> 1.111434000 seconds sys
>
>
> ⬢[acme@toolbox perf]$
>
>