> The API to prepare checksum offloads mistreats L4 > checksum type enum values as self-contained flags. > > Turning these flag checks into enum checks causes > warnings by GCC about possibly uninitialised IPv4 > header pointer. The issue was found to show up in > the case of GCC versions 4.8.5 and 5.4.0, however, > it might be the case for a wider variety of other > versions. As GCC version 7.4.0 is not susceptible > to the said false positive assessment, this patch > maintains a compiler barrier for earlier versions. > > Fixes: 4fb7e803eb1a ("ethdev: add Tx preparation") > Cc: Tomasz Kulasek <tomaszx.kula...@intel.com> > Cc: sta...@dpdk.org > > Signed-off-by: Ivan Malov <ivan.ma...@oktetlabs.ru> > --- > lib/librte_net/rte_net.h | 16 ++++++++++++++-- > 1 file changed, 14 insertions(+), 2 deletions(-) > > diff --git a/lib/librte_net/rte_net.h b/lib/librte_net/rte_net.h > index 7088584..fb09431 100644 > --- a/lib/librte_net/rte_net.h > +++ b/lib/librte_net/rte_net.h > @@ -151,7 +151,19 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m, > ipv4_hdr->hdr_checksum = 0; > } >
As I remember, saw something similar before... Probably the eaiser way to overcome it, is just to always initialize ipv4_hdr above, something like: +ipv4_hdr = NULL; if (ol_flags & PKT_TX_IPV4) { ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *, inner_l3_offset); if (ol_flags & PKT_TX_IP_CKSUM) ipv4_hdr->hdr_checksum = 0; } > - if ((ol_flags & PKT_TX_UDP_CKSUM) == PKT_TX_UDP_CKSUM) { > +#ifdef GCC_VERSION > +#if GCC_VERSION < 70400 > + /* > + * Earlier versions of GCC suspect access to possibly > + * uninitialised ipv4_hdr in the code below, although > + * the said variable is properly initialised above. > + * Use compiler barrier to cope with the problem. > + */ > + rte_compiler_barrier(); > +#endif > +#endif > + > + if ((ol_flags & PKT_TX_L4_MASK) == PKT_TX_UDP_CKSUM) { > if (ol_flags & PKT_TX_IPV4) { > udp_hdr = (struct rte_udp_hdr *)((char *)ipv4_hdr + > m->l3_len); > @@ -167,7 +179,7 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m, > udp_hdr->dgram_cksum = rte_ipv6_phdr_cksum(ipv6_hdr, > ol_flags); > } > - } else if ((ol_flags & PKT_TX_TCP_CKSUM) || > + } else if ((ol_flags & PKT_TX_L4_MASK) == PKT_TX_TCP_CKSUM || > (ol_flags & PKT_TX_TCP_SEG)) { > if (ol_flags & PKT_TX_IPV4) { > /* non-TSO tcp or TSO */ > -- > 1.8.3.1