[PATCH] net/mlx5: support bus socket with no hugepages
Hari Sasank
harisasank at outlook.com
Wed Jun 21 09:30:37 CEST 2023
When a Mellanox NIC is attached to a bus on a numa
socket, it tries to allocate rte memory in that socket.
If hugepages are not configured/available on that rte socket
mlx5_common_pci_probe fails with ENOMEM.
In this patch, a memflag MLX5_MEM_FALLBACK_ANY_SOCKET is
introduced which when set on mlx5_malloc, will allocate
the memory using SOCKET_ID_ANY if it is not able to allocate
memory on the specified socket. This allocates memory on
any socket starting with the current thread's socket.
Signed-off-by: Hari Sasank <harisasank at outlook.com>
---
drivers/common/mlx5/mlx5_common_devx.c | 9 ++++++---
drivers/common/mlx5/mlx5_common_mr.c | 5 +++--
drivers/common/mlx5/mlx5_malloc.c | 7 +++++++
drivers/common/mlx5/mlx5_malloc.h | 4 ++++
drivers/net/mlx5/mlx5.c | 3 ++-
drivers/net/mlx5/mlx5_devx.c | 3 ++-
drivers/net/mlx5/mlx5_rxq.c | 3 ++-
drivers/net/mlx5/mlx5_trigger.c | 6 ++++--
drivers/net/mlx5/mlx5_txpp.c | 3 ++-
drivers/net/mlx5/mlx5_txq.c | 3 ++-
10 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/drivers/common/mlx5/mlx5_common_devx.c b/drivers/common/mlx5/mlx5_common_devx.c
index 431d8361cebd..122f1c65eab6 100644
--- a/drivers/common/mlx5/mlx5_common_devx.c
+++ b/drivers/common/mlx5/mlx5_common_devx.c
@@ -107,7 +107,8 @@ mlx5_devx_cq_create(void *ctx, struct mlx5_devx_cq *cq_obj, uint16_t log_desc_n,
umem_size = sizeof(struct mlx5_cqe) * num_of_cqes;
umem_dbrec = RTE_ALIGN(umem_size, MLX5_DBR_SIZE);
umem_size += MLX5_DBR_SIZE;
- umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, umem_size,
+ umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET, umem_size,
alignment, socket);
if (!umem_buf) {
DRV_LOG(ERR, "Failed to allocate memory for CQ.");
@@ -225,7 +226,8 @@ mlx5_devx_sq_create(void *ctx, struct mlx5_devx_sq *sq_obj, uint16_t log_wqbb_n,
umem_size = MLX5_WQE_SIZE * num_of_wqbbs;
umem_dbrec = RTE_ALIGN(umem_size, MLX5_DBR_SIZE);
umem_size += MLX5_DBR_SIZE;
- umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, umem_size,
+ umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET, umem_size,
alignment, socket);
if (!umem_buf) {
DRV_LOG(ERR, "Failed to allocate memory for SQ.");
@@ -476,7 +478,8 @@ mlx5_devx_wq_init(void *ctx, uint32_t wqe_size, uint16_t log_wqbb_n, int socket,
umem_size = wqe_size * (1 << log_wqbb_n);
umem_dbrec = RTE_ALIGN(umem_size, MLX5_DBR_SIZE);
umem_size += MLX5_DBR_SIZE;
- umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, umem_size,
+ umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET, umem_size,
alignment, socket);
if (!umem_buf) {
DRV_LOG(ERR, "Failed to allocate memory for RQ.");
diff --git a/drivers/common/mlx5/mlx5_common_mr.c b/drivers/common/mlx5/mlx5_common_mr.c
index 7b14b0c7bf1e..b2ad6a249732 100644
--- a/drivers/common/mlx5/mlx5_common_mr.c
+++ b/drivers/common/mlx5/mlx5_common_mr.c
@@ -223,7 +223,8 @@ 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 = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO,
+ bt->table = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET,
sizeof(struct mr_cache_entry) * n,
0, socket);
if (bt->table == NULL) {
@@ -767,7 +768,7 @@ mlx5_mr_create_primary(void *pd,
(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 = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO,
+ mr = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO | MLX5_MEM_FALLBACK_ANY_SOCKET,
RTE_ALIGN_CEIL(sizeof(*mr), RTE_CACHE_LINE_SIZE) +
bmp_size, RTE_CACHE_LINE_SIZE, msl->socket_id);
if (mr == NULL) {
diff --git a/drivers/common/mlx5/mlx5_malloc.c b/drivers/common/mlx5/mlx5_malloc.c
index c58c41da9266..e109f1bfa994 100644
--- a/drivers/common/mlx5/mlx5_malloc.c
+++ b/drivers/common/mlx5/mlx5_malloc.c
@@ -182,6 +182,13 @@ mlx5_malloc(uint32_t flags, size_t size, unsigned int align, int socket)
addr = rte_zmalloc_socket(NULL, size, align, socket);
else
addr = rte_malloc_socket(NULL, size, align, socket);
+ if (!addr && socket != SOCKET_ID_ANY &&
+ (flags & MLX5_MEM_FALLBACK_ANY_SOCKET)) {
+ if (flags & MLX5_MEM_ZERO)
+ addr = rte_zmalloc_socket(NULL, size, align, SOCKET_ID_ANY);
+ else
+ addr = rte_malloc_socket(NULL, size, align, SOCKET_ID_ANY);
+ }
mlx5_mem_update_msl(addr);
#ifdef RTE_LIBRTE_MLX5_DEBUG
if (addr)
diff --git a/drivers/common/mlx5/mlx5_malloc.h b/drivers/common/mlx5/mlx5_malloc.h
index 9086a4f3f22e..cd57f95a629e 100644
--- a/drivers/common/mlx5/mlx5_malloc.h
+++ b/drivers/common/mlx5/mlx5_malloc.h
@@ -28,6 +28,10 @@ enum mlx5_mem_flags {
/* Memory should be allocated from rte hugepage. */
MLX5_MEM_ZERO = 1 << 2,
/* Memory should be cleared to zero. */
+ MLX5_MEM_FALLBACK_ANY_SOCKET = 1 << 3,
+ /* Memory can be allocated on any socket if
+ * it fails to allocate on the given socket.
+ */
};
/**
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index f9aea1318736..5b520d468299 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -2063,7 +2063,8 @@ mlx5_proc_priv_init(struct rte_eth_dev *dev)
*/
ppriv_size = sizeof(struct mlx5_proc_priv) +
priv->txqs_n * sizeof(struct mlx5_uar_data);
- ppriv = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, ppriv_size,
+ ppriv = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET, ppriv_size,
RTE_CACHE_LINE_SIZE, dev->device->numa_node);
if (!ppriv) {
rte_errno = ENOMEM;
diff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c
index 4369d2557e9e..47a925e5913a 100644
--- a/drivers/net/mlx5/mlx5_devx.c
+++ b/drivers/net/mlx5/mlx5_devx.c
@@ -1285,7 +1285,8 @@ mlx5_txq_obj_hairpin_new(struct rte_eth_dev *dev, uint16_t idx)
RTE_BIT32(host_mem_attr.wq_attr.log_hairpin_num_packets);
umem_dbrec = RTE_ALIGN(umem_size, MLX5_DBR_SIZE);
umem_size += MLX5_DBR_SIZE;
- umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, umem_size,
+ umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET, umem_size,
alignment, priv->sh->numa_node);
if (umem_buf == NULL && txq_ctrl->hairpin_conf.force_memory) {
DRV_LOG(ERR, "Failed to allocate memory for hairpin TX queue");
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index ad8fd13cbe8e..6bdf1678e499 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -1728,7 +1728,8 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
desc >>= mprq_log_actual_stride_num;
alloc_size += desc * sizeof(struct mlx5_mprq_buf *);
}
- tmpl = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, alloc_size, 0, socket);
+ tmpl = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET, alloc_size, 0, socket);
if (!tmpl) {
rte_errno = ENOMEM;
return NULL;
diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c
index bbaa7d2aa021..1a6abdf2b61d 100644
--- a/drivers/net/mlx5/mlx5_trigger.c
+++ b/drivers/net/mlx5/mlx5_trigger.c
@@ -55,7 +55,8 @@ mlx5_txq_start(struct rte_eth_dev *dev)
for (i = 0; i != priv->txqs_n; ++i) {
struct mlx5_txq_ctrl *txq_ctrl = mlx5_txq_get(dev, i);
struct mlx5_txq_data *txq_data = &txq_ctrl->txq;
- uint32_t flags = MLX5_MEM_RTE | MLX5_MEM_ZERO;
+ uint32_t flags = MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET;
if (!txq_ctrl)
continue;
@@ -180,7 +181,8 @@ mlx5_rxq_ctrl_prepare(struct rte_eth_dev *dev, struct mlx5_rxq_ctrl *rxq_ctrl,
return ret;
}
MLX5_ASSERT(!rxq_ctrl->obj);
- rxq_ctrl->obj = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO,
+ rxq_ctrl->obj = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET,
sizeof(*rxq_ctrl->obj), 0,
rxq_ctrl->socket);
if (!rxq_ctrl->obj) {
diff --git a/drivers/net/mlx5/mlx5_txpp.c b/drivers/net/mlx5/mlx5_txpp.c
index 5a5df2d1bb16..c81ae7bfd328 100644
--- a/drivers/net/mlx5/mlx5_txpp.c
+++ b/drivers/net/mlx5/mlx5_txpp.c
@@ -394,7 +394,8 @@ mlx5_txpp_create_clock_queue(struct mlx5_dev_ctx_shared *sh)
struct mlx5_txpp_wq *wq = &sh->txpp.clock_queue;
int ret;
- sh->txpp.tsa = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO,
+ sh->txpp.tsa = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET,
MLX5_TXPP_REARM_SQ_SIZE *
sizeof(struct mlx5_txpp_ts),
0, sh->numa_node);
diff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c
index 8cb52b0f7d8e..b83e798544d2 100644
--- a/drivers/net/mlx5/mlx5_txq.c
+++ b/drivers/net/mlx5/mlx5_txq.c
@@ -1074,7 +1074,8 @@ mlx5_txq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
struct mlx5_priv *priv = dev->data->dev_private;
struct mlx5_txq_ctrl *tmpl;
- tmpl = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, sizeof(*tmpl) +
+ tmpl = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO |
+ MLX5_MEM_FALLBACK_ANY_SOCKET, sizeof(*tmpl) +
desc * sizeof(struct rte_mbuf *), 0, socket);
if (!tmpl) {
rte_errno = ENOMEM;
--
2.39.2
More information about the dev
mailing list