Message ID | 20211020223920.2810727-1-alistair.francis@opensource.wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v4,1/4] perf bench futex: Call the futex syscall from a function | expand |
Em Thu, Oct 21, 2021 at 08:39:17AM +1000, Alistair Francis escreveu: > From: Alistair Francis <alistair.francis@wdc.com> > > 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 <alistair.francis@wdc.com> > Acked-by: Davidlohr Bueso <dbueso@suse.de> > --- > 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]$
On Thu, Oct 21, 2021 at 11:25 PM Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com> wrote: > > Em Thu, Oct 21, 2021 at 08:39:17AM +1000, Alistair Francis escreveu: > > From: Alistair Francis <alistair.francis@wdc.com> > > > > 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 <alistair.francis@wdc.com> > > Acked-by: Davidlohr Bueso <dbueso@suse.de> > > --- > > 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]$ > >
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 */