[dpdk-dev] [PATCH v2 16/20] net/ice: support basic RX/TX

Varghese, Vipin vipin.varghese at intel.com
Tue Dec 4 06:44:07 CET 2018


May this logic is just to allocate the initial descriptor and not actual, if yes please ignore my comments.

> -----Original Message-----
> From: dev <dev-bounces at dpdk.org> On Behalf Of Varghese, Vipin
> Sent: Tuesday, December 4, 2018 11:12 AM
> To: Lu, Wenzhuo <wenzhuo.lu at intel.com>; dev at dpdk.org
> Cc: Lu, Wenzhuo <wenzhuo.lu at intel.com>; Yang, Qiming
> <qiming.yang at intel.com>; Li, Xiaoyun <xiaoyun.li at intel.com>; Wu, Jingjing
> <jingjing.wu at intel.com>
> Subject: Re: [dpdk-dev] [PATCH v2 16/20] net/ice: support basic RX/TX
> 
> snipped
> > +uint16_t
> > +ice_recv_pkts(void *rx_queue,
> > +	      struct rte_mbuf **rx_pkts,
> > +	      uint16_t nb_pkts)
> > +{
> > +	struct ice_rx_queue *rxq = rx_queue;
> > +	volatile union ice_rx_desc *rx_ring = rxq->rx_ring;
> > +	volatile union ice_rx_desc *rxdp;
> > +	union ice_rx_desc rxd;
> > +	struct ice_rx_entry *sw_ring = rxq->sw_ring;
> > +	struct ice_rx_entry *rxe;
> > +	struct rte_mbuf *nmb; /* new allocated mbuf */
> > +	struct rte_mbuf *rxm; /* pointer to store old mbuf in SW ring */
> > +	uint16_t rx_id = rxq->rx_tail;
> > +	uint16_t nb_rx = 0;
> > +	uint16_t nb_hold = 0;
> > +	uint16_t rx_packet_len;
> > +	uint32_t rx_status;
> > +	uint64_t qword1;
> > +	uint64_t dma_addr;
> > +	uint64_t pkt_flags = 0;
> > +	uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl;
> > +	struct rte_eth_dev *dev;
> > +
> > +	while (nb_rx < nb_pkts) {
> > +		rxdp = &rx_ring[rx_id];
> > +		qword1 = rte_le_to_cpu_64(rxdp-
> > >wb.qword1.status_error_len);
> > +		rx_status = (qword1 & ICE_RXD_QW1_STATUS_M) >>
> > +			    ICE_RXD_QW1_STATUS_S;
> > +
> > +		/* Check the DD bit first */
> > +		if (!(rx_status & (1 << ICE_RX_DESC_STATUS_DD_S)))
> > +			break;
> > +
> > +		/* allocate mbuf */
> > +		nmb = rte_mbuf_raw_alloc(rxq->mp);
> > +		if (unlikely(!nmb)) {
> > +			dev = ICE_VSI_TO_ETH_DEV(rxq->vsi);
> > +			dev->data->rx_mbuf_alloc_failed++;
> > +			break;
> > +		}
> 
> Should we check if the received packet length is greater than mbug pkt_len then
> we need bulk alloc with n_segs?
> 
> > +		rxd = *rxdp; /* copy descriptor in ring to temp variable*/
> > +
> > +		nb_hold++;
> > +		rxe = &sw_ring[rx_id]; /* get corresponding mbuf in SW ring */
> > +		rx_id++;
> > +		if (unlikely(rx_id == rxq->nb_rx_desc))
> > +			rx_id = 0;
> > +		rxm = rxe->mbuf;
> > +		rxe->mbuf = nmb;
> > +		dma_addr =
> > +			rte_cpu_to_le_64(rte_mbuf_data_iova_default(nmb));
> > +
> > +		/**
> > +		 * fill the read format of descriptor with physic address in
> > +		 * new allocated mbuf: nmb
> > +		 */
> > +		rxdp->read.hdr_addr = 0;
> > +		rxdp->read.pkt_addr = dma_addr;
> > +
> > +		/* calculate rx_packet_len of the received pkt */
> > +		rx_packet_len = ((qword1 & ICE_RXD_QW1_LEN_PBUF_M) >>
> > +				ICE_RXD_QW1_LEN_PBUF_S) - rxq->crc_len;
> > +
> > +		/* fill old mbuf with received descriptor: rxd */
> > +		rxm->data_off = RTE_PKTMBUF_HEADROOM;
> > +		rte_prefetch0(RTE_PTR_ADD(rxm->buf_addr,
> > RTE_PKTMBUF_HEADROOM));
> > +		rxm->nb_segs = 1;
> 
> Same comment for above for multi segment alloc for larger packets or smaller
> pkt_len in mempool?
> 
> Snipped



More information about the dev mailing list