]> git.droids-corp.org - dpdk.git/commitdiff
common/mlx5: free MR resource on device DMA unmap
authorJiawei Wang <jiaweiw@nvidia.com>
Mon, 2 Nov 2020 02:22:28 +0000 (04:22 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 13 Nov 2020 15:26:54 +0000 (16:26 +0100)
mlx5 PMD created the MR (Memory Region) resource on the
mlx5_dma_map call to make the memory available for DMA
operations. On the mlx5_dma_unmap call the MR resource
was not freed but inserted to MR Free list for further
garbage collection.
Actual MR resource destroying happened on device stop
call. That caused the runtime out of memory in case of
application performed multiple DMA map/unmap calls.

The fix immediately frees the MR resource on mlx5_dma_unmap
call not engaging the list. The export for mlx5_mr_free
function from common PMD part is added as well.

Fixes: 989e999d9305 ("net/mlx5: support PCI device DMA map and unmap")
Cc: stable@dpdk.org
Signed-off-by: Jiawei Wang <jiaweiw@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/common/mlx5/mlx5_common_mr.c
drivers/common/mlx5/mlx5_common_mr.h
drivers/common/mlx5/version.map
drivers/net/mlx5/mlx5_mr.c

index 23324c0fc7a1d09f0d47dfcde9f703a63a59e330..7c25541dc424d6183d703f808102248304aa660c 100644 (file)
@@ -436,8 +436,8 @@ mlx5_mr_lookup_cache(struct mlx5_mr_share_cache *share_cache,
  * @param mr
  *   Pointer to MR to free.
  */
-static void
-mr_free(struct mlx5_mr *mr, mlx5_dereg_mr_t dereg_mr_cb)
+void
+mlx5_mr_free(struct mlx5_mr *mr, mlx5_dereg_mr_t dereg_mr_cb)
 {
        if (mr == NULL)
                return;
@@ -492,7 +492,7 @@ mlx5_mr_garbage_collect(struct mlx5_mr_share_cache *share_cache)
                struct mlx5_mr *mr = mr_next;
 
                mr_next = LIST_NEXT(mr, mr);
-               mr_free(mr, share_cache->dereg_mr_cb);
+               mlx5_mr_free(mr, share_cache->dereg_mr_cb);
        }
 }
 
@@ -702,7 +702,7 @@ alloc_resources:
                data.start = RTE_ALIGN_FLOOR(addr, msl->page_sz);
                data.end = data.start + msl->page_sz;
                rte_mcfg_mem_read_unlock();
-               mr_free(mr, share_cache->dereg_mr_cb);
+               mlx5_mr_free(mr, share_cache->dereg_mr_cb);
                goto alloc_resources;
        }
        MLX5_ASSERT(data.msl == data_re.msl);
@@ -725,7 +725,7 @@ alloc_resources:
                 * Must be unlocked before calling rte_free() because
                 * mlx5_mr_mem_event_free_cb() can be called inside.
                 */
-               mr_free(mr, share_cache->dereg_mr_cb);
+               mlx5_mr_free(mr, share_cache->dereg_mr_cb);
                return entry->lkey;
        }
        /*
@@ -801,7 +801,7 @@ err_nolock:
         * calling rte_free() because mlx5_mr_mem_event_free_cb() can be called
         * inside.
         */
-       mr_free(mr, share_cache->dereg_mr_cb);
+       mlx5_mr_free(mr, share_cache->dereg_mr_cb);
        return UINT32_MAX;
 }
 
index a2c426df2b4d9f28b4a351a01cb8cbb31676ce58..da0a0f0c798e5975047921a641176e131b5e3859 100644 (file)
@@ -171,4 +171,8 @@ mlx5_common_verbs_reg_mr(void *pd, void *addr, size_t length,
 __rte_internal
 void
 mlx5_common_verbs_dereg_mr(struct mlx5_pmd_mr *pmd_mr);
+
+__rte_internal
+void
+mlx5_mr_free(struct mlx5_mr *mr, mlx5_dereg_mr_t dereg_mr_cb);
 #endif /* RTE_PMD_MLX5_COMMON_MR_H_ */
index 52fde50fbf3ff065d9c3164f2fb77e93c5f023b8..17dd11f63528dff42b4ba505ce0bfc9aec9e9963 100644 (file)
@@ -65,6 +65,7 @@ INTERNAL {
        mlx5_mr_lookup_list;
        mlx5_mr_create_primary;
        mlx5_mr_flush_local_cache;
+       mlx5_mr_free;
 
        mlx5_nl_allmulti;
        mlx5_nl_devlink_family_id_get;
index c308eccefbb1b3cc64bc5b6a7c575d54436e8ff3..8b20ee3f835df7569ee85fefd025164eff3d7290 100644 (file)
@@ -404,7 +404,7 @@ mlx5_dma_unmap(struct rte_pci_device *pdev, void *addr,
                return -1;
        }
        LIST_REMOVE(mr, mr);
-       LIST_INSERT_HEAD(&sh->share_cache.mr_free_list, mr, mr);
+       mlx5_mr_free(mr, sh->share_cache.dereg_mr_cb);
        DEBUG("port %u remove MR(%p) from list", dev->data->port_id,
              (void *)mr);
        mlx5_mr_rebuild_cache(&sh->share_cache);