Re: net: vrf: Handle ipv6 multicast and link-local addresses

From: Arnaldo Carvalho de Melo
Date: Mon Oct 03 2016 - 16:00:26 EST


Em Wed, Aug 03, 2016 at 10:27:44PM +0200, Geert Uytterhoeven escreveu:
> On Wed, Aug 3, 2016 at 10:11 PM, David Ahern <dsa@xxxxxxxxxxxxxxxxxxx> wrote:
> > On 8/3/16 1:57 PM, Geert Uytterhoeven wrote:
> >>> +static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev,
> >>> > + int ifindex)
> >>> > +{
> >>> > + const struct ipv6hdr *iph = ipv6_hdr(skb);
> >>> > + struct flowi6 fl6 = {
> >>> > + .daddr = iph->daddr,
> >>> > + .saddr = iph->saddr,
> >>> > + .flowlabel = ip6_flowinfo(iph),
> >> The above assignment causes the following compiler warning with
> >> m68k-linux-gnu-gcc-4.1:
> >>
> >> drivers/net/vrf.c: In function âvrf_ip6_input_dstâ:
> >> drivers/net/vrf.c:870: warning: initialized field with
> >> side-effects overwritten
> >> drivers/net/vrf.c:870: warning: (near initialization for âfl6â)
> >>
> >> Unfortunately I have no idea what it means, nor do I see what's wrong
> >> with the code.
> >
> > no idea. Fields are initialized once and left and right data types are the same.
> >
> > Can you remove one line at a time? Line 870 is ".flowi6_proto = iph->nexthdr," but all of the flowi6 macros are unique references to unique fields in flowi_common. The flowlabel line you point out is a unique field as well.
>
> The only thing that seems to matter is assigning the result of the call to
> ip6_flowinfo() to .flowlabel. Assigning a constant makes the warning go away.
>
> Yeah, the 870 line number is funny, as it doesn't point to the offending line.
>
> > Can you run pahole on file that did compile? e.g.,
> >
> > pahole -C 'flowi6' net/ipv6/route.o
> >
> > and get the common struct too:
> >
> > pahole -C 'flowi_common' net/ipv6/route.o
>
> No output. Perhaps pahole doesn't play well with cross-compiling?

Can you send me this net/ipv6/route.o file? It should work as long as
CONFIG_DEBUG_INFO was used to build this cross kernel.

For instance, here cross compiling perf tools for s390 from a ubuntu
16.04 container running on a fedora 24 host, I get:

[root@jouet 14.04.4]# file /var/lib/docker/devicemapper/mnt/b7ba22999d88feebc42de2ea17fe27e94febf228439fccf2b84c0c9e1ccd8af7/rootfs/tmp/build/perf/perf
/var/lib/docker/devicemapper/mnt/b7ba22999d88feebc42de2ea17fe27e94febf228439fccf2b84c0c9e1ccd8af7/rootfs/tmp/build/perf/perf: ELF 64-bit MSB shared object, IBM S/390, version 1 (SYSV), dynamically linked, interpreter /lib/ld64.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=22b27009c61130ed5727bcaf9ad0813d414b8c5a, not stripped
[root@jouet 14.04.4]#

Thus a s/390 object, that I then process from a x86_64 pahole:

[root@jouet 14.04.4]# file /home/acme/git/pahole/build/pahole
/home/acme/git/pahole/build/pahole: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=c90855d4ffa815bf0dddb3463bc45aea4855d0e2, not stripped
[root@jouet 14.04.4]#

Giving these results:

[root@jouet 14.04.4]# pahole -C sockaddr_in6 /var/lib/docker/devicemapper/mnt/b7ba22999d88feebc42de2ea17fe27e94febf228439fccf2b84c0c9e1ccd8af7/rootfs/tmp/build/perf/perf
struct sockaddr_in6 {
sa_family_t sin6_family; /* 0 2 */
in_port_t sin6_port; /* 2 2 */
uint32_t sin6_flowinfo; /* 4 4 */
struct in6_addr sin6_addr; /* 8 16 */
uint32_t sin6_scope_id; /* 24 4 */

/* size: 28, cachelines: 1, members: 5 */
/* last cacheline: 28 bytes */
};
[root@jouet 14.04.4]#

Expanding types:

[root@jouet 14.04.4]# pahole --expand_types -C sockaddr_in6 /var/lib/docker/devicemapper/mnt/b7ba22999d88feebc42de2ea17fe27e94febf228439fccf2b84c0c9e1ccd8af7/rootfs/tmp/build/perf/perf
struct sockaddr_in6 {
/* typedef sa_family_t */ short unsigned int sin6_family; /* 0 2 */
/* typedef in_port_t -> uint16_t */ short unsigned int sin6_port; /* 2 2 */
/* typedef uint32_t */ unsigned int sin6_flowinfo; /* 4 4 */
struct in6_addr {
union {
/* typedef uint8_t */ unsigned char __u6_addr8[16]; /* 16 */
/* typedef uint16_t */ short unsigned int __u6_addr16[8]; /* 16 */
/* typedef uint32_t */ unsigned int __u6_addr32[4]; /* 16 */
} __in6_u; /* 8 16 */
} sin6_addr; /* 8 16 */
/* typedef uint32_t */ unsigned int sin6_scope_id; /* 24 4 */

/* size: 28, cachelines: 1, members: 5 */
/* last cacheline: 28 bytes */
};
[root@jouet 14.04.4]#

etc.

Guess I need to put together a m68k target for building the perf tools (and
test pahole & friends on such objects)... :-)

- Arnaldo