From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Liang, Cunming" Subject: Re: [PATCH v3 04/16] fm10k: add func to re-allocate mbuf for RX ring Date: Wed, 28 Oct 2015 21:58:34 +0800 Message-ID: <5630D48A.9000809@intel.com> References: <1445507104-22563-2-git-send-email-jing.d.chen@intel.com> <1445939209-12783-1-git-send-email-jing.d.chen@intel.com> <1445939209-12783-5-git-send-email-jing.d.chen@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit To: "Chen Jing D(Mark)" , dev@dpdk.org Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id EFB098DB4 for ; Wed, 28 Oct 2015 14:58:37 +0100 (CET) In-Reply-To: <1445939209-12783-5-git-send-email-jing.d.chen@intel.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Hi Mark, On 10/27/2015 5:46 PM, Chen Jing D(Mark) wrote: > From: "Chen Jing D(Mark)" > > Add function fm10k_rxq_rearm to re-allocate mbuf for used desc > in RX HW ring. > > Signed-off-by: Chen Jing D(Mark) > --- > drivers/net/fm10k/fm10k.h | 9 ++++ > drivers/net/fm10k/fm10k_ethdev.c | 3 + > drivers/net/fm10k/fm10k_rxtx_vec.c | 90 ++++++++++++++++++++++++++++++++++++ > 3 files changed, 102 insertions(+), 0 deletions(-) [...] > +static inline void > +fm10k_rxq_rearm(struct fm10k_rx_queue *rxq) > +{ > + int i; > + uint16_t rx_id; > + volatile union fm10k_rx_desc *rxdp; > + struct rte_mbuf **mb_alloc = &rxq->sw_ring[rxq->rxrearm_start]; > + struct rte_mbuf *mb0, *mb1; > + __m128i head_off = _mm_set_epi64x( > + RTE_PKTMBUF_HEADROOM + FM10K_RX_DATABUF_ALIGN - 1, > + RTE_PKTMBUF_HEADROOM + FM10K_RX_DATABUF_ALIGN - 1); > + __m128i dma_addr0, dma_addr1; > + /* Rx buffer need to be aligned with 512 byte */ > + const __m128i hba_msk = _mm_set_epi64x(0, > + UINT64_MAX - FM10K_RX_DATABUF_ALIGN + 1); > + > + rxdp = rxq->hw_ring + rxq->rxrearm_start; > + > + /* Pull 'n' more MBUFs into the software ring */ > + if (rte_mempool_get_bulk(rxq->mp, > + (void *)mb_alloc, > + RTE_FM10K_RXQ_REARM_THRESH) < 0) { Here's one potential issue when the failure happens. As tail won't update, the head will equal to tail in the end. HW won't write back anyway, however the SW recv_raw_pkts_vec only check DD bit, the old 'dirty' descriptor(DD bit is not clean) will be taken and continue move forward to check the next which even beyond the tail. I'm sorry didn't catch it on the first time. /Steve > + rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed += > + RTE_FM10K_RXQ_REARM_THRESH; > + return; > + } > + > +