> -----Original Message----- > From: Ferruh Yigit <ferruh.yi...@intel.com> > Sent: Tuesday, November 17, 2020 00:23 > To: Xiaoyu Min <jack...@mellanox.com>; Jingjing Wu <jingjing...@intel.com>; > Beilei Xing <beilei.x...@intel.com> > Cc: dev@dpdk.org; Jack Min <jack...@nvidia.com>; NBU-Contact-Thomas > Monjalon <tho...@monjalon.net>; Andrew Rybchenko > <arybche...@solarflare.com>; Ori Kam <or...@nvidia.com>; Dekel Peled > <dek...@nvidia.com> > Subject: Re: [dpdk-dev] [PATCH 4/5] net/iavf: fix protocol size for virtchnl > copy > > On 11/16/2020 7:55 AM, Xiaoyu Min wrote: > > From: Xiaoyu Min <jack...@nvidia.com> > > > > The rte_flow_item_vlan items are refined. > > The structs do not exactly represent the packet bits captured on the > > wire anymore so should only copy real header instead of the whole struct. > > > > Replace the rte_flow_item_* with the existing corresponding rte_*_hdr. > > > > Fixes: 09315fc83861 ("ethdev: add VLAN attributes to ethernet and VLAN > items") > > > > Signed-off-by: Xiaoyu Min <jack...@nvidia.com> > > --- > > drivers/net/iavf/iavf_fdir.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c > > index d683a468c1..7054bde0b9 100644 > > --- a/drivers/net/iavf/iavf_fdir.c > > +++ b/drivers/net/iavf/iavf_fdir.c > > @@ -541,7 +541,7 @@ iavf_fdir_parse_pattern(__rte_unused struct > iavf_adapter *ad, > > VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, > ETH, ETHERTYPE); > > > > rte_memcpy(hdr->buffer, > > - eth_spec, sizeof(*eth_spec)); > > + eth_spec, sizeof(struct rte_ether_hdr)); > > This requires 'struct rte_flow_item_eth' should have 'struct rte_ether_hdr' as > first element, and I suspect this usage exists in a few more locations, but I > wonder if this assumption is real and documented in somewhere? > I am not just talking about 'struct rte_flow_item_eth', but for all > 'rte_flow_item_*'... > I think this is not documented and this assumption is not real. I've created one ticket on Bugzilla (https://bugs.dpdk.org/show_bug.cgi?id=581) to track.
> > > btw, while checking for the 'struct rte_flow_item_eth', pahole shows it is > using > 20 bytes, and I suspect this is not the intention with the reserved field: > > struct rte_flow_item_eth { > struct rte_ether_addr dst; /* 0 6 */ > struct rte_ether_addr src; /* 6 6 */ > uint16_t type; /* 12 2 */ > > /* Bitfield combined with previous fields */ > > uint32_t has_vlan:1; /* 12:15 4 */ > > /* XXX 31 bits hole, try to pack */ > > uint32_t reserved:31; /* 16: 1 4 */ > > /* size: 20, cachelines: 1, members: 5 */ > /* bit holes: 1, sum bit holes: 31 bits */ > /* bit_padding: 1 bits */ > /* last cacheline: 20 bytes */ > }; > > 'has_vlan' seems combined with previous field to make together 32 bits. So the > 'reserved' field is occupying a new 32 bits all by itself. > > What about changing the struct as following, while we can change the ABI: > struct rte_flow_item_eth { > struct rte_ether_addr dst; /* 0 6 */ > struct rte_ether_addr src; /* 6 6 */ > uint16_t type; /* 12 2 */ > uint16_t has_vlan:1; /* 14:15 2 */ > uint16_t reserved:15; /* 14: 0 2 */ > > /* size: 16, cachelines: 1, members: 5 */ > /* last cacheline: 16 bytes */ > }; > Well we probably need to discuss this in next release. It's too late to change this API at this moment. -Jack