* [BUG] perf tools: Build failure in v6.16-rc1
@ 2025-06-10 18:34 Namhyung Kim
2025-06-11 9:25 ` Sebastian Andrzej Siewior
0 siblings, 1 reply; 8+ messages in thread
From: Namhyung Kim @ 2025-06-10 18:34 UTC (permalink / raw)
To: linux-kernel, linux-perf-users; +Cc: acme, Sebastian Andrzej Siewior
Hello,
I've updated the perf-tools-next to v6.16-rc1 and found a build error
like below on alpine linux 3.18.
In file included from bench/futex.c:6:
/usr/include/sys/prctl.h:88:8: error: redefinition of 'struct prctl_mm_map'
88 | struct prctl_mm_map {
| ^~~~~~~~~~~~
In file included from bench/futex.c:5:
/linux/tools/include/uapi/linux/prctl.h:134:8: note: originally defined here
134 | struct prctl_mm_map {
| ^~~~~~~~~~~~
make[4]: *** [/linux/tools/build/Makefile.build:86: /build/bench/futex.o] Error 1
git bisect says it's the first commit introduced the failure.
commit 60035a3981a7f9d965df81a48a07b94e52ccd54f
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Wed Apr 16 18:29:19 2025 +0200
tools/perf: Allow to select the number of hash buckets
Add the -b/ --buckets argument to specify the number of hash buckets for
the private futex hash. This is directly passed to
prctl(PR_FUTEX_HASH, PR_FUTEX_HASH_SET_SLOTS, buckets, immutable)
and must return without an error if specified. The `immutable' is 0 by
default and can be set to 1 via the -I/ --immutable argument.
The size of the private hash is verified with PR_FUTEX_HASH_GET_SLOTS.
If PR_FUTEX_HASH_GET_SLOTS failed then it is assumed that an older
kernel was used without the support and that the global hash is used.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250416162921.513656-20-bigeasy@linutronix.de
Thanks,
Namhyung
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [BUG] perf tools: Build failure in v6.16-rc1
2025-06-10 18:34 [BUG] perf tools: Build failure in v6.16-rc1 Namhyung Kim
@ 2025-06-11 9:25 ` Sebastian Andrzej Siewior
2025-06-11 13:14 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 8+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-06-11 9:25 UTC (permalink / raw)
To: Namhyung Kim; +Cc: linux-kernel, linux-perf-users, acme
On 2025-06-10 11:34:44 [-0700], Namhyung Kim wrote:
> Hello,
Hi,
> I've updated the perf-tools-next to v6.16-rc1 and found a build error
> like below on alpine linux 3.18.
>
> In file included from bench/futex.c:6:
> /usr/include/sys/prctl.h:88:8: error: redefinition of 'struct prctl_mm_map'
> 88 | struct prctl_mm_map {
> | ^~~~~~~~~~~~
> In file included from bench/futex.c:5:
> /linux/tools/include/uapi/linux/prctl.h:134:8: note: originally defined here
> 134 | struct prctl_mm_map {
> | ^~~~~~~~~~~~
> make[4]: *** [/linux/tools/build/Makefile.build:86: /build/bench/futex.o] Error 1
>
> git bisect says it's the first commit introduced the failure.
Hmm. So your /usr/include/sys/prctl.h and
/linux/tools/include/uapi/linux/prctl.h both provide struct
prctl_mm_map but their include guard must be different.
My /usr/include/sys/prctl.h is provided by glibc and contains the
prctl() declaration. It includes also linux/prctl.h.
The tools/include/uapi/linux/prctl.h is the same as
/usr/include/linux/prctl.h.
The /usr/include/sys/prctl.h on alpine linux is different. This is
probably coming from musl. It contains the PR_* definition and the
prctl() declaration. So it clashes here because now the one struct is
available twice.
The man page for prctl(2) says:
| #include <linux/prctl.h> /* Definition of PR_* constants */
| #include <sys/prctl.h>
so musl doesn't follow this.
To align with the other builds, I guess the following help:
diff --git a/tools/perf/bench/futex.c b/tools/perf/bench/futex.c
index 26382e4d8d4ce..540261f299b1d 100644
--- a/tools/perf/bench/futex.c
+++ b/tools/perf/bench/futex.c
@@ -2,7 +2,6 @@
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
-#include <linux/prctl.h>
#include <sys/prctl.h>
#include "futex.h"
Sebastian
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [BUG] perf tools: Build failure in v6.16-rc1
2025-06-11 9:25 ` Sebastian Andrzej Siewior
@ 2025-06-11 13:14 ` Arnaldo Carvalho de Melo
2025-06-11 14:55 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2025-06-11 13:14 UTC (permalink / raw)
To: Sebastian Andrzej Siewior; +Cc: Namhyung Kim, linux-kernel, linux-perf-users
On Wed, Jun 11, 2025 at 11:25:42AM +0200, Sebastian Andrzej Siewior wrote:
> On 2025-06-10 11:34:44 [-0700], Namhyung Kim wrote:
> > Hello,
> Hi,
>
> > I've updated the perf-tools-next to v6.16-rc1 and found a build error
> > like below on alpine linux 3.18.
> >
> > In file included from bench/futex.c:6:
> > /usr/include/sys/prctl.h:88:8: error: redefinition of 'struct prctl_mm_map'
> > 88 | struct prctl_mm_map {
> > | ^~~~~~~~~~~~
> > In file included from bench/futex.c:5:
> > /linux/tools/include/uapi/linux/prctl.h:134:8: note: originally defined here
> > 134 | struct prctl_mm_map {
> > | ^~~~~~~~~~~~
> > make[4]: *** [/linux/tools/build/Makefile.build:86: /build/bench/futex.o] Error 1
> >
> > git bisect says it's the first commit introduced the failure.
>
> Hmm. So your /usr/include/sys/prctl.h and
> /linux/tools/include/uapi/linux/prctl.h both provide struct
> prctl_mm_map but their include guard must be different.
>
> My /usr/include/sys/prctl.h is provided by glibc and contains the
> prctl() declaration. It includes also linux/prctl.h.
> The tools/include/uapi/linux/prctl.h is the same as
> /usr/include/linux/prctl.h.
>
> The /usr/include/sys/prctl.h on alpine linux is different. This is
> probably coming from musl. It contains the PR_* definition and the
> prctl() declaration. So it clashes here because now the one struct is
> available twice.
>
> The man page for prctl(2) says:
> | #include <linux/prctl.h> /* Definition of PR_* constants */
> | #include <sys/prctl.h>
>
> so musl doesn't follow this.
>
> To align with the other builds, I guess the following help:
So I noticed this as well in perf-tools/perf-tools, I'm trying with your
patch applied, lets see...
- Arnaldo
> diff --git a/tools/perf/bench/futex.c b/tools/perf/bench/futex.c
> index 26382e4d8d4ce..540261f299b1d 100644
> --- a/tools/perf/bench/futex.c
> +++ b/tools/perf/bench/futex.c
> @@ -2,7 +2,6 @@
> #include <err.h>
> #include <stdio.h>
> #include <stdlib.h>
> -#include <linux/prctl.h>
> #include <sys/prctl.h>
>
> #include "futex.h"
>
> Sebastian
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [BUG] perf tools: Build failure in v6.16-rc1
2025-06-11 13:14 ` Arnaldo Carvalho de Melo
@ 2025-06-11 14:55 ` Arnaldo Carvalho de Melo
2025-06-11 15:06 ` Sebastian Andrzej Siewior
0 siblings, 1 reply; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2025-06-11 14:55 UTC (permalink / raw)
To: Sebastian Andrzej Siewior; +Cc: Namhyung Kim, linux-kernel, linux-perf-users
On Wed, Jun 11, 2025 at 10:14:32AM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Jun 11, 2025 at 11:25:42AM +0200, Sebastian Andrzej Siewior wrote:
> > On 2025-06-10 11:34:44 [-0700], Namhyung Kim wrote:
> > > Hello,
> > Hi,
> >
> > > I've updated the perf-tools-next to v6.16-rc1 and found a build error
> > > like below on alpine linux 3.18.
> > >
> > > In file included from bench/futex.c:6:
> > > /usr/include/sys/prctl.h:88:8: error: redefinition of 'struct prctl_mm_map'
> > > 88 | struct prctl_mm_map {
> > > | ^~~~~~~~~~~~
> > > In file included from bench/futex.c:5:
> > > /linux/tools/include/uapi/linux/prctl.h:134:8: note: originally defined here
> > > 134 | struct prctl_mm_map {
> > > | ^~~~~~~~~~~~
> > > make[4]: *** [/linux/tools/build/Makefile.build:86: /build/bench/futex.o] Error 1
> > >
> > > git bisect says it's the first commit introduced the failure.
> >
> > Hmm. So your /usr/include/sys/prctl.h and
> > /linux/tools/include/uapi/linux/prctl.h both provide struct
> > prctl_mm_map but their include guard must be different.
> >
> > My /usr/include/sys/prctl.h is provided by glibc and contains the
> > prctl() declaration. It includes also linux/prctl.h.
> > The tools/include/uapi/linux/prctl.h is the same as
> > /usr/include/linux/prctl.h.
> >
> > The /usr/include/sys/prctl.h on alpine linux is different. This is
> > probably coming from musl. It contains the PR_* definition and the
> > prctl() declaration. So it clashes here because now the one struct is
> > available twice.
> >
> > The man page for prctl(2) says:
> > | #include <linux/prctl.h> /* Definition of PR_* constants */
> > | #include <sys/prctl.h>
> >
> > so musl doesn't follow this.
> >
> > To align with the other builds, I guess the following help:
>
> So I noticed this as well in perf-tools/perf-tools, I'm trying with your
> patch applied, lets see...
Can I keep this as below?
With it:
toolsbuilder@five:~$ time dm from alpine:3.16
5 130.36 alpine:3.16 : Ok gcc (Alpine 11.2.1_git20220219) 11.2.1 20220219 , Alpine clang version 13.0.1 flex 2.6.4
6 100.65 alpine:3.17 : Ok gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924 , Alpine clang version 15.0.7 flex 2.6.4
7 90.44 alpine:3.18 : Ok gcc (Alpine 12.2.1_git20220924-r10) 12.2.1 20220924 , Alpine clang version 16.0.6 flex 2.6.4
8 106.18 alpine:3.19 : Ok gcc (Alpine 13.2.1_git20231014) 13.2.1 20231014 , Alpine clang version 17.0.5 flex 2.6.4
9 108.16 alpine:3.20 : Ok gcc (Alpine 13.2.1_git20240309) 13.2.1 20240309 , Alpine clang version 17.0.6 flex 2.6.4
10 111.19 alpine:3.22 : Ok gcc (Alpine 14.2.0) 14.2.0 , Alpine clang version 20.1.6 flex 2.6.4
11 109.28 alpine:edge : Ok gcc (Alpine 14.2.0) 14.2.0 , Alpine clang version 19.1.4 flex 2.6.4
12 92.62 amazonlinux:2023 : Ok gcc (GCC) 11.5.0 20240719 (Red Hat 11.5.0-5) , clang version 15.0.7 (AWS 15.0.7-3.amzn2023.0.4) flex 2.6.4
13 98.43 amazonlinux:devel : Ok gcc (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4) , clang version 15.0.6 (Amazon Linux 15.0.6-3.amzn2023.0.2) flex 2.6.4
14 17.24 archlinux:base : FAIL gcc version 14.2.1 20240805 (GCC)
<command-line>: error: "_FORTIFY_SOURCE" redefined [-Werror]
<command-line>: note: this is the location of the previous definition
cc1: all warnings being treated as errors
error: command '/usr/sbin/gcc' failed with exit code 1
15 97.65 centos:stream : Ok gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-21) , clang version 17.0.6 (Red Hat 17.0.6-1.module_el8+767+9fa966b8) flex 2.6.1
The archlinux one is unrelated. More are building now.
- Arnaldo
commit 8386dc356158fc50c55831c96b1248e01d112ebc
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Wed Jun 11 11:25:42 2025 +0200
perf bench futex: Fix prctl include in musl libc
Namhyung Kim reported:
I've updated the perf-tools-next to v6.16-rc1 and found a build error
like below on alpine linux 3.18.
In file included from bench/futex.c:6:
/usr/include/sys/prctl.h:88:8: error: redefinition of 'struct prctl_mm_map'
88 | struct prctl_mm_map {
| ^~~~~~~~~~~~
In file included from bench/futex.c:5:
/linux/tools/include/uapi/linux/prctl.h:134:8: note: originally defined here
134 | struct prctl_mm_map {
| ^~~~~~~~~~~~
make[4]: *** [/linux/tools/build/Makefile.build:86: /build/bench/futex.o] Error 1
git bisect says it's the first commit introduced the failure.
So your /usr/include/sys/prctl.h and
/linux/tools/include/uapi/linux/prctl.h both provide struct prctl_mm_map
but their include guard must be different.
My /usr/include/sys/prctl.h is provided by glibc and contains the
prctl() declaration. It includes also linux/prctl.h. The
tools/include/uapi/linux/prctl.h is the same as
/usr/include/linux/prctl.h.
The /usr/include/sys/prctl.h on alpine linux is different. This is
probably coming from musl. It contains the PR_* definition and the
prctl() declaration. So it clashes here because now the one struct is
available twice.
The man page for prctl(2) says:
| #include <linux/prctl.h> /* Definition of PR_* constants */
| #include <sys/prctl.h>
so musl doesn't follow this.
So align with the other builds.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Reported-by: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20250611092542.F4ooE2FL@linutronix.de
[ Remove one more in tools/perf/bench/futex-hash.c and conditionally define PR_FUTEX_HASH and friends ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
diff --git a/tools/perf/bench/futex-hash.c b/tools/perf/bench/futex-hash.c
index fdf133c9520f73a4..d2d6d7f3ea331c84 100644
--- a/tools/perf/bench/futex-hash.c
+++ b/tools/perf/bench/futex-hash.c
@@ -18,7 +18,6 @@
#include <stdlib.h>
#include <linux/compiler.h>
#include <linux/kernel.h>
-#include <linux/prctl.h>
#include <linux/zalloc.h>
#include <sys/time.h>
#include <sys/mman.h>
diff --git a/tools/perf/bench/futex.c b/tools/perf/bench/futex.c
index 26382e4d8d4ce2ff..4c4fee107e5912d5 100644
--- a/tools/perf/bench/futex.c
+++ b/tools/perf/bench/futex.c
@@ -2,11 +2,18 @@
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
-#include <linux/prctl.h>
#include <sys/prctl.h>
#include "futex.h"
+#ifndef PR_FUTEX_HASH
+#define PR_FUTEX_HASH 78
+# define PR_FUTEX_HASH_SET_SLOTS 1
+# define FH_FLAG_IMMUTABLE (1ULL << 0)
+# define PR_FUTEX_HASH_GET_SLOTS 2
+# define PR_FUTEX_HASH_GET_IMMUTABLE 3
+#endif // PR_FUTEX_HASH
+
void futex_set_nbuckets_param(struct bench_futex_parameters *params)
{
unsigned long flags;
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [BUG] perf tools: Build failure in v6.16-rc1
2025-06-11 14:55 ` Arnaldo Carvalho de Melo
@ 2025-06-11 15:06 ` Sebastian Andrzej Siewior
2025-06-11 19:01 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 8+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-06-11 15:06 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, linux-kernel, linux-perf-users
On 2025-06-11 11:55:23 [-0300], Arnaldo Carvalho de Melo wrote:
> commit 8386dc356158fc50c55831c96b1248e01d112ebc
> Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Date: Wed Jun 11 11:25:42 2025 +0200
>
> perf bench futex: Fix prctl include in musl libc
>
> Namhyung Kim reported:
>
> I've updated the perf-tools-next to v6.16-rc1 and found a build error
> like below on alpine linux 3.18.
>
> In file included from bench/futex.c:6:
> /usr/include/sys/prctl.h:88:8: error: redefinition of 'struct prctl_mm_map'
> 88 | struct prctl_mm_map {
> | ^~~~~~~~~~~~
> In file included from bench/futex.c:5:
> /linux/tools/include/uapi/linux/prctl.h:134:8: note: originally defined here
> 134 | struct prctl_mm_map {
> | ^~~~~~~~~~~~
> make[4]: *** [/linux/tools/build/Makefile.build:86: /build/bench/futex.o] Error 1
>
> git bisect says it's the first commit introduced the failure.
>
> So your /usr/include/sys/prctl.h and
> /linux/tools/include/uapi/linux/prctl.h both provide struct prctl_mm_map
> but their include guard must be different.
>
> My /usr/include/sys/prctl.h is provided by glibc and contains the
> prctl() declaration. It includes also linux/prctl.h. The
> tools/include/uapi/linux/prctl.h is the same as
> /usr/include/linux/prctl.h.
>
> The /usr/include/sys/prctl.h on alpine linux is different. This is
> probably coming from musl. It contains the PR_* definition and the
> prctl() declaration. So it clashes here because now the one struct is
> available twice.
>
> The man page for prctl(2) says:
>
> | #include <linux/prctl.h> /* Definition of PR_* constants */
> | #include <sys/prctl.h>
>
> so musl doesn't follow this.
>
> So align with the other builds.
>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Reported-by: Namhyung Kim <namhyung@kernel.org>
> Link: https://lore.kernel.org/r/20250611092542.F4ooE2FL@linutronix.de
s/Link/Closes/
> [ Remove one more in tools/perf/bench/futex-hash.c and conditionally define PR_FUTEX_HASH and friends ]
> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
>
> diff --git a/tools/perf/bench/futex-hash.c b/tools/perf/bench/futex-hash.c
> index fdf133c9520f73a4..d2d6d7f3ea331c84 100644
> --- a/tools/perf/bench/futex-hash.c
> +++ b/tools/perf/bench/futex-hash.c
> @@ -18,7 +18,6 @@
> #include <stdlib.h>
> #include <linux/compiler.h>
> #include <linux/kernel.h>
> -#include <linux/prctl.h>
> #include <linux/zalloc.h>
> #include <sys/time.h>
> #include <sys/mman.h>
> diff --git a/tools/perf/bench/futex.c b/tools/perf/bench/futex.c
> index 26382e4d8d4ce2ff..4c4fee107e5912d5 100644
> --- a/tools/perf/bench/futex.c
> +++ b/tools/perf/bench/futex.c
> @@ -2,11 +2,18 @@
> #include <err.h>
> #include <stdio.h>
> #include <stdlib.h>
> -#include <linux/prctl.h>
> #include <sys/prctl.h>
>
This is what I had locally and was waiting for confirmation.
> #include "futex.h"
>
> +#ifndef PR_FUTEX_HASH
> +#define PR_FUTEX_HASH 78
> +# define PR_FUTEX_HASH_SET_SLOTS 1
> +# define FH_FLAG_IMMUTABLE (1ULL << 0)
> +# define PR_FUTEX_HASH_GET_SLOTS 2
> +# define PR_FUTEX_HASH_GET_IMMUTABLE 3
> +#endif // PR_FUTEX_HASH
Is this needed? Aren't these defines coming from that local copy?
> void futex_set_nbuckets_param(struct bench_futex_parameters *params)
> {
> unsigned long flags;
Sebastian
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [BUG] perf tools: Build failure in v6.16-rc1
2025-06-11 15:06 ` Sebastian Andrzej Siewior
@ 2025-06-11 19:01 ` Arnaldo Carvalho de Melo
2025-06-11 21:50 ` Namhyung Kim
2025-06-12 6:25 ` Sebastian Andrzej Siewior
0 siblings, 2 replies; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2025-06-11 19:01 UTC (permalink / raw)
To: Sebastian Andrzej Siewior; +Cc: Namhyung Kim, linux-kernel, linux-perf-users
On Wed, Jun 11, 2025 at 05:06:15PM +0200, Sebastian Andrzej Siewior wrote:
> On 2025-06-11 11:55:23 [-0300], Arnaldo Carvalho de Melo wrote:
> > commit 8386dc356158fc50c55831c96b1248e01d112ebc
> > Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > Date: Wed Jun 11 11:25:42 2025 +0200
> >
> > perf bench futex: Fix prctl include in musl libc
> >
> > Namhyung Kim reported:
> >
> > I've updated the perf-tools-next to v6.16-rc1 and found a build error
> > like below on alpine linux 3.18.
> >
> > In file included from bench/futex.c:6:
> > /usr/include/sys/prctl.h:88:8: error: redefinition of 'struct prctl_mm_map'
> > 88 | struct prctl_mm_map {
> > | ^~~~~~~~~~~~
> > In file included from bench/futex.c:5:
> > /linux/tools/include/uapi/linux/prctl.h:134:8: note: originally defined here
> > 134 | struct prctl_mm_map {
> > | ^~~~~~~~~~~~
> > make[4]: *** [/linux/tools/build/Makefile.build:86: /build/bench/futex.o] Error 1
> >
> > git bisect says it's the first commit introduced the failure.
> >
> > So your /usr/include/sys/prctl.h and
> > /linux/tools/include/uapi/linux/prctl.h both provide struct prctl_mm_map
> > but their include guard must be different.
> >
> > My /usr/include/sys/prctl.h is provided by glibc and contains the
> > prctl() declaration. It includes also linux/prctl.h. The
> > tools/include/uapi/linux/prctl.h is the same as
> > /usr/include/linux/prctl.h.
> >
> > The /usr/include/sys/prctl.h on alpine linux is different. This is
> > probably coming from musl. It contains the PR_* definition and the
> > prctl() declaration. So it clashes here because now the one struct is
> > available twice.
> >
> > The man page for prctl(2) says:
> >
> > | #include <linux/prctl.h> /* Definition of PR_* constants */
> > | #include <sys/prctl.h>
> >
> > so musl doesn't follow this.
> >
> > So align with the other builds.
> >
> > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > Reported-by: Namhyung Kim <namhyung@kernel.org>
> > Link: https://lore.kernel.org/r/20250611092542.F4ooE2FL@linutronix.de
> s/Link/Closes/
ok
> > [ Remove one more in tools/perf/bench/futex-hash.c and conditionally define PR_FUTEX_HASH and friends ]
> > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> >
> > diff --git a/tools/perf/bench/futex-hash.c b/tools/perf/bench/futex-hash.c
> > index fdf133c9520f73a4..d2d6d7f3ea331c84 100644
> > --- a/tools/perf/bench/futex-hash.c
> > +++ b/tools/perf/bench/futex-hash.c
> > @@ -18,7 +18,6 @@
> > #include <stdlib.h>
> > #include <linux/compiler.h>
> > #include <linux/kernel.h>
> > -#include <linux/prctl.h>
> > #include <linux/zalloc.h>
> > #include <sys/time.h>
> > #include <sys/mman.h>
> > diff --git a/tools/perf/bench/futex.c b/tools/perf/bench/futex.c
> > index 26382e4d8d4ce2ff..4c4fee107e5912d5 100644
> > --- a/tools/perf/bench/futex.c
> > +++ b/tools/perf/bench/futex.c
> > @@ -2,11 +2,18 @@
> > #include <err.h>
> > #include <stdio.h>
> > #include <stdlib.h>
> > -#include <linux/prctl.h>
> > #include <sys/prctl.h>
> >
> This is what I had locally and was waiting for confirmation.
>
> > #include "futex.h"
> >
> > +#ifndef PR_FUTEX_HASH
> > +#define PR_FUTEX_HASH 78
> > +# define PR_FUTEX_HASH_SET_SLOTS 1
> > +# define FH_FLAG_IMMUTABLE (1ULL << 0)
> > +# define PR_FUTEX_HASH_GET_SLOTS 2
> > +# define PR_FUTEX_HASH_GET_IMMUTABLE 3
> > +#endif // PR_FUTEX_HASH
>
> Is this needed? Aren't these defines coming from that local copy?
So, these are, as you say, in the copied linux/prctl.h, but in musl libc
we have:
/tmp/perf-6.16.0-rc1 $ grep 'struct prctl_mm_map {' /usr/include/linux/prctl.h
struct prctl_mm_map {
/tmp/perf-6.16.0-rc1 $ grep 'struct prctl_mm_map {' /usr/include/sys/prctl.h
struct prctl_mm_map {
/tmp/perf-6.16.0-rc1 $
And sys/prctl.h doesn't include linux/prctl.h, if we do it, we get
multiple definitions for 'struct prctl_mm_map'.
While in fedora (probably in all the others, haven't checked, but no
failure on them from my last container set build tests):
⬢ [acme@toolbx perf-tools]$ grep 'struct prctl_mm_map {' /usr/include/linux/prctl.h
struct prctl_mm_map {
⬢ [acme@toolbx perf-tools]$ grep 'struct prctl_mm_map {' /usr/include/sys/prctl.h
⬢ [acme@toolbx perf-tools]$
furthermore fedora's sys/prctl.h includes linux/prctl.h, while musl libc
doesn't.
I thought this would be something fixed in newer alpine versions, but
no:
toolsbuilder@five:~$ grep FAIL dm.log.old/summary
5 19.53 alpine:3.16 : FAIL gcc version 11.2.1 20220219 (Alpine 11.2.1_git20220219)
6 20.83 alpine:3.17 : FAIL gcc version 12.2.1 20220924 (Alpine 12.2.1_git20220924-r4)
7 13.94 alpine:3.18 : FAIL gcc version 12.2.1 20220924 (Alpine 12.2.1_git20220924-r10)
8 16.60 alpine:3.19 : FAIL gcc version 13.2.1 20231014 (Alpine 13.2.1_git20231014)
9 15.72 alpine:3.20 : FAIL gcc version 13.2.1 20240309 (Alpine 13.2.1_git20240309)
10 16.38 alpine:3.22 : FAIL gcc version 14.2.0 (Alpine 14.2.0)
11 15.09 alpine:edge : FAIL gcc version 14.2.0 (Alpine 14.2.0)
toolsbuilder@five:~$
So the easiest way out of this seems to be not to explicitely include
linux/prctl.h and define the new stuff conditionally, as I did, right?
- Arnaldo
> > void futex_set_nbuckets_param(struct bench_futex_parameters *params)
> > {
> > unsigned long flags;
>
> Sebastian
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [BUG] perf tools: Build failure in v6.16-rc1
2025-06-11 19:01 ` Arnaldo Carvalho de Melo
@ 2025-06-11 21:50 ` Namhyung Kim
2025-06-12 6:25 ` Sebastian Andrzej Siewior
1 sibling, 0 replies; 8+ messages in thread
From: Namhyung Kim @ 2025-06-11 21:50 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Sebastian Andrzej Siewior, linux-kernel, linux-perf-users
On Wed, Jun 11, 2025 at 04:01:00PM -0300, Arnaldo Carvalho de Melo wrote:
> On Wed, Jun 11, 2025 at 05:06:15PM +0200, Sebastian Andrzej Siewior wrote:
> > On 2025-06-11 11:55:23 [-0300], Arnaldo Carvalho de Melo wrote:
> > > commit 8386dc356158fc50c55831c96b1248e01d112ebc
> > > Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > > Date: Wed Jun 11 11:25:42 2025 +0200
> > >
> > > perf bench futex: Fix prctl include in musl libc
> > >
> > > Namhyung Kim reported:
> > >
> > > I've updated the perf-tools-next to v6.16-rc1 and found a build error
> > > like below on alpine linux 3.18.
> > >
> > > In file included from bench/futex.c:6:
> > > /usr/include/sys/prctl.h:88:8: error: redefinition of 'struct prctl_mm_map'
> > > 88 | struct prctl_mm_map {
> > > | ^~~~~~~~~~~~
> > > In file included from bench/futex.c:5:
> > > /linux/tools/include/uapi/linux/prctl.h:134:8: note: originally defined here
> > > 134 | struct prctl_mm_map {
> > > | ^~~~~~~~~~~~
> > > make[4]: *** [/linux/tools/build/Makefile.build:86: /build/bench/futex.o] Error 1
> > >
> > > git bisect says it's the first commit introduced the failure.
> > >
> > > So your /usr/include/sys/prctl.h and
> > > /linux/tools/include/uapi/linux/prctl.h both provide struct prctl_mm_map
> > > but their include guard must be different.
> > >
> > > My /usr/include/sys/prctl.h is provided by glibc and contains the
> > > prctl() declaration. It includes also linux/prctl.h. The
> > > tools/include/uapi/linux/prctl.h is the same as
> > > /usr/include/linux/prctl.h.
> > >
> > > The /usr/include/sys/prctl.h on alpine linux is different. This is
> > > probably coming from musl. It contains the PR_* definition and the
> > > prctl() declaration. So it clashes here because now the one struct is
> > > available twice.
> > >
> > > The man page for prctl(2) says:
> > >
> > > | #include <linux/prctl.h> /* Definition of PR_* constants */
> > > | #include <sys/prctl.h>
> > >
> > > so musl doesn't follow this.
> > >
> > > So align with the other builds.
> > >
> > > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > > Reported-by: Namhyung Kim <namhyung@kernel.org>
> > > Link: https://lore.kernel.org/r/20250611092542.F4ooE2FL@linutronix.de
>
> > s/Link/Closes/
>
> ok
>
> > > [ Remove one more in tools/perf/bench/futex-hash.c and conditionally define PR_FUTEX_HASH and friends ]
> > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> > >
> > > diff --git a/tools/perf/bench/futex-hash.c b/tools/perf/bench/futex-hash.c
> > > index fdf133c9520f73a4..d2d6d7f3ea331c84 100644
> > > --- a/tools/perf/bench/futex-hash.c
> > > +++ b/tools/perf/bench/futex-hash.c
> > > @@ -18,7 +18,6 @@
> > > #include <stdlib.h>
> > > #include <linux/compiler.h>
> > > #include <linux/kernel.h>
> > > -#include <linux/prctl.h>
> > > #include <linux/zalloc.h>
> > > #include <sys/time.h>
> > > #include <sys/mman.h>
> > > diff --git a/tools/perf/bench/futex.c b/tools/perf/bench/futex.c
> > > index 26382e4d8d4ce2ff..4c4fee107e5912d5 100644
> > > --- a/tools/perf/bench/futex.c
> > > +++ b/tools/perf/bench/futex.c
> > > @@ -2,11 +2,18 @@
> > > #include <err.h>
> > > #include <stdio.h>
> > > #include <stdlib.h>
> > > -#include <linux/prctl.h>
> > > #include <sys/prctl.h>
> > >
> > This is what I had locally and was waiting for confirmation.
> >
> > > #include "futex.h"
> > >
> > > +#ifndef PR_FUTEX_HASH
> > > +#define PR_FUTEX_HASH 78
> > > +# define PR_FUTEX_HASH_SET_SLOTS 1
> > > +# define FH_FLAG_IMMUTABLE (1ULL << 0)
> > > +# define PR_FUTEX_HASH_GET_SLOTS 2
> > > +# define PR_FUTEX_HASH_GET_IMMUTABLE 3
> > > +#endif // PR_FUTEX_HASH
> >
> > Is this needed? Aren't these defines coming from that local copy?
>
> So, these are, as you say, in the copied linux/prctl.h, but in musl libc
> we have:
>
> /tmp/perf-6.16.0-rc1 $ grep 'struct prctl_mm_map {' /usr/include/linux/prctl.h
> struct prctl_mm_map {
> /tmp/perf-6.16.0-rc1 $ grep 'struct prctl_mm_map {' /usr/include/sys/prctl.h
> struct prctl_mm_map {
> /tmp/perf-6.16.0-rc1 $
>
> And sys/prctl.h doesn't include linux/prctl.h, if we do it, we get
> multiple definitions for 'struct prctl_mm_map'.
>
> While in fedora (probably in all the others, haven't checked, but no
> failure on them from my last container set build tests):
>
> ⬢ [acme@toolbx perf-tools]$ grep 'struct prctl_mm_map {' /usr/include/linux/prctl.h
> struct prctl_mm_map {
> ⬢ [acme@toolbx perf-tools]$ grep 'struct prctl_mm_map {' /usr/include/sys/prctl.h
> ⬢ [acme@toolbx perf-tools]$
>
> furthermore fedora's sys/prctl.h includes linux/prctl.h, while musl libc
> doesn't.
>
> I thought this would be something fixed in newer alpine versions, but
> no:
>
> toolsbuilder@five:~$ grep FAIL dm.log.old/summary
> 5 19.53 alpine:3.16 : FAIL gcc version 11.2.1 20220219 (Alpine 11.2.1_git20220219)
> 6 20.83 alpine:3.17 : FAIL gcc version 12.2.1 20220924 (Alpine 12.2.1_git20220924-r4)
> 7 13.94 alpine:3.18 : FAIL gcc version 12.2.1 20220924 (Alpine 12.2.1_git20220924-r10)
> 8 16.60 alpine:3.19 : FAIL gcc version 13.2.1 20231014 (Alpine 13.2.1_git20231014)
> 9 15.72 alpine:3.20 : FAIL gcc version 13.2.1 20240309 (Alpine 13.2.1_git20240309)
> 10 16.38 alpine:3.22 : FAIL gcc version 14.2.0 (Alpine 14.2.0)
> 11 15.09 alpine:edge : FAIL gcc version 14.2.0 (Alpine 14.2.0)
> toolsbuilder@five:~$
>
> So the easiest way out of this seems to be not to explicitely include
> linux/prctl.h and define the new stuff conditionally, as I did, right?
Yep, it fixes my build too. Without the defines, I see
bench/futex.c: In function 'futex_set_nbuckets_param':
bench/futex.c:25:45: error: 'FH_FLAG_IMMUTABLE' undeclared (first use in this function)
25 | flags = params->buckets_immutable ? FH_FLAG_IMMUTABLE : 0;
| ^~~~~~~~~~~~~~~~~
bench/futex.c:25:45: note: each undeclared identifier is reported only once for each function it appears in
bench/futex.c:26:21: error: 'PR_FUTEX_HASH' undeclared (first use in this function)
26 | ret = prctl(PR_FUTEX_HASH, PR_FUTEX_HASH_SET_SLOTS, params->nbuckets, flags);
| ^~~~~~~~~~~~~
CC /build/ui/browsers/annotate-data.o
bench/futex.c:26:36: error: 'PR_FUTEX_HASH_SET_SLOTS' undeclared (first use in this function)
26 | ret = prctl(PR_FUTEX_HASH, PR_FUTEX_HASH_SET_SLOTS, params->nbuckets, flags);
| ^~~~~~~~~~~~~~~~~~~~~~~
bench/futex.c: In function 'futex_print_nbuckets':
bench/futex.c:39:21: error: 'PR_FUTEX_HASH' undeclared (first use in this function)
39 | ret = prctl(PR_FUTEX_HASH, PR_FUTEX_HASH_GET_SLOTS);
| ^~~~~~~~~~~~~
bench/futex.c:39:36: error: 'PR_FUTEX_HASH_GET_SLOTS' undeclared (first use in this function)
39 | ret = prctl(PR_FUTEX_HASH, PR_FUTEX_HASH_GET_SLOTS);
| ^~~~~~~~~~~~~~~~~~~~~~~
bench/futex.c:53:52: error: 'PR_FUTEX_HASH_GET_IMMUTABLE' undeclared (first use in this function)
53 | ret = prctl(PR_FUTEX_HASH, PR_FUTEX_HASH_GET_IMMUTABLE);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
make[4]: *** [/linux/tools/build/Makefile.build:86: /build/bench/futex.o] Error 1
Tested-by: Namhyung Kim <namhyung@kernel.org>
Thanks,
Namhyung
>
> - Arnaldo
>
> > > void futex_set_nbuckets_param(struct bench_futex_parameters *params)
> > > {
> > > unsigned long flags;
> >
> > Sebastian
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [BUG] perf tools: Build failure in v6.16-rc1
2025-06-11 19:01 ` Arnaldo Carvalho de Melo
2025-06-11 21:50 ` Namhyung Kim
@ 2025-06-12 6:25 ` Sebastian Andrzej Siewior
1 sibling, 0 replies; 8+ messages in thread
From: Sebastian Andrzej Siewior @ 2025-06-12 6:25 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, linux-kernel, linux-perf-users
On 2025-06-11 16:01:00 [-0300], Arnaldo Carvalho de Melo wrote:
> > Is this needed? Aren't these defines coming from that local copy?
>
> So, these are, as you say, in the copied linux/prctl.h, but in musl libc
> we have:
right, I briefly forgot about musl.
All good.
…
> I thought this would be something fixed in newer alpine versions, but
> no:
>
> toolsbuilder@five:~$ grep FAIL dm.log.old/summary
> 5 19.53 alpine:3.16 : FAIL gcc version 11.2.1 20220219 (Alpine 11.2.1_git20220219)
> 6 20.83 alpine:3.17 : FAIL gcc version 12.2.1 20220924 (Alpine 12.2.1_git20220924-r4)
> 7 13.94 alpine:3.18 : FAIL gcc version 12.2.1 20220924 (Alpine 12.2.1_git20220924-r10)
> 8 16.60 alpine:3.19 : FAIL gcc version 13.2.1 20231014 (Alpine 13.2.1_git20231014)
> 9 15.72 alpine:3.20 : FAIL gcc version 13.2.1 20240309 (Alpine 13.2.1_git20240309)
> 10 16.38 alpine:3.22 : FAIL gcc version 14.2.0 (Alpine 14.2.0)
> 11 15.09 alpine:edge : FAIL gcc version 14.2.0 (Alpine 14.2.0)
> toolsbuilder@five:~$
>
> So the easiest way out of this seems to be not to explicitely include
> linux/prctl.h and define the new stuff conditionally, as I did, right?
Let me drop an email to alpine and check with them.
> - Arnaldo
Sebastian
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-06-12 6:25 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-10 18:34 [BUG] perf tools: Build failure in v6.16-rc1 Namhyung Kim
2025-06-11 9:25 ` Sebastian Andrzej Siewior
2025-06-11 13:14 ` Arnaldo Carvalho de Melo
2025-06-11 14:55 ` Arnaldo Carvalho de Melo
2025-06-11 15:06 ` Sebastian Andrzej Siewior
2025-06-11 19:01 ` Arnaldo Carvalho de Melo
2025-06-11 21:50 ` Namhyung Kim
2025-06-12 6:25 ` Sebastian Andrzej Siewior
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).