From 63625c5da1853b6d5a4f44b713c7d4a3d49ceb0a Mon Sep 17 00:00:00 2001 From: Dmitry Kozlyuk Date: Thu, 25 Nov 2021 22:20:44 +0200 Subject: [PATCH] common/mlx5: fix memory region lookup on slow path Memory region (MR) was being looked up incorrectly for the data address of an externally-attached mbuf. A search was attempted for the mempool of the mbuf, while mbuf data address does not belong to this mempool in case of externally-attached mbuf. Only attempt the search: 1) for not externally-attached mbufs; 2) for mbufs coming from MPRQ mempool; 3) for externally-attached mbufs from mempools with pinned external buffers. Fixes: 08ac03580ef2 ("common/mlx5: fix mempool registration") Signed-off-by: Dmitry Kozlyuk Reviewed-by: Matan Azrad Acked-by: Viacheslav Ovsiienko --- drivers/common/mlx5/mlx5_common_mr.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/common/mlx5/mlx5_common_mr.c b/drivers/common/mlx5/mlx5_common_mr.c index 01f35ebcdf..c694aaf28c 100644 --- a/drivers/common/mlx5/mlx5_common_mr.c +++ b/drivers/common/mlx5/mlx5_common_mr.c @@ -2002,21 +2002,29 @@ mlx5_mr_mb2mr_bh(struct mlx5_mr_ctrl *mr_ctrl, struct rte_mbuf *mb) dev_gen); struct mlx5_common_device *cdev = container_of(share_cache, struct mlx5_common_device, mr_scache); + bool external, mprq, pinned = false; /* Recover MPRQ mempool. */ - if (RTE_MBUF_HAS_EXTBUF(mb) && - mb->shinfo->free_cb == mlx5_mprq_buf_free_cb) { + external = RTE_MBUF_HAS_EXTBUF(mb); + if (external && mb->shinfo->free_cb == mlx5_mprq_buf_free_cb) { + mprq = true; buf = mb->shinfo->fcb_opaque; mp = buf->mp; } else { + mprq = false; mp = mlx5_mb2mp(mb); + pinned = rte_pktmbuf_priv_flags(mp) & + RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF; + } + if (!external || mprq || pinned) { + lkey = mlx5_mr_mempool2mr_bh(mr_ctrl, mp, addr); + if (lkey != UINT32_MAX) + return lkey; + /* MPRQ is always registered. */ + MLX5_ASSERT(!mprq); } - lkey = mlx5_mr_mempool2mr_bh(mr_ctrl, mp, addr); - if (lkey != UINT32_MAX) - return lkey; /* Register pinned external memory if the mempool is not used for Rx. */ - if (cdev->config.mr_mempool_reg_en && - (rte_pktmbuf_priv_flags(mp) & RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF)) { + if (cdev->config.mr_mempool_reg_en && pinned) { if (mlx5_mr_mempool_register(cdev, mp, true) < 0) return UINT32_MAX; lkey = mlx5_mr_mempool2mr_bh(mr_ctrl, mp, addr);