diff mbox series

iproute2: fix build failure on ppc64le

Message ID d13ef7c00b60a50a5e8ddbb7ff138399689d3483.1707474099.git.aclaudi@redhat.com (mailing list archive)
State New, archived
Delegated to: Stephen Hemminger
Headers show
Series iproute2: fix build failure on ppc64le | expand

Checks

Context Check Description
netdev/tree_selection success Not a local patch

Commit Message

Andrea Claudi Feb. 9, 2024, 10:24 a.m. UTC
ppc64le build fails with error on ifstat.c when
-Wincompatible-pointer-types is enabled:

ifstat.c: In function ‘dump_raw_db’:
ifstat.c:323:44: error: initialization of ‘long long unsigned int *’ from incompatible pointer type ‘__u64 *’ {aka ‘long unsigned int *’} [-Wincompatible-pointer-types]
  323 |                 unsigned long long *vals = n->val;

Several other warnings are produced when -Wformat= is set, for example:

ss.c:3244:34: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long unsigned int’} [-Wformat=]
 3244 |                 out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
      |                               ~~~^   ~~~~~~~~~~~~~~~~~
      |                                  |    |
      |                                  |    __u64 {aka long unsigned int}
      |                                  long long unsigned int
      |                               %lu

This happens because __u64 is defined as long unsigned on ppc64le.  As
pointed out by Florian Weimar, we should use -D__SANE_USERSPACE_TYPES__
if we really want to use long long unsigned in iproute2.

This fix the build failure and all the warnings without any change on
the code itself.

Suggested-by: Florian Weimer <fweimer@redhat.com>
Signed-off-by: Andrea Claudi <aclaudi@redhat.com>
---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Andrea Claudi Feb. 9, 2024, 12:02 p.m. UTC | #1
On Fri, Feb 09, 2024 at 11:24:47AM +0100, Andrea Claudi wrote:
> ppc64le build fails with error on ifstat.c when
> -Wincompatible-pointer-types is enabled:
> 
> ifstat.c: In function ‘dump_raw_db’:
> ifstat.c:323:44: error: initialization of ‘long long unsigned int *’ from incompatible pointer type ‘__u64 *’ {aka ‘long unsigned int *’} [-Wincompatible-pointer-types]
>   323 |                 unsigned long long *vals = n->val;
> 
> Several other warnings are produced when -Wformat= is set, for example:
> 
> ss.c:3244:34: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long unsigned int’} [-Wformat=]
>  3244 |                 out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
>       |                               ~~~^   ~~~~~~~~~~~~~~~~~
>       |                                  |    |
>       |                                  |    __u64 {aka long unsigned int}
>       |                                  long long unsigned int
>       |                               %lu
> 
> This happens because __u64 is defined as long unsigned on ppc64le.  As
> pointed out by Florian Weimar, we should use -D__SANE_USERSPACE_TYPES__
> if we really want to use long long unsigned in iproute2.
> 
> This fix the build failure and all the warnings without any change on
> the code itself.
> 
> Suggested-by: Florian Weimer <fweimer@redhat.com>
> Signed-off-by: Andrea Claudi <aclaudi@redhat.com>

Sorry, I forgot to add:
Fixes: 5a52102b7c8f ("ifstat: Add extended statistics to ifstat")

even after I recommended it to Stephen G... Seems I need more coffee
today :)

> ---
>  Makefile | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/Makefile b/Makefile
> index 8024d45e..3b9daede 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -60,7 +60,7 @@ CC := gcc
>  HOSTCC ?= $(CC)
>  DEFINES += -D_GNU_SOURCE
>  # Turn on transparent support for LFS
> -DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
> +DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D__SANE_USERSPACE_TYPES__
>  CCOPTS = -O2 -pipe
>  WFLAGS := -Wall -Wstrict-prototypes  -Wmissing-prototypes
>  WFLAGS += -Wmissing-declarations -Wold-style-definition -Wformat=2
> -- 
> 2.43.0
>
Stephen Hemminger Feb. 9, 2024, 4:35 p.m. UTC | #2
On Fri,  9 Feb 2024 11:24:47 +0100
Andrea Claudi <aclaudi@redhat.com> wrote:

> ss.c:3244:34: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long unsigned int’} [-Wformat=]
>  3244 |                 out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
>       |                               ~~~^   ~~~~~~~~~~~~~~~~~
>       |                                  |    |
>       |                                  |    __u64 {aka long unsigned int}
>       |                                  long long unsigned int
>       |                               %lu
> 
> This happens because __u64 is defined as long unsigned on ppc64le.  As
> pointed out by Florian Weimar, we should use -D__SANE_USERSPACE_TYPES__
> if we really want to use long long unsigned in iproute2.

Ok, this looks good.
Another way to fix would be to use the macros defined in inttypes.h

		out(" rcv_nxt:"PRIu64, s->mptcpi_rcv_nxt);
David Ahern Feb. 9, 2024, 10:14 p.m. UTC | #3
On 2/9/24 9:35 AM, Stephen Hemminger wrote:
> On Fri,  9 Feb 2024 11:24:47 +0100
> Andrea Claudi <aclaudi@redhat.com> wrote:
> 
>> ss.c:3244:34: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long unsigned int’} [-Wformat=]
>>  3244 |                 out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
>>       |                               ~~~^   ~~~~~~~~~~~~~~~~~
>>       |                                  |    |
>>       |                                  |    __u64 {aka long unsigned int}
>>       |                                  long long unsigned int
>>       |                               %lu
>>
>> This happens because __u64 is defined as long unsigned on ppc64le.  As
>> pointed out by Florian Weimar, we should use -D__SANE_USERSPACE_TYPES__
>> if we really want to use long long unsigned in iproute2.
> 
> Ok, this looks good.
> Another way to fix would be to use the macros defined in inttypes.h
> 
> 		out(" rcv_nxt:"PRIu64, s->mptcpi_rcv_nxt);
> 

since the uapi is __u64, I think this is the better approach.
Stephen Hemminger Feb. 10, 2024, 12:45 a.m. UTC | #4
On Fri, 9 Feb 2024 15:14:28 -0700
David Ahern <dsahern@gmail.com> wrote:

> On 2/9/24 9:35 AM, Stephen Hemminger wrote:
> > On Fri,  9 Feb 2024 11:24:47 +0100
> > Andrea Claudi <aclaudi@redhat.com> wrote:
> >   
> >> ss.c:3244:34: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long unsigned int’} [-Wformat=]
> >>  3244 |                 out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
> >>       |                               ~~~^   ~~~~~~~~~~~~~~~~~
> >>       |                                  |    |
> >>       |                                  |    __u64 {aka long unsigned int}
> >>       |                                  long long unsigned int
> >>       |                               %lu
> >>
> >> This happens because __u64 is defined as long unsigned on ppc64le.  As
> >> pointed out by Florian Weimar, we should use -D__SANE_USERSPACE_TYPES__
> >> if we really want to use long long unsigned in iproute2.  
> > 
> > Ok, this looks good.
> > Another way to fix would be to use the macros defined in inttypes.h
> > 
> > 		out(" rcv_nxt:"PRIu64, s->mptcpi_rcv_nxt);
> >   
> 
> since the uapi is __u64, I think this is the better approach.

NVM
Tried it, but __u64 is not the same as uint64_t even on x86.
__u64 is long long unsigned int
uint64_t is long unsigned int
Andrea Claudi Feb. 14, 2024, 3:30 p.m. UTC | #5
On Fri, Feb 09, 2024 at 04:45:42PM -0800, Stephen Hemminger wrote:
> On Fri, 9 Feb 2024 15:14:28 -0700
> David Ahern <dsahern@gmail.com> wrote:
> 
> > On 2/9/24 9:35 AM, Stephen Hemminger wrote:
> > > On Fri,  9 Feb 2024 11:24:47 +0100
> > > Andrea Claudi <aclaudi@redhat.com> wrote:
> > >   
> > >> ss.c:3244:34: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long unsigned int’} [-Wformat=]
> > >>  3244 |                 out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
> > >>       |                               ~~~^   ~~~~~~~~~~~~~~~~~
> > >>       |                                  |    |
> > >>       |                                  |    __u64 {aka long unsigned int}
> > >>       |                                  long long unsigned int
> > >>       |                               %lu
> > >>
> > >> This happens because __u64 is defined as long unsigned on ppc64le.  As
> > >> pointed out by Florian Weimar, we should use -D__SANE_USERSPACE_TYPES__
> > >> if we really want to use long long unsigned in iproute2.  
> > > 
> > > Ok, this looks good.
> > > Another way to fix would be to use the macros defined in inttypes.h
> > > 
> > > 		out(" rcv_nxt:"PRIu64, s->mptcpi_rcv_nxt);
> > >   
> > 
> > since the uapi is __u64, I think this is the better approach.
> 
> NVM
> Tried it, but __u64 is not the same as uint64_t even on x86.
> __u64 is long long unsigned int
> uint64_t is long unsigned int
>

Is there anything more I can do about this?
David Ahern Feb. 14, 2024, 3:49 p.m. UTC | #6
On 2/14/24 8:30 AM, Andrea Claudi wrote:
> On Fri, Feb 09, 2024 at 04:45:42PM -0800, Stephen Hemminger wrote:
>> On Fri, 9 Feb 2024 15:14:28 -0700
>> David Ahern <dsahern@gmail.com> wrote:
>>
>>> On 2/9/24 9:35 AM, Stephen Hemminger wrote:
>>>> On Fri,  9 Feb 2024 11:24:47 +0100
>>>> Andrea Claudi <aclaudi@redhat.com> wrote:
>>>>   
>>>>> ss.c:3244:34: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long unsigned int’} [-Wformat=]
>>>>>  3244 |                 out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
>>>>>       |                               ~~~^   ~~~~~~~~~~~~~~~~~
>>>>>       |                                  |    |
>>>>>       |                                  |    __u64 {aka long unsigned int}
>>>>>       |                                  long long unsigned int
>>>>>       |                               %lu
>>>>>
>>>>> This happens because __u64 is defined as long unsigned on ppc64le.  As
>>>>> pointed out by Florian Weimar, we should use -D__SANE_USERSPACE_TYPES__
>>>>> if we really want to use long long unsigned in iproute2.  
>>>>
>>>> Ok, this looks good.
>>>> Another way to fix would be to use the macros defined in inttypes.h
>>>>
>>>> 		out(" rcv_nxt:"PRIu64, s->mptcpi_rcv_nxt);
>>>>   
>>>
>>> since the uapi is __u64, I think this is the better approach.
>>
>> NVM
>> Tried it, but __u64 is not the same as uint64_t even on x86.
>> __u64 is long long unsigned int
>> uint64_t is long unsigned int
>>
> 
> Is there anything more I can do about this?
> 

where does the uint64_t come in? include/uapi/linux/mptcp.h has
mptcpi_rcv_nxt as __u64 and PRIu64 macros should be working without a
problem - this is what perf tool uses consistently.
Stephen Hemminger Feb. 15, 2024, 3:05 a.m. UTC | #7
On Wed, 14 Feb 2024 08:49:02 -0700
David Ahern <dsahern@gmail.com> wrote:

> On 2/14/24 8:30 AM, Andrea Claudi wrote:
> > On Fri, Feb 09, 2024 at 04:45:42PM -0800, Stephen Hemminger wrote:  
> >> On Fri, 9 Feb 2024 15:14:28 -0700
> >> David Ahern <dsahern@gmail.com> wrote:
> >>  
> >>> On 2/9/24 9:35 AM, Stephen Hemminger wrote:  
> >>>> On Fri,  9 Feb 2024 11:24:47 +0100
> >>>> Andrea Claudi <aclaudi@redhat.com> wrote:
> >>>>     
> >>>>> ss.c:3244:34: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long unsigned int’} [-Wformat=]
> >>>>>  3244 |                 out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
> >>>>>       |                               ~~~^   ~~~~~~~~~~~~~~~~~
> >>>>>       |                                  |    |
> >>>>>       |                                  |    __u64 {aka long unsigned int}
> >>>>>       |                                  long long unsigned int
> >>>>>       |                               %lu
> >>>>>
> >>>>> This happens because __u64 is defined as long unsigned on ppc64le.  As
> >>>>> pointed out by Florian Weimar, we should use -D__SANE_USERSPACE_TYPES__
> >>>>> if we really want to use long long unsigned in iproute2.    
> >>>>
> >>>> Ok, this looks good.
> >>>> Another way to fix would be to use the macros defined in inttypes.h
> >>>>
> >>>> 		out(" rcv_nxt:"PRIu64, s->mptcpi_rcv_nxt);
> >>>>     
> >>>
> >>> since the uapi is __u64, I think this is the better approach.  
> >>
> >> NVM
> >> Tried it, but __u64 is not the same as uint64_t even on x86.
> >> __u64 is long long unsigned int
> >> uint64_t is long unsigned int
> >>  
> > 
> > Is there anything more I can do about this?
> >   
> 
> where does the uint64_t come in? include/uapi/linux/mptcp.h has
> mptcpi_rcv_nxt as __u64 and PRIu64 macros should be working without a
> problem - this is what perf tool uses consistently.

I just did this:

diff --git a/misc/ss.c b/misc/ss.c
index 5296cabe9982..679d50b8fef6 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -8,6 +8,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <inttypes.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
@@ -3241,7 +3242,7 @@ static void mptcp_stats_print(struct mptcp_info *s)
        if (s->mptcpi_snd_una)
                out(" snd_una:%llu", s->mptcpi_snd_una);
        if (s->mptcpi_rcv_nxt)
-               out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
+               out(" rcv_nxt:%" PRIu64, s->mptcpi_rcv_nxt);
        if (s->mptcpi_local_addr_used)
                out(" local_addr_used:%u", s->mptcpi_local_addr_used);
        if (s->mptcpi_local_addr_max)


And got this:
    CC       ss.o
ss.c: In function ‘mptcp_stats_print’:
ss.c:3245:21: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long long unsigned int’} [-Wformat=]
 3245 |                 out(" rcv_nxt:%" PRIu64, s->mptcpi_rcv_nxt);
      |                     ^~~~~~~~~~~~         ~~~~~~~~~~~~~~~~~
      |                                           |
      |                                           __u64 {aka long long unsigned int}
In file included from ss.c:11:
/usr/include/inttypes.h:105:41: note: format string is defined here
  105 | # define PRIu64         __PRI64_PREFIX "u"
David Ahern Feb. 15, 2024, 3:10 a.m. UTC | #8
On 2/14/24 8:05 PM, Stephen Hemminger wrote:
> 
> I just did this:
> 
> diff --git a/misc/ss.c b/misc/ss.c
> index 5296cabe9982..679d50b8fef6 100644
> --- a/misc/ss.c
> +++ b/misc/ss.c
> @@ -8,6 +8,7 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <unistd.h>
> +#include <inttypes.h>
>  #include <fcntl.h>
>  #include <sys/ioctl.h>
>  #include <sys/socket.h>
> @@ -3241,7 +3242,7 @@ static void mptcp_stats_print(struct mptcp_info *s)
>         if (s->mptcpi_snd_una)
>                 out(" snd_una:%llu", s->mptcpi_snd_una);
>         if (s->mptcpi_rcv_nxt)
> -               out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
> +               out(" rcv_nxt:%" PRIu64, s->mptcpi_rcv_nxt);
>         if (s->mptcpi_local_addr_used)
>                 out(" local_addr_used:%u", s->mptcpi_local_addr_used);
>         if (s->mptcpi_local_addr_max)
> 
> 
> And got this:
>     CC       ss.o
> ss.c: In function ‘mptcp_stats_print’:
> ss.c:3245:21: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long long unsigned int’} [-Wformat=]
>  3245 |                 out(" rcv_nxt:%" PRIu64, s->mptcpi_rcv_nxt);
>       |                     ^~~~~~~~~~~~         ~~~~~~~~~~~~~~~~~
>       |                                           |
>       |                                           __u64 {aka long long unsigned int}
> In file included from ss.c:11:
> /usr/include/inttypes.h:105:41: note: format string is defined here
>   105 | # define PRIu64         __PRI64_PREFIX "u"
> 

Andrea: can you check on how perf (kernel utils) compiles on ppc64le? I
thought Arnaldo had build "farms" for all of the architectures; maybe
not for this one. __u64 is used a lot in the perf_events UAPI and PRIu64
is used extensively in the userspace code.
Andrea Claudi Feb. 16, 2024, 9:57 a.m. UTC | #9
On Wed, Feb 14, 2024 at 08:10:54PM -0700, David Ahern wrote:
> On 2/14/24 8:05 PM, Stephen Hemminger wrote:
> > 
> > I just did this:
> > 
> > diff --git a/misc/ss.c b/misc/ss.c
> > index 5296cabe9982..679d50b8fef6 100644
> > --- a/misc/ss.c
> > +++ b/misc/ss.c
> > @@ -8,6 +8,7 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >  #include <unistd.h>
> > +#include <inttypes.h>
> >  #include <fcntl.h>
> >  #include <sys/ioctl.h>
> >  #include <sys/socket.h>
> > @@ -3241,7 +3242,7 @@ static void mptcp_stats_print(struct mptcp_info *s)
> >         if (s->mptcpi_snd_una)
> >                 out(" snd_una:%llu", s->mptcpi_snd_una);
> >         if (s->mptcpi_rcv_nxt)
> > -               out(" rcv_nxt:%llu", s->mptcpi_rcv_nxt);
> > +               out(" rcv_nxt:%" PRIu64, s->mptcpi_rcv_nxt);
> >         if (s->mptcpi_local_addr_used)
> >                 out(" local_addr_used:%u", s->mptcpi_local_addr_used);
> >         if (s->mptcpi_local_addr_max)
> > 
> > 
> > And got this:
> >     CC       ss.o
> > ss.c: In function ‘mptcp_stats_print’:
> > ss.c:3245:21: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘__u64’ {aka ‘long long unsigned int’} [-Wformat=]
> >  3245 |                 out(" rcv_nxt:%" PRIu64, s->mptcpi_rcv_nxt);
> >       |                     ^~~~~~~~~~~~         ~~~~~~~~~~~~~~~~~
> >       |                                           |
> >       |                                           __u64 {aka long long unsigned int}
> > In file included from ss.c:11:
> > /usr/include/inttypes.h:105:41: note: format string is defined here
> >   105 | # define PRIu64         __PRI64_PREFIX "u"
> > 
> 
> Andrea: can you check on how perf (kernel utils) compiles on ppc64le? I
> thought Arnaldo had build "farms" for all of the architectures; maybe
> not for this one. __u64 is used a lot in the perf_events UAPI and PRIu64
> is used extensively in the userspace code.

Sure, I'll look into perf and let you know.

Thanks,
Andrea
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index 8024d45e..3b9daede 100644
--- a/Makefile
+++ b/Makefile
@@ -60,7 +60,7 @@  CC := gcc
 HOSTCC ?= $(CC)
 DEFINES += -D_GNU_SOURCE
 # Turn on transparent support for LFS
-DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
+DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D__SANE_USERSPACE_TYPES__
 CCOPTS = -O2 -pipe
 WFLAGS := -Wall -Wstrict-prototypes  -Wmissing-prototypes
 WFLAGS += -Wmissing-declarations -Wold-style-definition -Wformat=2