From patchwork Thu Jan 10 22:40:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yongseok Koh X-Patchwork-Id: 49669 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 AA1501B996; Thu, 10 Jan 2019 23:40:40 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id B00F31B96E for ; Thu, 10 Jan 2019 23:40:39 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from yskoh@mellanox.com) with ESMTPS (AES256-SHA encrypted); 11 Jan 2019 00:40:35 +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 x0AMeXlD022738; Fri, 11 Jan 2019 00:40:34 +0200 From: Yongseok Koh To: olivier.matz@6wind.com, shahafs@mellanox.com Cc: dev@dpdk.org, roszenrami@gmail.com, david.marchand@redhat.com Date: Thu, 10 Jan 2019 14:40:29 -0800 Message-Id: <20190110224030.2671-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 v4 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() and rte_mbuf_data_addr_default(). rte_mbuf_buf_addr() reutrns the default buffer address of given mbuf which comes after mbuf structure and private data. rte_mbuf_data_addr_default() returns the default address of mbuf data taking the headroom into account. Signed-off-by: Yongseok Koh Acked-by: Olivier Matz Reviewed-by: David Marchand --- Please ignore v3, there were errors with some compilers. v4: * fix compilation error due to the experimental tag * add warning of experimental tag to the comments v3: * rename functions v2: * initial implementation lib/librte_mbuf/rte_mbuf.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index bc562dc8a9..5787616999 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -788,8 +788,54 @@ rte_mbuf_from_indirect(struct rte_mbuf *mi) } /** + * Return the default buffer address of the mbuf. + * + * @warning + * @b EXPERIMENTAL: This API may change without prior notice. + * This will be used by rte_mbuf_to_baddr() which has redundant code once + * experimental tag is removed. + * + * @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_experimental +rte_mbuf_buf_addr(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. + * + * @warning + * @b EXPERIMENTAL: This API may change without prior notice. + * + * @param mb + * The pointer to the mbuf. + * @return + * The pointer of the beginning of the mbuf data. + */ +static inline char * __rte_experimental +rte_mbuf_data_addr_default(struct rte_mbuf *mb) +{ + return rte_mbuf_buf_addr(mb, mb->pool) + RTE_PKTMBUF_HEADROOM; +} + +/** * Return the buffer address embedded in the given mbuf. * + * @note: 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() would be more efficient. + * * @param md * The pointer to the mbuf. * @return From patchwork Thu Jan 10 22:40:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yongseok Koh X-Patchwork-Id: 49670 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 30F871B9A8; Thu, 10 Jan 2019 23:40:46 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id B643A1B9A4 for ; Thu, 10 Jan 2019 23:40:44 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from yskoh@mellanox.com) with ESMTPS (AES256-SHA encrypted); 11 Jan 2019 00:40:39 +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 x0AMeXlE022738; Fri, 11 Jan 2019 00:40:36 +0200 From: Yongseok Koh To: olivier.matz@6wind.com, shahafs@mellanox.com Cc: dev@dpdk.org, roszenrami@gmail.com, david.marchand@redhat.com, stable@dpdk.org Date: Thu, 10 Jan 2019 14:40:30 -0800 Message-Id: <20190110224030.2671-2-yskoh@mellanox.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190110224030.2671-1-yskoh@mellanox.com> References: <20190109085426.39965-1-yskoh@mellanox.com> <20190110224030.2671-1-yskoh@mellanox.com> Subject: [dpdk-dev] [PATCH v4 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 --- v4: * no change v3: * rte_mbuf_buf_addr_default() -> rte_mbuf_buf_addr() 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..989a1fdce5 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(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]);