[dpdk-dev] [RFC] mbuf: remove unused rx error flags

John Daley (johndale) johndale at cisco.com
Thu May 12 03:32:17 CEST 2016


Hi,

> -----Original Message-----
> From: Olivier Matz [mailto:olivier.matz at 6wind.com]
> Sent: Tuesday, May 10, 2016 1:40 AM
> To: dev at dpdk.org
> Cc: konstantin.ananyev at intel.com; John Daley (johndale)
> <johndale at cisco.com>; helin.zhang at intel.com; arnon at qwilt.com;
> rolette at infinite.io
> Subject: [RFC] mbuf: remove unused rx error flags
> 
> Following the discussions from:
> http://dpdk.org/ml/archives/dev/2015-July/021721.html
> http://dpdk.org/ml/archives/dev/2016-April/038143.html
> 
> The value of these flags is 0, making them useless. Today, no example
> application checks them on RX, and only few drivers sets them, and silently
> give wrong packets to the application, which should not happen.
> 
> This patch removes the unused flags from rte_mbuf, and their use in the
> drivers. The enic driver is modified to drop bad packets, but i40e and fm10k
> are kept as they are today and should be fixed to drop bad packets.

Perhaps the change to enic to drop bad packets should be handled as a separate patch since it's not strictly related to not removing the use of the flags?

> 
> Fixes: c22265f6 ("mbuf: add new packet flags for i40e")
> Signed-off-by: Olivier Matz <olivier.matz at 6wind.com>
> ---
> 
> Hi,
> 
> Here is a draft patch that removes the rx mbuf flags, as discussed.
> 
> John, I did not test the patch on the enic driver, so please review it carefully.
> 

The patch works for enic, thanks. There are a few minor changes for performance:
 - put an unlikely in the if (packet_error) conditional
- remove the if (!packet_error) conditional since it will always be true.
Let me know if you would prefer I submit the enic patch separately.

> Comments are welcome.
> 
> Olivier
> 
> 
>  drivers/net/enic/enic_rx.c         | 31 ++++++++++++++-----------------
>  drivers/net/fm10k/fm10k_rxtx.c     | 16 ----------------
>  drivers/net/fm10k/fm10k_rxtx_vec.c |  2 +-
>  drivers/net/i40e/i40e_rxtx.c       | 15 ---------------
>  lib/librte_mbuf/rte_mbuf.c         |  4 ----
>  lib/librte_mbuf/rte_mbuf.h         |  5 +----
>  6 files changed, 16 insertions(+), 57 deletions(-)
> 
> diff --git a/drivers/net/enic/enic_rx.c b/drivers/net/enic/enic_rx.c index
> b3ad9ea..bad802e 100644
> --- a/drivers/net/enic/enic_rx.c
> +++ b/drivers/net/enic/enic_rx.c
> @@ -144,20 +144,15 @@ enic_cq_rx_desc_n_bytes(struct cq_desc *cqd)  }
> 
>  static inline uint8_t
> -enic_cq_rx_to_pkt_err_flags(struct cq_desc *cqd, uint64_t
> *pkt_err_flags_out)
> +enic_cq_rx_check_err(struct cq_desc *cqd)
>  {
>  	struct cq_enet_rq_desc *cqrd = (struct cq_enet_rq_desc *)cqd;
>  	uint16_t bwflags;
> -	int ret = 0;
> -	uint64_t pkt_err_flags = 0;
> 
>  	bwflags = enic_cq_rx_desc_bwflags(cqrd);
> -	if (unlikely(enic_cq_rx_desc_packet_error(bwflags))) {
> -		pkt_err_flags = PKT_RX_MAC_ERR;
> -		ret = 1;
> -	}
> -	*pkt_err_flags_out = pkt_err_flags;
> -	return ret;
> +	if (unlikely(enic_cq_rx_desc_packet_error(bwflags)))
> +		return 1;
> +	return 0;
>  }
> 
>  /*
> @@ -253,7 +248,7 @@ enic_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
>  	struct enic *enic = vnic_dev_priv(rq->vdev);
>  	unsigned int rx_id;
>  	struct rte_mbuf *nmb, *rxmb;
> -	uint16_t nb_rx = 0;
> +	uint16_t nb_rx = 0, nb_err = 0;
>  	uint16_t nb_hold;
>  	struct vnic_cq *cq;
>  	volatile struct cq_desc *cqd_ptr;
> @@ -269,7 +264,6 @@ enic_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
>  		volatile struct rq_enet_desc *rqd_ptr;
>  		dma_addr_t dma_addr;
>  		struct cq_desc cqd;
> -		uint64_t ol_err_flags;
>  		uint8_t packet_error;
> 
>  		/* Check for pkts available */
> @@ -293,7 +287,7 @@ enic_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
>  		}
> 
>  		/* A packet error means descriptor and data are untrusted */
> -		packet_error = enic_cq_rx_to_pkt_err_flags(&cqd,
> &ol_err_flags);
> +		packet_error = enic_cq_rx_check_err(&cqd);
> 
>  		/* Get the mbuf to return and replace with one just allocated
> */
>  		rxmb = rq->mbuf_ring[rx_id];
> @@ -318,6 +312,13 @@ enic_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
>  		rqd_ptr->address = rte_cpu_to_le_64(dma_addr);
>  		rqd_ptr->length_type = cpu_to_le16(nmb->buf_len);
> 
> +		/* Drop incoming bad packet */
> +		if (packet_error) {
> +			rte_pktmbuf_free(rxmb);
> +			nb_err++;
> +			continue;
> +		}
> +
>  		/* Fill in the rest of the mbuf */
>  		rxmb->data_off = RTE_PKTMBUF_HEADROOM;
>  		rxmb->nb_segs = 1;
> @@ -327,10 +328,6 @@ enic_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
>  			rxmb->pkt_len = enic_cq_rx_desc_n_bytes(&cqd);
>  			rxmb->packet_type =
> enic_cq_rx_flags_to_pkt_type(&cqd);
>  			enic_cq_rx_to_pkt_flags(&cqd, rxmb);
> -		} else {
> -			rxmb->pkt_len = 0;
> -			rxmb->packet_type = 0;
> -			rxmb->ol_flags = 0;
>  		}
>  		rxmb->data_len = rxmb->pkt_len;
> 
> @@ -342,7 +339,7 @@ enic_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
>  		rx_pkts[nb_rx++] = rxmb;
>  	}
> 
> -	nb_hold += nb_rx;
> +	nb_hold += nb_rx + nb_err;
>  	cq->to_clean = rx_id;
> 
>  	if (nb_hold > rq->rx_free_thresh) {
> diff --git a/drivers/net/fm10k/fm10k_rxtx.c
> b/drivers/net/fm10k/fm10k_rxtx.c index 81ed4e7..dd92a91 100644
> --- a/drivers/net/fm10k/fm10k_rxtx.c
> +++ b/drivers/net/fm10k/fm10k_rxtx.c
> @@ -96,22 +96,6 @@ rx_desc_to_ol_flags(struct rte_mbuf *m, const union
> fm10k_rx_desc *d)
> 
>  	if (d->w.pkt_info & FM10K_RXD_RSSTYPE_MASK)
>  		m->ol_flags |= PKT_RX_RSS_HASH;
> -
> -	if (unlikely((d->d.staterr &
> -		(FM10K_RXD_STATUS_IPCS | FM10K_RXD_STATUS_IPE)) ==
> -		(FM10K_RXD_STATUS_IPCS | FM10K_RXD_STATUS_IPE)))
> -		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
> -
> -	if (unlikely((d->d.staterr &
> -		(FM10K_RXD_STATUS_L4CS | FM10K_RXD_STATUS_L4E)) ==
> -		(FM10K_RXD_STATUS_L4CS | FM10K_RXD_STATUS_L4E)))
> -		m->ol_flags |= PKT_RX_L4_CKSUM_BAD;
> -
> -	if (unlikely(d->d.staterr & FM10K_RXD_STATUS_HBO))
> -		m->ol_flags |= PKT_RX_HBUF_OVERFLOW;
> -
> -	if (unlikely(d->d.staterr & FM10K_RXD_STATUS_RXE))
> -		m->ol_flags |= PKT_RX_RECIP_ERR;
>  }
> 
>  uint16_t
> diff --git a/drivers/net/fm10k/fm10k_rxtx_vec.c
> b/drivers/net/fm10k/fm10k_rxtx_vec.c
> index 2f3ccfe..b368289 100644
> --- a/drivers/net/fm10k/fm10k_rxtx_vec.c
> +++ b/drivers/net/fm10k/fm10k_rxtx_vec.c
> @@ -101,7 +101,7 @@ fm10k_desc_to_olflags_v(__m128i descs[4], struct
> rte_mbuf **rx_pkts)
>  	const __m128i rxe_flag = _mm_set_epi8(0, 0, 0, 0,
>  			0, 0, 0, 0,
>  			0, 0, 0, 0,
> -			0, 0, PKT_RX_RECIP_ERR, 0);
> +			0, 0, 0, 0);
> 
>  	/* map rss type to rss hash flag */
>  	const __m128i rss_flags = _mm_set_epi8(0, 0, 0, 0, diff --git
> a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c index
> 4d35d83..76da7d2 100644
> --- a/drivers/net/i40e/i40e_rxtx.c
> +++ b/drivers/net/i40e/i40e_rxtx.c
> @@ -140,27 +140,12 @@ i40e_rxd_error_to_pkt_flags(uint64_t qword)
> #define I40E_RX_ERR_BITS 0x3f
>  	if (likely((error_bits & I40E_RX_ERR_BITS) == 0))
>  		return flags;
> -	/* If RXE bit set, all other status bits are meaningless */
> -	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_RXE_SHIFT))) {
> -		flags |= PKT_RX_MAC_ERR;
> -		return flags;
> -	}
> -
> -	/* If RECIPE bit set, all other status indications should be ignored */
> -	if (unlikely(error_bits & (1 <<
> I40E_RX_DESC_ERROR_RECIPE_SHIFT))) {
> -		flags |= PKT_RX_RECIP_ERR;
> -		return flags;
> -	}
> -	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_HBO_SHIFT)))
> -		flags |= PKT_RX_HBUF_OVERFLOW;
>  	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_IPE_SHIFT)))
>  		flags |= PKT_RX_IP_CKSUM_BAD;
>  	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_L4E_SHIFT)))
>  		flags |= PKT_RX_L4_CKSUM_BAD;
>  	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_EIPE_SHIFT)))
>  		flags |= PKT_RX_EIP_CKSUM_BAD;
> -	if (unlikely(error_bits & (1 <<
> I40E_RX_DESC_ERROR_OVERSIZE_SHIFT)))
> -		flags |= PKT_RX_OVERSIZE;
> 
>  	return flags;
>  }
> diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c index
> eec1456..878db89 100644
> --- a/lib/librte_mbuf/rte_mbuf.c
> +++ b/lib/librte_mbuf/rte_mbuf.c
> @@ -254,10 +254,6 @@ const char *rte_get_rx_ol_flag_name(uint64_t
> mask)
>  	case PKT_RX_L4_CKSUM_BAD: return "PKT_RX_L4_CKSUM_BAD";
>  	case PKT_RX_IP_CKSUM_BAD: return "PKT_RX_IP_CKSUM_BAD";
>  	case PKT_RX_EIP_CKSUM_BAD: return "PKT_RX_EIP_CKSUM_BAD";
> -	/* case PKT_RX_OVERSIZE: return "PKT_RX_OVERSIZE"; */
> -	/* case PKT_RX_HBUF_OVERFLOW: return
> "PKT_RX_HBUF_OVERFLOW"; */
> -	/* case PKT_RX_RECIP_ERR: return "PKT_RX_RECIP_ERR"; */
> -	/* case PKT_RX_MAC_ERR: return "PKT_RX_MAC_ERR"; */
>  	case PKT_RX_IEEE1588_PTP: return "PKT_RX_IEEE1588_PTP";
>  	case PKT_RX_IEEE1588_TMST: return "PKT_RX_IEEE1588_TMST";
>  	default: return NULL;
> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index
> e3ee0b3..3663d17 100644
> --- a/lib/librte_mbuf/rte_mbuf.h
> +++ b/lib/librte_mbuf/rte_mbuf.h
> @@ -85,10 +85,7 @@ extern "C" {
>  #define PKT_RX_L4_CKSUM_BAD  (1ULL << 3)  /**< L4 cksum of RX pkt. is
> not OK. */  #define PKT_RX_IP_CKSUM_BAD  (1ULL << 4)  /**< IP cksum of
> RX pkt. is not OK. */  #define PKT_RX_EIP_CKSUM_BAD (1ULL << 5)  /**<
> External IP header checksum error. */
> -#define PKT_RX_OVERSIZE      (0ULL << 0)  /**< Num of desc of an RX pkt
> oversize. */
> -#define PKT_RX_HBUF_OVERFLOW (0ULL << 0)  /**< Header buffer
> overflow. */
> -#define PKT_RX_RECIP_ERR     (0ULL << 0)  /**< Hardware processing error.
> */
> -#define PKT_RX_MAC_ERR       (0ULL << 0)  /**< MAC error. */
> +/* hole, some bits can be reused here  */
>  #define PKT_RX_IEEE1588_PTP  (1ULL << 9)  /**< RX IEEE1588 L2 Ethernet PT
> Packet. */  #define PKT_RX_IEEE1588_TMST (1ULL << 10) /**< RX IEEE1588
> L2/L4 timestamped packet.*/
>  #define PKT_RX_FDIR_ID       (1ULL << 13) /**< FD id reported if FDIR match.
> */
> --
> 2.8.0.rc3



More information about the dev mailing list