From patchwork Wed Jan 9 13:19:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yongseok Koh X-Patchwork-Id: 49540 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9B7841B484; Wed, 9 Jan 2019 14:19:23 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 86BFC1B46A for ; Wed, 9 Jan 2019 14:19:22 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from yskoh@mellanox.com) with ESMTPS (AES256-SHA encrypted); 9 Jan 2019 15:19:18 +0200 Received: from scfae-sc-2.mti.labs.mlnx (scfae-sc-2.mti.labs.mlnx [10.101.0.96]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x09DJFxE028789; Wed, 9 Jan 2019 15:19:16 +0200 From: Yongseok Koh To: olivier.matz@6wind.com, shahafs@mellanox.com Cc: dev@dpdk.org, david.marchand@redhat.com Date: Wed, 9 Jan 2019 05:19:07 -0800 Message-Id: <20190109131908.4949-1-yskoh@mellanox.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190109085426.39965-1-yskoh@mellanox.com> References: <20190109085426.39965-1-yskoh@mellanox.com> Subject: [dpdk-dev] [PATCH v2 1/2] mbuf: add function returning default buffer address 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" This patch introduces two new functions - rte_mbuf_buf_addr_default() and rte_mbuf_data_baddr_default(). rte_mbuf_buf_addr_default() reutrns the default buffer address of given mbuf which comes after mbuf structure and private data. rte_mbuf_data_baddr_default() returns the default address of mbuf data taking the headroom into account. Signed-off-by: Yongseok Koh Signed-off-by: Yongseok Koh > --- v2: * initial implementation lib/librte_mbuf/rte_mbuf.h | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index bc562dc8a9..6c4c1bd3e8 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -788,8 +788,47 @@ rte_mbuf_from_indirect(struct rte_mbuf *mi) } /** + * Return the default buffer address of the mbuf. + * + * @param mb + * The pointer to the mbuf. + * @param mp + * The pointer to the mempool of the mbuf. + * @return + * The pointer of the mbuf buffer. + */ +static inline char * +rte_mbuf_buf_addr_default(struct rte_mbuf *mb, struct rte_mempool *mp) +{ + char *buffer_addr; + + buffer_addr = (char *)mb + sizeof(*mb) + rte_pktmbuf_priv_size(mp); + return buffer_addr; +} + + +/** + * Return the default address of the beginning of the mbuf data. + * + * @param mb + * The pointer to the mbuf. + * @return + * The pointer of the beginning of the mbuf data. + */ +static inline char * +rte_mbuf_data_baddr_default(struct rte_mbuf *mb) +{ + return rte_mbuf_buf_addr_default(mb, mb->pool) + RTE_PKTMBUF_HEADROOM; +} + +/** * Return the buffer address embedded in the given mbuf. * + * Note that accessing mempool pointer of a mbuf is expensive because the + * pointer is stored in the 2nd cache line of mbuf. If mempool is known, it + * is better not to reference the mempool pointer in mbuf but calling + * rte_mbuf_buf_addr_default() would be more efficient. + * * @param md * The pointer to the mbuf. * @return @@ -798,9 +837,7 @@ rte_mbuf_from_indirect(struct rte_mbuf *mi) static inline char * rte_mbuf_to_baddr(struct rte_mbuf *md) { - char *buffer_addr; - buffer_addr = (char *)md + sizeof(*md) + rte_pktmbuf_priv_size(md->pool); - return buffer_addr; + return rte_mbuf_buf_addr_default(md, md->pool); } /** From patchwork Wed Jan 9 13:19:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yongseok Koh X-Patchwork-Id: 49541 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 59A121B498; Wed, 9 Jan 2019 14:19:25 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 89C0A1B46D for ; Wed, 9 Jan 2019 14:19:22 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from yskoh@mellanox.com) with ESMTPS (AES256-SHA encrypted); 9 Jan 2019 15:19:21 +0200 Received: from scfae-sc-2.mti.labs.mlnx (scfae-sc-2.mti.labs.mlnx [10.101.0.96]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x09DJFxF028789; Wed, 9 Jan 2019 15:19:18 +0200 From: Yongseok Koh To: olivier.matz@6wind.com, shahafs@mellanox.com Cc: dev@dpdk.org, david.marchand@redhat.com, stable@dpdk.org Date: Wed, 9 Jan 2019 05:19:08 -0800 Message-Id: <20190109131908.4949-2-yskoh@mellanox.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190109131908.4949-1-yskoh@mellanox.com> References: <20190109085426.39965-1-yskoh@mellanox.com> <20190109131908.4949-1-yskoh@mellanox.com> Subject: [dpdk-dev] [PATCH v2 2/2] net/mlx5: fix instruction hotspot on replenishing Rx buffer 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 replenishing Rx buffers for vectorized Rx, mbuf->buf_addr isn't needed to be accessed as it is static and easily calculated from the mbuf address. Accessing the mbuf content causes unnecessary load stall and it is worsened on ARM. Fixes: 545b884b1da3 ("net/mlx5: fix buffer address posting in SSE Rx") Cc: stable@dpdk.org Signed-off-by: Yongseok Koh --- v2: * use the newly introduced API - rte_mbuf_buf_addr_default() * fix error in assert drivers/net/mlx5/mlx5_rxtx_vec.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/mlx5/mlx5_rxtx_vec.h b/drivers/net/mlx5/mlx5_rxtx_vec.h index fda7004e2d..154934d92d 100644 --- a/drivers/net/mlx5/mlx5_rxtx_vec.h +++ b/drivers/net/mlx5/mlx5_rxtx_vec.h @@ -102,8 +102,10 @@ mlx5_rx_replenish_bulk_mbuf(struct mlx5_rxq_data *rxq, uint16_t n) return; } for (i = 0; i < n; ++i) { - wq[i].addr = rte_cpu_to_be_64((uintptr_t)elts[i]->buf_addr + - RTE_PKTMBUF_HEADROOM); + void *buf_addr = rte_mbuf_buf_addr_default(elts[i], rxq->mp); + + assert(buf_addr == elts[i]->buf_addr); + wq[i].addr = rte_cpu_to_be_64((uintptr_t)buf_addr + RTE_PKTMBUF_HEADROOM); /* If there's only one MR, no need to replace LKey in WQE. */ if (unlikely(mlx5_mr_btree_len(&rxq->mr_ctrl.cache_bh) > 1)) wq[i].lkey = mlx5_rx_mb2mr(rxq, elts[i]);