[dpdk-dev] ixgbe_rx_scan_hw_ring: Fix initializing id and hash fields in flow director mode.
Commit Message
When Flow Director was used together with bulk alloc, id and hash was swapped
when packet matches flow director filter due to improper fdir field initialization.
Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
---
lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
Comments
Hi,
2014-08-20 08:46, Pawel Wodkowski:
> When Flow Director was used together with bulk alloc, id and hash was swapped
> when packet matches flow director filter due to improper fdir field initialization.
>
> Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
I'd really like someone else review this touchy patch for integration
in 1.7.1.
Thanks
> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Friday, August 29, 2014 17:41
> To: dev@dpdk.org
> Cc: Wodkowski, PawelX
> Subject: Re: [dpdk-dev] [PATCH] ixgbe_rx_scan_hw_ring: Fix initializing id and
> hash fields in flow director mode.
>
> Hi,
>
> 2014-08-20 08:46, Pawel Wodkowski:
> > When Flow Director was used together with bulk alloc, id and hash was
> swapped
> > when packet matches flow director filter due to improper fdir field
> initialization.
> >
> > Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
>
> I'd really like someone else review this touchy patch for integration
> in 1.7.1.
>
> Thanks
> --
> Thomas
Reviewed-by: Helin Zhang <helin.zhang@intel.com>
Reviewed-by: Jingjing Wu <jingjing.wu@intel.com>
On Mon, Sep 08, 2014 at 07:18:10AM +0000, Wodkowski, PawelX wrote:
> > -----Original Message-----
> > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > Sent: Friday, August 29, 2014 17:41
> > To: dev@dpdk.org
> > Cc: Wodkowski, PawelX
> > Subject: Re: [dpdk-dev] [PATCH] ixgbe_rx_scan_hw_ring: Fix initializing id and
> > hash fields in flow director mode.
> >
> > Hi,
> >
> > 2014-08-20 08:46, Pawel Wodkowski:
> > > When Flow Director was used together with bulk alloc, id and hash was
> > swapped
> > > when packet matches flow director filter due to improper fdir field
> > initialization.
> > >
> > > Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
> >
> > I'd really like someone else review this touchy patch for integration
> > in 1.7.1.
> >
> > Thanks
> > --
> > Thomas
>
> Reviewed-by: Helin Zhang <helin.zhang@intel.com>
> Reviewed-by: Jingjing Wu <jingjing.wu@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> > > > When Flow Director was used together with bulk alloc, id and hash was
> > > > swapped when packet matches flow director filter due to improper fdir
> > > > field initialization.
> > > >
> > > > Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
> >
> > Reviewed-by: Helin Zhang <helin.zhang@intel.com>
> > Reviewed-by: Jingjing Wu <jingjing.wu@intel.com>
>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Applied with some changes to fit with recent mbug refactoring.
Thanks
@@ -902,6 +902,7 @@ ixgbe_rx_scan_hw_ring(struct igb_rx_queue *rxq)
struct igb_rx_entry *rxep;
struct rte_mbuf *mb;
uint16_t pkt_len;
+ uint16_t pkt_flags;
int s[LOOK_AHEAD], nb_dd;
int i, j, nb_rx = 0;
@@ -935,21 +936,30 @@ ixgbe_rx_scan_hw_ring(struct igb_rx_queue *rxq)
/* Translate descriptor info to mbuf format */
for (j = 0; j < nb_dd; ++j) {
mb = rxep[j].mbuf;
- pkt_len = (uint16_t)(rxdp[j].wb.upper.length -
- rxq->crc_len);
+ pkt_len = (uint16_t)(rxdp[j].wb.upper.length - rxq->crc_len);
mb->pkt.data_len = pkt_len;
mb->pkt.pkt_len = pkt_len;
- mb->pkt.vlan_macip.f.vlan_tci = rxdp[j].wb.upper.vlan;
- mb->pkt.hash.rss = rxdp[j].wb.lower.hi_dword.rss;
+ mb->pkt.vlan_macip.f.vlan_tci =
+ rte_le_to_cpu_16(rxdp[j].wb.upper.vlan);
/* convert descriptor fields to rte mbuf flags */
- mb->ol_flags = rx_desc_hlen_type_rss_to_pkt_flags(
+ pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(
rxdp[j].wb.lower.lo_dword.data);
/* reuse status field from scan list */
- mb->ol_flags = (uint16_t)(mb->ol_flags |
+ pkt_flags = (uint16_t)(pkt_flags |
rx_desc_status_to_pkt_flags(s[j]));
- mb->ol_flags = (uint16_t)(mb->ol_flags |
+ pkt_flags = (uint16_t)(pkt_flags |
rx_desc_error_to_pkt_flags(s[j]));
+ mb->ol_flags = pkt_flags;
+
+ if (likely(pkt_flags & PKT_RX_RSS_HASH))
+ mb->pkt.hash.rss = rxdp[j].wb.lower.hi_dword.rss;
+ else if (pkt_flags & PKT_RX_FDIR) {
+ mb->pkt.hash.fdir.hash =
+ (uint16_t)((rxdp[j].wb.lower.hi_dword.csum_ip.csum)
+ & IXGBE_ATR_HASH_MASK);
+ mb->pkt.hash.fdir.id = rxdp[j].wb.lower.hi_dword.csum_ip.ip_id;
+ }
}
/* Move mbuf pointers from the S/W ring to the stage */