common/mlx5: fix default devargs initialization
[dpdk.git] / drivers / common / mlx5 / mlx5_common_mr.c
index 01f35eb..fa27bd9 100644 (file)
@@ -516,8 +516,7 @@ mlx5_mr_free(struct mlx5_mr *mr, mlx5_dereg_mr_t dereg_mr_cb)
                return;
        DRV_LOG(DEBUG, "freeing MR(%p):", (void *)mr);
        dereg_mr_cb(&mr->pmd_mr);
-       if (mr->ms_bmp != NULL)
-               rte_bitmap_free(mr->ms_bmp);
+       rte_bitmap_free(mr->ms_bmp);
        mlx5_free(mr);
 }
 
@@ -1541,7 +1540,7 @@ mlx5_mempool_reg_create(struct rte_mempool *mp, unsigned int mrs_n,
  * Destroy a mempool registration object.
  *
  * @param standalone
- *   Whether @p mpr owns its MRs excludively, i.e. they are not shared.
+ *   Whether @p mpr owns its MRs exclusively, i.e. they are not shared.
  */
 static void
 mlx5_mempool_reg_destroy(struct mlx5_mr_share_cache *share_cache,
@@ -1834,12 +1833,13 @@ mlx5_mempool_reg_addr2mr(struct mlx5_mempool_reg *mpr, uintptr_t addr,
 
        for (i = 0; i < mpr->mrs_n; i++) {
                const struct mlx5_pmd_mr *mr = &mpr->mrs[i].pmd_mr;
-               uintptr_t mr_addr = (uintptr_t)mr->addr;
+               uintptr_t mr_start = (uintptr_t)mr->addr;
+               uintptr_t mr_end = mr_start + mr->len;
 
-               if (mr_addr <= addr) {
+               if (mr_start <= addr && addr < mr_end) {
                        lkey = rte_cpu_to_be_32(mr->lkey);
-                       entry->start = mr_addr;
-                       entry->end = mr_addr + mr->len;
+                       entry->start = mr_start;
+                       entry->end = mr_end;
                        entry->lkey = lkey;
                        break;
                }
@@ -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);