linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).