X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fcommon%2Fmlx5%2Fmlx5_common_mr.c;h=7c25541dc424d6183d703f808102248304aa660c;hb=edb704da80ff6dbe9a309a574c42d1fa1026b276;hp=c68be542aeeb6bd2db8fe9399430121e68f0c25d;hpb=56d2067735d9ed4a3ee35ff5481c170413b9e763;p=dpdk.git diff --git a/drivers/common/mlx5/mlx5_common_mr.c b/drivers/common/mlx5/mlx5_common_mr.c index c68be542ae..7c25541dc4 100644 --- a/drivers/common/mlx5/mlx5_common_mr.c +++ b/drivers/common/mlx5/mlx5_common_mr.c @@ -12,6 +12,7 @@ #include "mlx5_common_mp.h" #include "mlx5_common_mr.h" #include "mlx5_common_utils.h" +#include "mlx5_malloc.h" struct mr_find_contig_memsegs_data { uintptr_t addr; @@ -47,7 +48,8 @@ mr_btree_expand(struct mlx5_mr_btree *bt, int n) * Initially cache_bh[] will be given practically enough space and once * it is expanded, expansion wouldn't be needed again ever. */ - mem = rte_realloc(bt->table, n * sizeof(struct mr_cache_entry), 0); + mem = mlx5_realloc(bt->table, MLX5_MEM_RTE | MLX5_MEM_ZERO, + n * sizeof(struct mr_cache_entry), 0, SOCKET_ID_ANY); if (mem == NULL) { /* Not an error, B-tree search will be skipped. */ DRV_LOG(WARNING, "failed to expand MR B-tree (%p) table", @@ -180,9 +182,9 @@ mlx5_mr_btree_init(struct mlx5_mr_btree *bt, int n, int socket) } MLX5_ASSERT(!bt->table && !bt->size); memset(bt, 0, sizeof(*bt)); - bt->table = rte_calloc_socket("B-tree table", - n, sizeof(struct mr_cache_entry), - 0, socket); + bt->table = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, + sizeof(struct mr_cache_entry) * n, + 0, socket); if (bt->table == NULL) { rte_errno = ENOMEM; DEBUG("failed to allocate memory for btree cache on socket %d", @@ -212,7 +214,7 @@ mlx5_mr_btree_free(struct mlx5_mr_btree *bt) return; DEBUG("freeing B-tree %p with table %p", (void *)bt, (void *)bt->table); - rte_free(bt->table); + mlx5_free(bt->table); memset(bt, 0, sizeof(*bt)); } @@ -434,17 +436,16 @@ 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) +void +mlx5_mr_free(struct mlx5_mr *mr, mlx5_dereg_mr_t dereg_mr_cb) { if (mr == NULL) return; DRV_LOG(DEBUG, "freeing MR(%p):", (void *)mr); - if (mr->pmd_mr.obj != NULL) - claim_zero(mlx5_glue->dereg_mr(mr->pmd_mr.obj)); + dereg_mr_cb(&mr->pmd_mr); if (mr->ms_bmp != NULL) rte_bitmap_free(mr->ms_bmp); - rte_free(mr); + mlx5_free(mr); } void @@ -491,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); + mlx5_mr_free(mr, share_cache->dereg_mr_cb); } } @@ -598,7 +599,6 @@ mlx5_mr_create_primary(void *pd, uint32_t ms_n; uint32_t n; size_t len; - struct ibv_mr *ibv_mr; DRV_LOG(DEBUG, "Creating a MR using address (%p)", (void *)addr); /* @@ -652,11 +652,9 @@ alloc_resources: (void *)addr, data.start, data.end, msl->page_sz, ms_n); /* Size of memory for bitmap. */ bmp_size = rte_bitmap_get_memory_footprint(ms_n); - mr = rte_zmalloc_socket(NULL, - RTE_ALIGN_CEIL(sizeof(*mr), - RTE_CACHE_LINE_SIZE) + - bmp_size, - RTE_CACHE_LINE_SIZE, msl->socket_id); + mr = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, + RTE_ALIGN_CEIL(sizeof(*mr), RTE_CACHE_LINE_SIZE) + + bmp_size, RTE_CACHE_LINE_SIZE, msl->socket_id); if (mr == NULL) { DEBUG("Unable to allocate memory for a new MR of" " address (%p).", (void *)addr); @@ -704,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); + mlx5_mr_free(mr, share_cache->dereg_mr_cb); goto alloc_resources; } MLX5_ASSERT(data.msl == data_re.msl); @@ -727,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); + mlx5_mr_free(mr, share_cache->dereg_mr_cb); return entry->lkey; } /* @@ -762,25 +760,18 @@ alloc_resources: mr->ms_bmp_n = len / msl->page_sz; MLX5_ASSERT(ms_idx_shift + mr->ms_bmp_n <= ms_n); /* - * Finally create a verbs MR for the memory chunk. ibv_reg_mr() can be - * called with holding the memory lock because it doesn't use + * Finally create an MR for the memory chunk. Verbs: ibv_reg_mr() can + * be called with holding the memory lock because it doesn't use * mlx5_alloc_buf_extern() which eventually calls rte_malloc_socket() * through mlx5_alloc_verbs_buf(). */ - ibv_mr = mlx5_glue->reg_mr(pd, (void *)data.start, len, - IBV_ACCESS_LOCAL_WRITE | - (haswell_broadwell_cpu ? 0 : - IBV_ACCESS_RELAXED_ORDERING)); - if (ibv_mr == NULL) { + share_cache->reg_mr_cb(pd, (void *)data.start, len, &mr->pmd_mr); + if (mr->pmd_mr.obj == NULL) { DEBUG("Fail to create an MR for address (%p)", (void *)addr); rte_errno = EINVAL; goto err_mrlock; } - mr->pmd_mr.lkey = ibv_mr->lkey; - mr->pmd_mr.addr = ibv_mr->addr; - mr->pmd_mr.len = ibv_mr->length; - mr->pmd_mr.obj = ibv_mr; MLX5_ASSERT((uintptr_t)mr->pmd_mr.addr == data.start); MLX5_ASSERT(mr->pmd_mr.len); LIST_INSERT_HEAD(&share_cache->mr_list, mr, mr); @@ -810,7 +801,7 @@ err_nolock: * calling rte_free() because mlx5_mr_mem_event_free_cb() can be called * inside. */ - mr_free(mr); + mlx5_mr_free(mr, share_cache->dereg_mr_cb); return UINT32_MAX; } @@ -1037,32 +1028,24 @@ mlx5_mr_flush_local_cache(struct mlx5_mr_ctrl *mr_ctrl) * Pointer to MR structure on success, NULL otherwise. */ struct mlx5_mr * -mlx5_create_mr_ext(void *pd, uintptr_t addr, size_t len, int socket_id) +mlx5_create_mr_ext(void *pd, uintptr_t addr, size_t len, int socket_id, + mlx5_reg_mr_t reg_mr_cb) { - struct ibv_mr *ibv_mr; struct mlx5_mr *mr = NULL; - mr = rte_zmalloc_socket(NULL, - RTE_ALIGN_CEIL(sizeof(*mr), - RTE_CACHE_LINE_SIZE), - RTE_CACHE_LINE_SIZE, socket_id); + mr = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, + RTE_ALIGN_CEIL(sizeof(*mr), RTE_CACHE_LINE_SIZE), + RTE_CACHE_LINE_SIZE, socket_id); if (mr == NULL) return NULL; - ibv_mr = mlx5_glue->reg_mr(pd, (void *)addr, len, - IBV_ACCESS_LOCAL_WRITE | - (haswell_broadwell_cpu ? 0 : - IBV_ACCESS_RELAXED_ORDERING)); - if (ibv_mr == NULL) { + reg_mr_cb(pd, (void *)addr, len, &mr->pmd_mr); + if (mr->pmd_mr.obj == NULL) { DRV_LOG(WARNING, "Fail to create MR for address (%p)", (void *)addr); - rte_free(mr); + mlx5_free(mr); return NULL; } - mr->pmd_mr.lkey = ibv_mr->lkey; - mr->pmd_mr.addr = ibv_mr->addr; - mr->pmd_mr.len = ibv_mr->length; - mr->pmd_mr.obj = ibv_mr; mr->msl = NULL; /* Mark it is external memory. */ mr->ms_bmp = NULL; mr->ms_n = 1;