From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 04224A0542; Thu, 13 Feb 2020 04:10:43 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DDB9A1BE94; Thu, 13 Feb 2020 04:10:42 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 507EC1BDAE; Thu, 13 Feb 2020 04:10:40 +0100 (CET) X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Feb 2020 19:10:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,434,1574150400"; d="scan'208";a="347644123" Received: from yexl-server.sh.intel.com (HELO localhost) ([10.67.117.17]) by fmsmga001.fm.intel.com with ESMTP; 12 Feb 2020 19:10:38 -0800 Date: Thu, 13 Feb 2020 11:09:17 +0800 From: Ye Xiaolong To: Ciara Loftus Cc: dev@dpdk.org, stable@dpdk.org Message-ID: <20200213030917.GP80720@intel.com> References: <20200210114009.49590-1-ciara.loftus@intel.com> <20200210114009.49590-3-ciara.loftus@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200210114009.49590-3-ciara.loftus@intel.com> User-Agent: Mutt/1.9.4 (2018-02-28) Subject: Re: [dpdk-dev] [PATCH v3 2/3] net/af_xdp: use correct fill queue addresses X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 02/10, Ciara Loftus wrote: >The fill queue addresses should start at the beginning of the mempool >object instead of the beginning of the mbuf. This is because the umem >frame headroom includes the mp hdrobj size. Starting at this point >ensures AF_XDP doesn't write past the available room in the frame, in >the case of larger packets which are close to the size of the mbuf. > >Fixes: d8a210774e1d ("net/af_xdp: support unaligned umem chunks") >Cc: stable@dpdk.org > >Signed-off-by: Ciara Loftus >--- > drivers/net/af_xdp/rte_eth_af_xdp.c | 25 +++++++++++++++++-------- > 1 file changed, 17 insertions(+), 8 deletions(-) > >diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c >index 8b189119c..1e98cd44f 100644 >--- a/drivers/net/af_xdp/rte_eth_af_xdp.c >+++ b/drivers/net/af_xdp/rte_eth_af_xdp.c >@@ -172,7 +172,8 @@ reserve_fill_queue_zc(struct xsk_umem_info *umem, uint16_t reserve_size, > uint64_t addr; > > fq_addr = xsk_ring_prod__fill_addr(fq, idx++); >- addr = (uint64_t)bufs[i] - (uint64_t)umem->buffer; >+ addr = (uint64_t)bufs[i] - (uint64_t)umem->buffer - >+ umem->mb_pool->header_size; > *fq_addr = addr; > } > >@@ -271,8 +272,11 @@ af_xdp_rx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) > addr = xsk_umem__extract_addr(addr); > > bufs[i] = (struct rte_mbuf *) >- xsk_umem__get_data(umem->buffer, addr); >- bufs[i]->data_off = offset - sizeof(struct rte_mbuf); >+ xsk_umem__get_data(umem->buffer, addr + >+ umem->mb_pool->header_size); >+ bufs[i]->data_off = offset - sizeof(struct rte_mbuf) - >+ rte_pktmbuf_priv_size(umem->mb_pool) - >+ umem->mb_pool->header_size; > > rte_pktmbuf_pkt_len(bufs[i]) = len; > rte_pktmbuf_data_len(bufs[i]) = len; >@@ -385,7 +389,8 @@ pull_umem_cq(struct xsk_umem_info *umem, int size) > #if defined(XDP_UMEM_UNALIGNED_CHUNK_FLAG) > addr = xsk_umem__extract_addr(addr); > rte_pktmbuf_free((struct rte_mbuf *) >- xsk_umem__get_data(umem->buffer, addr)); >+ xsk_umem__get_data(umem->buffer, >+ addr + umem->mb_pool->header_size)); > #else > rte_ring_enqueue(umem->buf_ring, (void *)addr); > #endif >@@ -443,9 +448,11 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) > } > desc = xsk_ring_prod__tx_desc(&txq->tx, idx_tx); > desc->len = mbuf->pkt_len; >- addr = (uint64_t)mbuf - (uint64_t)umem->buffer; >+ addr = (uint64_t)mbuf - (uint64_t)umem->buffer - >+ umem->mb_pool->header_size; > offset = rte_pktmbuf_mtod(mbuf, uint64_t) - >- (uint64_t)mbuf; >+ (uint64_t)mbuf + >+ umem->mb_pool->header_size; > offset = offset << XSK_UNALIGNED_BUF_OFFSET_SHIFT; > desc->addr = addr | offset; > count++; >@@ -466,9 +473,11 @@ af_xdp_tx_zc(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) > desc = xsk_ring_prod__tx_desc(&txq->tx, idx_tx); > desc->len = mbuf->pkt_len; > >- addr = (uint64_t)local_mbuf - (uint64_t)umem->buffer; >+ addr = (uint64_t)local_mbuf - (uint64_t)umem->buffer - >+ umem->mb_pool->header_size; > offset = rte_pktmbuf_mtod(local_mbuf, uint64_t) - >- (uint64_t)local_mbuf; >+ (uint64_t)local_mbuf + >+ umem->mb_pool->header_size; > pkt = xsk_umem__get_data(umem->buffer, addr + offset); > offset = offset << XSK_UNALIGNED_BUF_OFFSET_SHIFT; > desc->addr = addr | offset; >-- >2.17.1 > Reviewed-by: Xiaolong Ye