From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5B1F5A04DD; Wed, 28 Oct 2020 14:14:32 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1F2AECAC8; Wed, 28 Oct 2020 14:14:29 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 1BE87CAB7 for ; Wed, 28 Oct 2020 14:14:27 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from jiaweiw@nvidia.com) with SMTP; 28 Oct 2020 15:14:22 +0200 Received: from nvidia.com (gen-l-vrt-280.mtl.labs.mlnx [10.237.45.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 09SDEMNW015229; Wed, 28 Oct 2020 15:14:22 +0200 From: Jiawei Wang To: viacheslavo@nvidia.com, matan@nvidia.com, shahafs@nvidia.com, orika@nvidia.com Cc: dev@dpdk.org, rasland@nvidia.com, stable@dpdk.org Date: Wed, 28 Oct 2020 15:14:22 +0200 Message-Id: <1603890862-361416-1-git-send-email-jiaweiw@nvidia.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH] common/mlx5: free MR resource while device DMA unmap 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" 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. Redmine: 2330226 Fixes: 989e999d9305 ("net/mlx5: support PCI device DMA map and unmap") Cc: stable@dpdk.org Signed-off-by: Jiawei Wang --- drivers/common/mlx5/mlx5_common_mr.c | 12 ++++++------ drivers/common/mlx5/mlx5_common_mr.h | 4 ++++ drivers/common/mlx5/version.map | 1 + drivers/net/mlx5/mlx5_mr.c | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/common/mlx5/mlx5_common_mr.c b/drivers/common/mlx5/mlx5_common_mr.c index 23324c0..7c25541 100644 --- a/drivers/common/mlx5/mlx5_common_mr.c +++ b/drivers/common/mlx5/mlx5_common_mr.c @@ -436,8 +436,8 @@ struct mlx5_mr * * @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 @@ struct mlx5_mr * 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 @@ struct mlx5_mr * 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 @@ struct mlx5_mr * * 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 @@ struct mlx5_mr * * 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; } diff --git a/drivers/common/mlx5/mlx5_common_mr.h b/drivers/common/mlx5/mlx5_common_mr.h index a2c426d..da0a0f0 100644 --- a/drivers/common/mlx5/mlx5_common_mr.h +++ b/drivers/common/mlx5/mlx5_common_mr.h @@ -171,4 +171,8 @@ struct mlx5_mr * __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_ */ diff --git a/drivers/common/mlx5/version.map b/drivers/common/mlx5/version.map index 884001c..f0f3ca9 100644 --- a/drivers/common/mlx5/version.map +++ b/drivers/common/mlx5/version.map @@ -63,6 +63,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; diff --git a/drivers/net/mlx5/mlx5_mr.c b/drivers/net/mlx5/mlx5_mr.c index c308ecc..8b20ee3 100644 --- a/drivers/net/mlx5/mlx5_mr.c +++ b/drivers/net/mlx5/mlx5_mr.c @@ -404,7 +404,7 @@ struct mr_update_mp_data { 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); -- 1.8.3.1