* [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor
@ 2020-06-16 9:44 Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 1/4] common/mlx5: remove MR struct dependency on ibv Ophir Munk
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Ophir Munk @ 2020-06-16 9:44 UTC (permalink / raw)
To: dev, Matan Azrad, Raslan Darawsheh; +Cc: Ophir Munk
This patch series is part of preparing mlx5 PMD to compile and run under
multiple OSs. This series handles memory region refactoring.
Ophir Munk (4):
common/mlx5: remove MR struct dependency on ibv
common/mlx5: export MR verbs operations
net/mlx5: add MR callbacks in per-device cache
mlx5/linux: add MR callbacks to verbs operations struct
drivers/common/mlx5/Makefile | 1 +
drivers/common/mlx5/linux/meson.build | 1 +
drivers/common/mlx5/linux/mlx5_common_verbs.c | 87 +++++++++++++++++++++++++
drivers/common/mlx5/mlx5_common_mr.c | 60 ++++++++---------
drivers/common/mlx5/mlx5_common_mr.h | 33 ++++++++--
drivers/common/mlx5/rte_common_mlx5_version.map | 3 +
drivers/net/mlx5/Makefile | 1 +
drivers/net/mlx5/linux/meson.build | 1 +
drivers/net/mlx5/linux/mlx5_os.c | 19 ++++++
drivers/net/mlx5/linux/mlx5_verbs.c | 78 ++++++++++++++++++++++
drivers/net/mlx5/linux/mlx5_verbs.h | 15 +++++
drivers/net/mlx5/mlx5.c | 2 +
drivers/net/mlx5/mlx5.h | 2 +
drivers/net/mlx5/mlx5_mr.c | 6 +-
14 files changed, 268 insertions(+), 41 deletions(-)
create mode 100644 drivers/common/mlx5/linux/mlx5_common_verbs.c
create mode 100644 drivers/net/mlx5/linux/mlx5_verbs.c
create mode 100644 drivers/net/mlx5/linux/mlx5_verbs.h
--
2.8.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v1 1/4] common/mlx5: remove MR struct dependency on ibv
2020-06-16 9:44 [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor Ophir Munk
@ 2020-06-16 9:44 ` Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 2/4] common/mlx5: export MR verbs operations Ophir Munk
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Ophir Munk @ 2020-06-16 9:44 UTC (permalink / raw)
To: dev, Matan Azrad, Raslan Darawsheh; +Cc: Ophir Munk
Replace 'struct ibv_mr *' (in 'struct mlx5_mr') with a new 'struct
mlx5_pmd_mr'. The new struct contains the required MR field: lkey,
addr, len and is independent of ibv.
Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
---
drivers/common/mlx5/mlx5_common_mr.c | 60 ++++++++++++++++++++----------------
drivers/common/mlx5/mlx5_common_mr.h | 11 +++++--
2 files changed, 43 insertions(+), 28 deletions(-)
diff --git a/drivers/common/mlx5/mlx5_common_mr.c b/drivers/common/mlx5/mlx5_common_mr.c
index e894523..c68be54 100644
--- a/drivers/common/mlx5/mlx5_common_mr.c
+++ b/drivers/common/mlx5/mlx5_common_mr.c
@@ -266,18 +266,16 @@ mr_find_next_chunk(struct mlx5_mr *mr, struct mr_cache_entry *entry,
/* MR for external memory doesn't have memseg list. */
if (mr->msl == NULL) {
- struct ibv_mr *ibv_mr = mr->ibv_mr;
-
MLX5_ASSERT(mr->ms_bmp_n == 1);
MLX5_ASSERT(mr->ms_n == 1);
MLX5_ASSERT(base_idx == 0);
/*
* Can't search it from memseg list but get it directly from
- * verbs MR as there's only one chunk.
+ * pmd_mr as there's only one chunk.
*/
- entry->start = (uintptr_t)ibv_mr->addr;
- entry->end = (uintptr_t)ibv_mr->addr + mr->ibv_mr->length;
- entry->lkey = rte_cpu_to_be_32(mr->ibv_mr->lkey);
+ entry->start = (uintptr_t)mr->pmd_mr.addr;
+ entry->end = (uintptr_t)mr->pmd_mr.addr + mr->pmd_mr.len;
+ entry->lkey = rte_cpu_to_be_32(mr->pmd_mr.lkey);
/* Returning 1 ends iteration. */
return 1;
}
@@ -302,7 +300,7 @@ mr_find_next_chunk(struct mlx5_mr *mr, struct mr_cache_entry *entry,
/* Found one chunk. */
entry->start = start;
entry->end = end;
- entry->lkey = rte_cpu_to_be_32(mr->ibv_mr->lkey);
+ entry->lkey = rte_cpu_to_be_32(mr->pmd_mr.lkey);
}
return idx;
}
@@ -442,8 +440,8 @@ mr_free(struct mlx5_mr *mr)
if (mr == NULL)
return;
DRV_LOG(DEBUG, "freeing MR(%p):", (void *)mr);
- if (mr->ibv_mr != NULL)
- claim_zero(mlx5_glue->dereg_mr(mr->ibv_mr));
+ if (mr->pmd_mr.obj != NULL)
+ claim_zero(mlx5_glue->dereg_mr(mr->pmd_mr.obj));
if (mr->ms_bmp != NULL)
rte_bitmap_free(mr->ms_bmp);
rte_free(mr);
@@ -600,6 +598,7 @@ 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);
/*
@@ -768,24 +767,28 @@ mlx5_mr_create_primary(void *pd,
* mlx5_alloc_buf_extern() which eventually calls rte_malloc_socket()
* through mlx5_alloc_verbs_buf().
*/
- mr->ibv_mr = mlx5_glue->reg_mr(pd, (void *)data.start, len,
- IBV_ACCESS_LOCAL_WRITE |
- (haswell_broadwell_cpu ? 0 :
- IBV_ACCESS_RELAXED_ORDERING));
- if (mr->ibv_mr == NULL) {
- DEBUG("Fail to create a verbs MR for address (%p)",
+ 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) {
+ DEBUG("Fail to create an MR for address (%p)",
(void *)addr);
rte_errno = EINVAL;
goto err_mrlock;
}
- MLX5_ASSERT((uintptr_t)mr->ibv_mr->addr == data.start);
- MLX5_ASSERT(mr->ibv_mr->length == len);
+ 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);
DEBUG("MR CREATED (%p) for %p:\n"
" [0x%" PRIxPTR ", 0x%" PRIxPTR "),"
" lkey=0x%x base_idx=%u ms_n=%u, ms_bmp_n=%u",
(void *)mr, (void *)addr, data.start, data.end,
- rte_cpu_to_be_32(mr->ibv_mr->lkey),
+ rte_cpu_to_be_32(mr->pmd_mr.lkey),
mr->ms_base_idx, mr->ms_n, mr->ms_bmp_n);
/* Insert to the global cache table. */
mlx5_mr_insert_cache(share_cache, mr);
@@ -1036,6 +1039,7 @@ mlx5_mr_flush_local_cache(struct mlx5_mr_ctrl *mr_ctrl)
struct mlx5_mr *
mlx5_create_mr_ext(void *pd, uintptr_t addr, size_t len, int socket_id)
{
+ struct ibv_mr *ibv_mr;
struct mlx5_mr *mr = NULL;
mr = rte_zmalloc_socket(NULL,
@@ -1044,17 +1048,21 @@ mlx5_create_mr_ext(void *pd, uintptr_t addr, size_t len, int socket_id)
RTE_CACHE_LINE_SIZE, socket_id);
if (mr == NULL)
return NULL;
- mr->ibv_mr = mlx5_glue->reg_mr(pd, (void *)addr, len,
- IBV_ACCESS_LOCAL_WRITE |
- (haswell_broadwell_cpu ? 0 :
- IBV_ACCESS_RELAXED_ORDERING));
- if (mr->ibv_mr == 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) {
DRV_LOG(WARNING,
- "Fail to create a verbs MR for address (%p)",
+ "Fail to create MR for address (%p)",
(void *)addr);
rte_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;
@@ -1064,7 +1072,7 @@ mlx5_create_mr_ext(void *pd, uintptr_t addr, size_t len, int socket_id)
" [0x%" PRIxPTR ", 0x%" PRIxPTR "),"
" lkey=0x%x base_idx=%u ms_n=%u, ms_bmp_n=%u",
(void *)mr, (void *)addr,
- addr, addr + len, rte_cpu_to_be_32(mr->ibv_mr->lkey),
+ addr, addr + len, rte_cpu_to_be_32(mr->pmd_mr.lkey),
mr->ms_base_idx, mr->ms_n, mr->ms_bmp_n);
return mr;
}
@@ -1089,7 +1097,7 @@ mlx5_mr_dump_cache(struct mlx5_mr_share_cache *share_cache __rte_unused)
unsigned int n;
DEBUG("MR[%u], LKey = 0x%x, ms_n = %u, ms_bmp_n = %u",
- mr_n++, rte_cpu_to_be_32(mr->ibv_mr->lkey),
+ mr_n++, rte_cpu_to_be_32(mr->pmd_mr.lkey),
mr->ms_n, mr->ms_bmp_n);
if (mr->ms_n == 0)
continue;
diff --git a/drivers/common/mlx5/mlx5_common_mr.h b/drivers/common/mlx5/mlx5_common_mr.h
index 7add4da..6f2dcec 100644
--- a/drivers/common/mlx5/mlx5_common_mr.h
+++ b/drivers/common/mlx5/mlx5_common_mr.h
@@ -31,10 +31,17 @@
#define MLX5_MR_CACHE_N 8
#define MLX5_MR_BTREE_CACHE_N 256
+/* mlx5 PMD MR struct. */
+struct mlx5_pmd_mr {
+ uint32_t lkey;
+ void *addr;
+ size_t len;
+ void *obj; /* verbs mr object or devx umem object. */
+};
/* Memory Region object. */
struct mlx5_mr {
LIST_ENTRY(mlx5_mr) mr; /**< Pointer to the prev/next entry. */
- struct ibv_mr *ibv_mr; /* Verbs Memory Region. */
+ struct mlx5_pmd_mr pmd_mr; /* PMD memory region. */
const struct rte_memseg_list *msl;
int ms_base_idx; /* Start index of msl->memseg_arr[]. */
int ms_n; /* Number of memsegs in use. */
@@ -46,7 +53,7 @@ struct mlx5_mr {
struct mr_cache_entry {
uintptr_t start; /* Start address of MR. */
uintptr_t end; /* End address of MR. */
- uint32_t lkey; /* rte_cpu_to_be_32(ibv_mr->lkey). */
+ uint32_t lkey; /* rte_cpu_to_be_32(lkey). */
} __rte_packed;
/* MR Cache table for Binary search. */
--
2.8.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v1 2/4] common/mlx5: export MR verbs operations
2020-06-16 9:44 [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 1/4] common/mlx5: remove MR struct dependency on ibv Ophir Munk
@ 2020-06-16 9:44 ` Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 3/4] net/mlx5: add MR callbacks in per-device cache Ophir Munk
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Ophir Munk @ 2020-06-16 9:44 UTC (permalink / raw)
To: dev, Matan Azrad, Raslan Darawsheh; +Cc: Ophir Munk
The glue verbs operations reg_mr and dereg_mr are wrapped and exported
in functions mlx5_common_verbs_reg_mr and mlx5_common_verbs_dereg_mr
respectively. The exported functions are added to a new file
linux/mlx5_common_verbs.c.
Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
---
drivers/common/mlx5/Makefile | 1 +
drivers/common/mlx5/linux/meson.build | 1 +
drivers/common/mlx5/linux/mlx5_common_verbs.c | 87 +++++++++++++++++++++++++
drivers/common/mlx5/mlx5_common_mr.c | 27 ++------
drivers/common/mlx5/mlx5_common_mr.h | 8 ++-
drivers/common/mlx5/rte_common_mlx5_version.map | 3 +
6 files changed, 104 insertions(+), 23 deletions(-)
create mode 100644 drivers/common/mlx5/linux/mlx5_common_verbs.c
diff --git a/drivers/common/mlx5/Makefile b/drivers/common/mlx5/Makefile
index 4948fef..622bde4 100644
--- a/drivers/common/mlx5/Makefile
+++ b/drivers/common/mlx5/Makefile
@@ -18,6 +18,7 @@ SRCS-y += mlx5_devx_cmds.c
SRCS-y += mlx5_common.c
SRCS-y += linux/mlx5_common_os.c
SRCS-y += linux/mlx5_nl.c
+SRCS-y += linux/mlx5_common_verbs.c
SRCS-y += mlx5_common_mp.c
SRCS-y += mlx5_common_mr.c
ifeq ($(CONFIG_RTE_IBVERBS_LINK_DLOPEN),y)
diff --git a/drivers/common/mlx5/linux/meson.build b/drivers/common/mlx5/linux/meson.build
index ce065d9..638bb2b 100644
--- a/drivers/common/mlx5/linux/meson.build
+++ b/drivers/common/mlx5/linux/meson.build
@@ -47,6 +47,7 @@ endif
sources += files('mlx5_nl.c')
sources += files('mlx5_common_os.c')
+sources += files('mlx5_common_verbs.c')
if not dlopen_ibverbs
sources += files('mlx5_glue.c')
endif
diff --git a/drivers/common/mlx5/linux/mlx5_common_verbs.c b/drivers/common/mlx5/linux/mlx5_common_verbs.c
new file mode 100644
index 0000000..e7e50ad
--- /dev/null
+++ b/drivers/common/mlx5/linux/mlx5_common_verbs.c
@@ -0,0 +1,87 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2020 Mellanox Technologies, Ltd
+ */
+
+#include <stddef.h>
+#include <errno.h>
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <inttypes.h>
+
+/* Verbs header. */
+/* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */
+#include "mlx5_autoconf.h"
+#ifdef PEDANTIC
+#pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+#ifdef HAVE_INFINIBAND_VERBS_H
+#include <infiniband/verbs.h>
+#endif
+#ifdef HAVE_INFINIBAND_MLX5DV_H
+#include <infiniband/mlx5dv.h>
+#endif
+#ifdef PEDANTIC
+#pragma GCC diagnostic error "-Wpedantic"
+#endif
+
+#include <mlx5_glue.h>
+#include <mlx5_common.h>
+#include <mlx5_common_mr.h>
+
+/**
+ * Register mr. Given protection doamin pointer, pointer to addr and length
+ * register the memory region.
+ *
+ * @param[in] pd
+ * Pointer to protection domain context.
+ * @param[in] addr
+ * Pointer to memory start address.
+ * @param[in] lentgh
+ * Length of the memory to register.
+ * @param[out] pmd_mr
+ * pmd_mr struct set with lkey, address, length and pointer to mr object
+ *
+ * @return
+ * 0 on successful registration, -1 otherwise
+ */
+int
+mlx5_common_verbs_reg_mr(void *pd, void *addr, size_t length,
+ struct mlx5_pmd_mr *pmd_mr)
+{
+ struct ibv_mr *ibv_mr;
+
+ memset(pmd_mr, 0, sizeof(*pmd_mr));
+ ibv_mr = mlx5_glue->reg_mr(pd, addr, length,
+ IBV_ACCESS_LOCAL_WRITE |
+ (haswell_broadwell_cpu ? 0 :
+ IBV_ACCESS_RELAXED_ORDERING));
+ if (!ibv_mr)
+ return -1;
+
+ *pmd_mr = (struct mlx5_pmd_mr){
+ .lkey = ibv_mr->lkey,
+ .addr = ibv_mr->addr,
+ .len = ibv_mr->length,
+ .obj = (void *)ibv_mr,
+ };
+ return 0;
+}
+
+/**
+ * Deregister mr. Given the mlx5 pmd MR - deregister the MR
+ *
+ * @param[in] pmd_mr
+ * pmd_mr struct set with lkey, address, length and pointer to mr object
+ *
+ */
+void
+mlx5_common_verbs_dereg_mr(struct mlx5_pmd_mr *pmd_mr)
+{
+ if (pmd_mr && pmd_mr->obj != NULL) {
+ claim_zero(mlx5_glue->dereg_mr(pmd_mr->obj));
+ memset(pmd_mr, 0, sizeof(*pmd_mr));
+ }
+}
+
diff --git a/drivers/common/mlx5/mlx5_common_mr.c b/drivers/common/mlx5/mlx5_common_mr.c
index c68be54..4ce7975 100644
--- a/drivers/common/mlx5/mlx5_common_mr.c
+++ b/drivers/common/mlx5/mlx5_common_mr.c
@@ -440,8 +440,7 @@ mr_free(struct mlx5_mr *mr)
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));
+ mlx5_common_verbs_dereg_mr(&mr->pmd_mr);
if (mr->ms_bmp != NULL)
rte_bitmap_free(mr->ms_bmp);
rte_free(mr);
@@ -598,7 +597,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);
/*
@@ -767,20 +765,13 @@ mlx5_mr_create_primary(void *pd,
* 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) {
+ mlx5_common_verbs_reg_mr(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);
@@ -1039,7 +1030,6 @@ mlx5_mr_flush_local_cache(struct mlx5_mr_ctrl *mr_ctrl)
struct mlx5_mr *
mlx5_create_mr_ext(void *pd, uintptr_t addr, size_t len, int socket_id)
{
- struct ibv_mr *ibv_mr;
struct mlx5_mr *mr = NULL;
mr = rte_zmalloc_socket(NULL,
@@ -1048,21 +1038,14 @@ mlx5_create_mr_ext(void *pd, uintptr_t addr, size_t len, int socket_id)
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) {
+ mlx5_common_verbs_reg_mr(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);
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;
diff --git a/drivers/common/mlx5/mlx5_common_mr.h b/drivers/common/mlx5/mlx5_common_mr.h
index 6f2dcec..cdb8acf 100644
--- a/drivers/common/mlx5/mlx5_common_mr.h
+++ b/drivers/common/mlx5/mlx5_common_mr.h
@@ -163,5 +163,11 @@ mlx5_mr_create_primary(void *pd,
struct mlx5_mr_share_cache *share_cache,
struct mr_cache_entry *entry, uintptr_t addr,
unsigned int mr_ext_memseg_en);
-
+__rte_internal
+int
+mlx5_common_verbs_reg_mr(void *pd, void *addr, size_t length,
+ struct mlx5_pmd_mr *pmd_mr);
+__rte_internal
+void
+mlx5_common_verbs_dereg_mr(struct mlx5_pmd_mr *pmd_mr);
#endif /* RTE_PMD_MLX5_COMMON_MR_H_ */
diff --git a/drivers/common/mlx5/rte_common_mlx5_version.map b/drivers/common/mlx5/rte_common_mlx5_version.map
index 350e771..68f1207 100644
--- a/drivers/common/mlx5/rte_common_mlx5_version.map
+++ b/drivers/common/mlx5/rte_common_mlx5_version.map
@@ -3,6 +3,9 @@ INTERNAL {
mlx5_class_get;
+ mlx5_common_verbs_reg_mr;
+ mlx5_common_verbs_dereg_mr;
+
mlx5_create_mr_ext;
mlx5_dev_to_pci_addr;
--
2.8.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v1 3/4] net/mlx5: add MR callbacks in per-device cache
2020-06-16 9:44 [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 1/4] common/mlx5: remove MR struct dependency on ibv Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 2/4] common/mlx5: export MR verbs operations Ophir Munk
@ 2020-06-16 9:44 ` Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 4/4] mlx5/linux: add MR callbacks to verbs operations struct Ophir Munk
2020-06-17 10:13 ` [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor Raslan Darawsheh
4 siblings, 0 replies; 6+ messages in thread
From: Ophir Munk @ 2020-06-16 9:44 UTC (permalink / raw)
To: dev, Matan Azrad, Raslan Darawsheh; +Cc: Ophir Munk
Prior to this commit MR operations were verbs based and hard coded under
common/mlx5/linux directory. This commit enables upper layers (e.g.
net/mlx5) to determine which MR operations to use. For example the net
layer could set devx based MR operations in non-Linux environments. The
reg_mr and dereg_mr callbacks are added to the global per-device MR
cache 'struct mlx5_mr_share_cache'.
Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
---
drivers/common/mlx5/mlx5_common_mr.c | 23 ++++++++++++-----------
drivers/common/mlx5/mlx5_common_mr.h | 14 ++++++++++++--
drivers/net/mlx5/linux/mlx5_os.c | 18 ++++++++++++++++++
drivers/net/mlx5/mlx5.c | 2 ++
drivers/net/mlx5/mlx5.h | 2 ++
drivers/net/mlx5/mlx5_mr.c | 6 ++++--
6 files changed, 50 insertions(+), 15 deletions(-)
diff --git a/drivers/common/mlx5/mlx5_common_mr.c b/drivers/common/mlx5/mlx5_common_mr.c
index 4ce7975..564d618 100644
--- a/drivers/common/mlx5/mlx5_common_mr.c
+++ b/drivers/common/mlx5/mlx5_common_mr.c
@@ -435,12 +435,12 @@ mlx5_mr_lookup_cache(struct mlx5_mr_share_cache *share_cache,
* Pointer to MR to free.
*/
static void
-mr_free(struct mlx5_mr *mr)
+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);
- mlx5_common_verbs_dereg_mr(&mr->pmd_mr);
+ dereg_mr_cb(&mr->pmd_mr);
if (mr->ms_bmp != NULL)
rte_bitmap_free(mr->ms_bmp);
rte_free(mr);
@@ -490,7 +490,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);
+ mr_free(mr, share_cache->dereg_mr_cb);
}
}
@@ -702,7 +702,7 @@ mlx5_mr_create_primary(void *pd,
data.start = RTE_ALIGN_FLOOR(addr, msl->page_sz);
data.end = data.start + msl->page_sz;
rte_mcfg_mem_read_unlock();
- mr_free(mr);
+ mr_free(mr, share_cache->dereg_mr_cb);
goto alloc_resources;
}
MLX5_ASSERT(data.msl == data_re.msl);
@@ -725,7 +725,7 @@ mlx5_mr_create_primary(void *pd,
* Must be unlocked before calling rte_free() because
* mlx5_mr_mem_event_free_cb() can be called inside.
*/
- mr_free(mr);
+ mr_free(mr, share_cache->dereg_mr_cb);
return entry->lkey;
}
/*
@@ -760,12 +760,12 @@ mlx5_mr_create_primary(void *pd,
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().
*/
- mlx5_common_verbs_reg_mr(pd, (void *)data.start, len, &mr->pmd_mr);
+ 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);
@@ -801,7 +801,7 @@ mlx5_mr_create_primary(void *pd,
* calling rte_free() because mlx5_mr_mem_event_free_cb() can be called
* inside.
*/
- mr_free(mr);
+ mr_free(mr, share_cache->dereg_mr_cb);
return UINT32_MAX;
}
@@ -1028,7 +1028,8 @@ 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 mlx5_mr *mr = NULL;
@@ -1038,7 +1039,7 @@ mlx5_create_mr_ext(void *pd, uintptr_t addr, size_t len, int socket_id)
RTE_CACHE_LINE_SIZE, socket_id);
if (mr == NULL)
return NULL;
- mlx5_common_verbs_reg_mr(pd, (void *)addr, len, &mr->pmd_mr);
+ 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)",
diff --git a/drivers/common/mlx5/mlx5_common_mr.h b/drivers/common/mlx5/mlx5_common_mr.h
index cdb8acf..b23ee66 100644
--- a/drivers/common/mlx5/mlx5_common_mr.h
+++ b/drivers/common/mlx5/mlx5_common_mr.h
@@ -38,6 +38,14 @@ struct mlx5_pmd_mr {
size_t len;
void *obj; /* verbs mr object or devx umem object. */
};
+
+/**
+ * mr operations typedef
+ */
+typedef int (*mlx5_reg_mr_t)(void *pd, void *addr, size_t length,
+ struct mlx5_pmd_mr *pmd_mr);
+typedef void (*mlx5_dereg_mr_t)(struct mlx5_pmd_mr *pmd_mr);
+
/* Memory Region object. */
struct mlx5_mr {
LIST_ENTRY(mlx5_mr) mr; /**< Pointer to the prev/next entry. */
@@ -83,6 +91,8 @@ struct mlx5_mr_share_cache {
struct mlx5_mr_btree cache; /* Global MR cache table. */
struct mlx5_mr_list mr_list; /* Registered MR list. */
struct mlx5_mr_list mr_free_list; /* Freed MR list. */
+ mlx5_reg_mr_t reg_mr_cb; /* Callback to reg_mr func */
+ mlx5_dereg_mr_t dereg_mr_cb; /* Callback to dereg_mr func */
} __rte_packed;
/**
@@ -155,8 +165,8 @@ mlx5_mr_lookup_list(struct mlx5_mr_share_cache *share_cache,
struct mr_cache_entry *entry, uintptr_t addr);
__rte_internal
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);
__rte_internal
uint32_t
mlx5_mr_create_primary(void *pd,
diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c
index 844c6c0..f498d00 100644
--- a/drivers/net/mlx5/linux/mlx5_os.c
+++ b/drivers/net/mlx5/linux/mlx5_os.c
@@ -42,6 +42,7 @@
#include <mlx5_devx_cmds.h>
#include <mlx5_common.h>
#include <mlx5_common_mp.h>
+#include <mlx5_common_mr.h>
#include "mlx5_defs.h"
#include "mlx5.h"
@@ -2321,6 +2322,23 @@ mlx5_os_stats_init(struct rte_eth_dev *dev)
rte_free(strings);
}
+/**
+ * Set the reg_mr and dereg_mr call backs
+ *
+ * @param reg_mr_cb[out]
+ * Pointer to reg_mr func
+ * @param dereg_mr_cb[out]
+ * Pointer to dereg_mr func
+ *
+ */
+void
+mlx5_os_set_reg_mr_cb(mlx5_reg_mr_t *reg_mr_cb,
+ mlx5_dereg_mr_t *dereg_mr_cb)
+{
+ *reg_mr_cb = mlx5_common_verbs_reg_mr;
+ *dereg_mr_cb = mlx5_common_verbs_dereg_mr;
+}
+
const struct eth_dev_ops mlx5_os_dev_ops = {
.dev_configure = mlx5_dev_configure,
.dev_start = mlx5_dev_start,
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index b22acbb..5c86f6f 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -713,6 +713,8 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn,
err = rte_errno;
goto error;
}
+ mlx5_os_set_reg_mr_cb(&sh->share_cache.reg_mr_cb,
+ &sh->share_cache.dereg_mr_cb);
mlx5_os_dev_shared_handler_install(sh);
mlx5_flow_aging_init(sh);
mlx5_flow_counters_mng_init(sh);
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 94a3667..5bd5acd 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -940,4 +940,6 @@ int mlx5_os_read_dev_stat(struct mlx5_priv *priv,
int mlx5_os_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats);
int mlx5_os_get_stats_n(struct rte_eth_dev *dev);
void mlx5_os_stats_init(struct rte_eth_dev *dev);
+void mlx5_os_set_reg_mr_cb(mlx5_reg_mr_t *reg_mr_cb,
+ mlx5_dereg_mr_t *dereg_mr_cb);
#endif /* RTE_PMD_MLX5_H_ */
diff --git a/drivers/net/mlx5/mlx5_mr.c b/drivers/net/mlx5/mlx5_mr.c
index c91d6a4..adbe07c 100644
--- a/drivers/net/mlx5/mlx5_mr.c
+++ b/drivers/net/mlx5/mlx5_mr.c
@@ -276,7 +276,8 @@ mlx5_mr_update_ext_mp_cb(struct rte_mempool *mp, void *opaque,
return;
DRV_LOG(DEBUG, "port %u register MR for chunk #%d of mempool (%s)",
dev->data->port_id, mem_idx, mp->name);
- mr = mlx5_create_mr_ext(sh->pd, addr, len, mp->socket_id);
+ mr = mlx5_create_mr_ext(sh->pd, addr, len, mp->socket_id,
+ sh->share_cache.reg_mr_cb);
if (!mr) {
DRV_LOG(WARNING,
"port %u unable to allocate a new MR of"
@@ -350,7 +351,8 @@ mlx5_dma_map(struct rte_pci_device *pdev, void *addr,
}
priv = dev->data->dev_private;
sh = priv->sh;
- mr = mlx5_create_mr_ext(sh->pd, (uintptr_t)addr, len, SOCKET_ID_ANY);
+ mr = mlx5_create_mr_ext(sh->pd, (uintptr_t)addr, len, SOCKET_ID_ANY,
+ sh->share_cache.reg_mr_cb);
if (!mr) {
DRV_LOG(WARNING,
"port %u unable to dma map", dev->data->port_id);
--
2.8.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dpdk-dev] [PATCH v1 4/4] mlx5/linux: add MR callbacks to verbs operations struct
2020-06-16 9:44 [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor Ophir Munk
` (2 preceding siblings ...)
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 3/4] net/mlx5: add MR callbacks in per-device cache Ophir Munk
@ 2020-06-16 9:44 ` Ophir Munk
2020-06-17 10:13 ` [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor Raslan Darawsheh
4 siblings, 0 replies; 6+ messages in thread
From: Ophir Munk @ 2020-06-16 9:44 UTC (permalink / raw)
To: dev, Matan Azrad, Raslan Darawsheh; +Cc: Ophir Munk
Create a set of verbs callbacks in 'struct mlx5_verbs_ops'
and add MR operations to it (file net/mlx5/linux/mlx5_verbs.c).
Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
---
drivers/net/mlx5/Makefile | 1 +
drivers/net/mlx5/linux/meson.build | 1 +
drivers/net/mlx5/linux/mlx5_os.c | 5 ++-
drivers/net/mlx5/linux/mlx5_verbs.c | 78 +++++++++++++++++++++++++++++++++++++
drivers/net/mlx5/linux/mlx5_verbs.h | 15 +++++++
5 files changed, 98 insertions(+), 2 deletions(-)
create mode 100644 drivers/net/mlx5/linux/mlx5_verbs.c
create mode 100644 drivers/net/mlx5/linux/mlx5_verbs.h
diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
index fada6fb..a458402 100644
--- a/drivers/net/mlx5/Makefile
+++ b/drivers/net/mlx5/Makefile
@@ -34,6 +34,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_utils.c
SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_socket.c
SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_os.c
SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_ethdev_os.c
+SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_verbs.c
# Basic CFLAGS.
CFLAGS += -O3
diff --git a/drivers/net/mlx5/linux/meson.build b/drivers/net/mlx5/linux/meson.build
index ad908c4..14eed03 100644
--- a/drivers/net/mlx5/linux/meson.build
+++ b/drivers/net/mlx5/linux/meson.build
@@ -6,5 +6,6 @@ sources += files(
'mlx5_socket.c',
'mlx5_os.c',
'mlx5_ethdev_os.c',
+ 'mlx5_verbs.c',
)
diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c
index f498d00..3792371 100644
--- a/drivers/net/mlx5/linux/mlx5_os.c
+++ b/drivers/net/mlx5/linux/mlx5_os.c
@@ -52,6 +52,7 @@
#include "mlx5_mr.h"
#include "mlx5_flow.h"
#include "rte_pmd_mlx5.h"
+#include "mlx5_verbs.h"
#define MLX5_TAGS_HLIST_ARRAY_SIZE 8192
@@ -2335,8 +2336,8 @@ void
mlx5_os_set_reg_mr_cb(mlx5_reg_mr_t *reg_mr_cb,
mlx5_dereg_mr_t *dereg_mr_cb)
{
- *reg_mr_cb = mlx5_common_verbs_reg_mr;
- *dereg_mr_cb = mlx5_common_verbs_dereg_mr;
+ *reg_mr_cb = mlx5_verbs_ops.reg_mr;
+ *dereg_mr_cb = mlx5_verbs_ops.dereg_mr;
}
const struct eth_dev_ops mlx5_os_dev_ops = {
diff --git a/drivers/net/mlx5/linux/mlx5_verbs.c b/drivers/net/mlx5/linux/mlx5_verbs.c
new file mode 100644
index 0000000..8e42ec8
--- /dev/null
+++ b/drivers/net/mlx5/linux/mlx5_verbs.c
@@ -0,0 +1,78 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2020 Mellanox Technologies, Ltd
+ */
+
+#include <stddef.h>
+#include <errno.h>
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <inttypes.h>
+
+/* Verbs header. */
+/* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */
+#include "mlx5_autoconf.h"
+#ifdef PEDANTIC
+#pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+#ifdef HAVE_INFINIBAND_VERBS_H
+#include <infiniband/verbs.h>
+#endif
+#ifdef HAVE_INFINIBAND_MLX5DV_H
+#include <infiniband/mlx5dv.h>
+#endif
+#ifdef PEDANTIC
+#pragma GCC diagnostic error "-Wpedantic"
+#endif
+
+#include <rte_mbuf.h>
+#include <rte_malloc.h>
+#include <rte_ethdev_driver.h>
+#include <rte_common.h>
+
+#include <mlx5_glue.h>
+#include <mlx5_common.h>
+#include <mlx5_common_mr.h>
+#include <mlx5_verbs.h>
+/**
+ * Register mr. Given protection doamin pointer, pointer to addr and length
+ * register the memory region.
+ *
+ * @param[in] pd
+ * Pointer to protection domain context.
+ * @param[in] addr
+ * Pointer to memory start address.
+ * @param[in] lentgh
+ * Length of the memory to register.
+ * @param[out] pmd_mr
+ * pmd_mr struct set with lkey, address, length and pointer to mr object
+ *
+ * @return
+ * 0 on successful registration, -1 otherwise
+ */
+static int
+mlx5_reg_mr(void *pd, void *addr, size_t length,
+ struct mlx5_pmd_mr *pmd_mr)
+{
+ return mlx5_common_verbs_reg_mr(pd, addr, length, pmd_mr);
+}
+
+/**
+ * Deregister mr. Given the mlx5 pmd MR - deregister the MR
+ *
+ * @param[in] pmd_mr
+ * pmd_mr struct set with lkey, address, length and pointer to mr object
+ *
+ */
+static void
+mlx5_dereg_mr(struct mlx5_pmd_mr *pmd_mr)
+{
+ mlx5_common_verbs_dereg_mr(pmd_mr);
+}
+
+/* verbs operations. */
+const struct mlx5_verbs_ops mlx5_verbs_ops = {
+ .reg_mr = mlx5_reg_mr,
+ .dereg_mr = mlx5_dereg_mr,
+};
diff --git a/drivers/net/mlx5/linux/mlx5_verbs.h b/drivers/net/mlx5/linux/mlx5_verbs.h
new file mode 100644
index 0000000..4f0b637
--- /dev/null
+++ b/drivers/net/mlx5/linux/mlx5_verbs.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2020 Mellanox Technologies, Ltd
+ */
+
+#ifndef RTE_PMD_MLX5_VERBS_H_
+#define RTE_PMD_MLX5_VERBS_H_
+
+struct mlx5_verbs_ops {
+ mlx5_reg_mr_t reg_mr;
+ mlx5_dereg_mr_t dereg_mr;
+};
+
+/* Verbs ops struct */
+extern const struct mlx5_verbs_ops mlx5_verbs_ops;
+#endif /* RTE_PMD_MLX5_VERBS_H_ */
--
2.8.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor
2020-06-16 9:44 [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor Ophir Munk
` (3 preceding siblings ...)
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 4/4] mlx5/linux: add MR callbacks to verbs operations struct Ophir Munk
@ 2020-06-17 10:13 ` Raslan Darawsheh
4 siblings, 0 replies; 6+ messages in thread
From: Raslan Darawsheh @ 2020-06-17 10:13 UTC (permalink / raw)
To: Ophir Munk, dev, Matan Azrad
Hi,
> -----Original Message-----
> From: Ophir Munk <ophirmu@mellanox.com>
> Sent: Tuesday, June 16, 2020 12:45 PM
> To: dev@dpdk.org; Matan Azrad <matan@mellanox.com>; Raslan
> Darawsheh <rasland@mellanox.com>
> Cc: Ophir Munk <ophirmu@mellanox.com>
> Subject: [PATCH v1 0/4] mlx5 MR refactor
>
> This patch series is part of preparing mlx5 PMD to compile and run under
> multiple OSs. This series handles memory region refactoring.
>
> Ophir Munk (4):
> common/mlx5: remove MR struct dependency on ibv
> common/mlx5: export MR verbs operations
> net/mlx5: add MR callbacks in per-device cache
> mlx5/linux: add MR callbacks to verbs operations struct
>
> drivers/common/mlx5/Makefile | 1 +
> drivers/common/mlx5/linux/meson.build | 1 +
> drivers/common/mlx5/linux/mlx5_common_verbs.c | 87
> +++++++++++++++++++++++++
> drivers/common/mlx5/mlx5_common_mr.c | 60 ++++++++---------
> drivers/common/mlx5/mlx5_common_mr.h | 33 ++++++++--
> drivers/common/mlx5/rte_common_mlx5_version.map | 3 +
> drivers/net/mlx5/Makefile | 1 +
> drivers/net/mlx5/linux/meson.build | 1 +
> drivers/net/mlx5/linux/mlx5_os.c | 19 ++++++
> drivers/net/mlx5/linux/mlx5_verbs.c | 78
> ++++++++++++++++++++++
> drivers/net/mlx5/linux/mlx5_verbs.h | 15 +++++
> drivers/net/mlx5/mlx5.c | 2 +
> drivers/net/mlx5/mlx5.h | 2 +
> drivers/net/mlx5/mlx5_mr.c | 6 +-
> 14 files changed, 268 insertions(+), 41 deletions(-)
> create mode 100644 drivers/common/mlx5/linux/mlx5_common_verbs.c
> create mode 100644 drivers/net/mlx5/linux/mlx5_verbs.c
> create mode 100644 drivers/net/mlx5/linux/mlx5_verbs.h
>
> --
> 2.8.4
Series applied to next-net-mlx,
Kindest regards,
Raslan Darawsheh
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-06-17 10:13 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-16 9:44 [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 1/4] common/mlx5: remove MR struct dependency on ibv Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 2/4] common/mlx5: export MR verbs operations Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 3/4] net/mlx5: add MR callbacks in per-device cache Ophir Munk
2020-06-16 9:44 ` [dpdk-dev] [PATCH v1 4/4] mlx5/linux: add MR callbacks to verbs operations struct Ophir Munk
2020-06-17 10:13 ` [dpdk-dev] [PATCH v1 0/4] mlx5 MR refactor Raslan Darawsheh
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).