net/mlx5: convert queue objects to unified malloc
[dpdk.git] / drivers / net / mlx5 / mlx5_rxq.c
index 2681322..67d996c 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <mlx5_glue.h>
 #include <mlx5_devx_cmds.h>
+#include <mlx5_malloc.h>
 
 #include "mlx5_defs.h"
 #include "mlx5.h"
@@ -640,7 +641,7 @@ static void
 rxq_release_rq_resources(struct mlx5_rxq_ctrl *rxq_ctrl)
 {
        if (rxq_ctrl->rxq.wqes) {
-               rte_free((void *)(uintptr_t)rxq_ctrl->rxq.wqes);
+               mlx5_free((void *)(uintptr_t)rxq_ctrl->rxq.wqes);
                rxq_ctrl->rxq.wqes = NULL;
        }
        if (rxq_ctrl->wq_umem) {
@@ -706,7 +707,7 @@ mlx5_rxq_obj_release(struct mlx5_rxq_obj *rxq_obj)
                        claim_zero(mlx5_glue->destroy_comp_channel
                                   (rxq_obj->channel));
                LIST_REMOVE(rxq_obj, next);
-               rte_free(rxq_obj);
+               mlx5_free(rxq_obj);
                return 0;
        }
        return 1;
@@ -734,7 +735,9 @@ mlx5_rx_intr_vec_enable(struct rte_eth_dev *dev)
        if (!dev->data->dev_conf.intr_conf.rxq)
                return 0;
        mlx5_rx_intr_vec_disable(dev);
-       intr_handle->intr_vec = malloc(n * sizeof(intr_handle->intr_vec[0]));
+       intr_handle->intr_vec = mlx5_malloc(0,
+                               n * sizeof(intr_handle->intr_vec[0]),
+                               0, SOCKET_ID_ANY);
        if (intr_handle->intr_vec == NULL) {
                DRV_LOG(ERR,
                        "port %u failed to allocate memory for interrupt"
@@ -831,7 +834,7 @@ mlx5_rx_intr_vec_disable(struct rte_eth_dev *dev)
 free:
        rte_intr_free_epoll_fd(intr_handle);
        if (intr_handle->intr_vec)
-               free(intr_handle->intr_vec);
+               mlx5_free(intr_handle->intr_vec);
        intr_handle->nb_efd = 0;
        intr_handle->intr_vec = NULL;
 }
@@ -1230,15 +1233,15 @@ mlx5_devx_rq_new(struct rte_eth_dev *dev, uint16_t idx, uint32_t cqn)
        /* Calculate and allocate WQ memory space. */
        wqe_size = 1 << log_wqe_size; /* round up power of two.*/
        wq_size = wqe_n * wqe_size;
-       buf = rte_calloc_socket(__func__, 1, wq_size, MLX5_WQE_BUF_ALIGNMENT,
-                               rxq_ctrl->socket);
+       buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, wq_size,
+                         MLX5_WQE_BUF_ALIGNMENT, rxq_ctrl->socket);
        if (!buf)
                return NULL;
        rxq_data->wqes = buf;
        rxq_ctrl->wq_umem = mlx5_glue->devx_umem_reg(priv->sh->ctx,
                                                     buf, wq_size, 0);
        if (!rxq_ctrl->wq_umem) {
-               rte_free(buf);
+               mlx5_free(buf);
                return NULL;
        }
        mlx5_devx_wq_attr_fill(priv, rxq_ctrl, &rq_attr.wq_attr);
@@ -1272,8 +1275,8 @@ mlx5_rxq_obj_hairpin_new(struct rte_eth_dev *dev, uint16_t idx)
 
        MLX5_ASSERT(rxq_data);
        MLX5_ASSERT(!rxq_ctrl->obj);
-       tmpl = rte_calloc_socket(__func__, 1, sizeof(*tmpl), 0,
-                                rxq_ctrl->socket);
+       tmpl = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, sizeof(*tmpl), 0,
+                          rxq_ctrl->socket);
        if (!tmpl) {
                DRV_LOG(ERR,
                        "port %u Rx queue %u cannot allocate verbs resources",
@@ -1291,7 +1294,7 @@ mlx5_rxq_obj_hairpin_new(struct rte_eth_dev *dev, uint16_t idx)
                        DRV_LOG(ERR, "total data size %u power of 2 is "
                                "too large for hairpin",
                                priv->config.log_hp_size);
-                       rte_free(tmpl);
+                       mlx5_free(tmpl);
                        rte_errno = ERANGE;
                        return NULL;
                }
@@ -1311,7 +1314,7 @@ mlx5_rxq_obj_hairpin_new(struct rte_eth_dev *dev, uint16_t idx)
                DRV_LOG(ERR,
                        "port %u Rx hairpin queue %u can't create rq object",
                        dev->data->port_id, idx);
-               rte_free(tmpl);
+               mlx5_free(tmpl);
                rte_errno = errno;
                return NULL;
        }
@@ -1359,8 +1362,8 @@ mlx5_rxq_obj_new(struct rte_eth_dev *dev, uint16_t idx,
                return mlx5_rxq_obj_hairpin_new(dev, idx);
        priv->verbs_alloc_ctx.type = MLX5_VERBS_ALLOC_TYPE_RX_QUEUE;
        priv->verbs_alloc_ctx.obj = rxq_ctrl;
-       tmpl = rte_calloc_socket(__func__, 1, sizeof(*tmpl), 0,
-                                rxq_ctrl->socket);
+       tmpl = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, sizeof(*tmpl), 0,
+                          rxq_ctrl->socket);
        if (!tmpl) {
                DRV_LOG(ERR,
                        "port %u Rx queue %u cannot allocate verbs resources",
@@ -1500,7 +1503,7 @@ error:
                if (tmpl->channel)
                        claim_zero(mlx5_glue->destroy_comp_channel
                                                        (tmpl->channel));
-               rte_free(tmpl);
+               mlx5_free(tmpl);
                rte_errno = ret; /* Restore rte_errno. */
        }
        if (type == MLX5_RXQ_OBJ_TYPE_DEVX_RQ)
@@ -1822,10 +1825,8 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
                rte_errno = ENOSPC;
                return NULL;
        }
-       tmpl = rte_calloc_socket("RXQ", 1,
-                                sizeof(*tmpl) +
-                                desc_n * sizeof(struct rte_mbuf *),
-                                0, socket);
+       tmpl = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, sizeof(*tmpl) +
+                          desc_n * sizeof(struct rte_mbuf *), 0, socket);
        if (!tmpl) {
                rte_errno = ENOMEM;
                return NULL;
@@ -2004,7 +2005,7 @@ mlx5_rxq_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
        LIST_INSERT_HEAD(&priv->rxqsctrl, tmpl, next);
        return tmpl;
 error:
-       rte_free(tmpl);
+       mlx5_free(tmpl);
        return NULL;
 }
 
@@ -2030,7 +2031,8 @@ mlx5_rxq_hairpin_new(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
        struct mlx5_priv *priv = dev->data->dev_private;
        struct mlx5_rxq_ctrl *tmpl;
 
-       tmpl = rte_calloc_socket("RXQ", 1, sizeof(*tmpl), 0, SOCKET_ID_ANY);
+       tmpl = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, sizeof(*tmpl), 0,
+                          SOCKET_ID_ANY);
        if (!tmpl) {
                rte_errno = ENOMEM;
                return NULL;
@@ -2109,7 +2111,7 @@ mlx5_rxq_release(struct rte_eth_dev *dev, uint16_t idx)
                if (rxq_ctrl->type == MLX5_RXQ_TYPE_STANDARD)
                        mlx5_mr_btree_free(&rxq_ctrl->rxq.mr_ctrl.cache_bh);
                LIST_REMOVE(rxq_ctrl, next);
-               rte_free(rxq_ctrl);
+               mlx5_free(rxq_ctrl);
                (*priv->rxqs)[idx] = NULL;
                return 0;
        }
@@ -2187,8 +2189,8 @@ mlx5_ind_table_obj_new(struct rte_eth_dev *dev, const uint16_t *queues,
        struct mlx5_ind_table_obj *ind_tbl;
        unsigned int i = 0, j = 0, k = 0;
 
-       ind_tbl = rte_calloc(__func__, 1, sizeof(*ind_tbl) +
-                            queues_n * sizeof(uint16_t), 0);
+       ind_tbl = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*ind_tbl) +
+                             queues_n * sizeof(uint16_t), 0, SOCKET_ID_ANY);
        if (!ind_tbl) {
                rte_errno = ENOMEM;
                return NULL;
@@ -2231,8 +2233,9 @@ mlx5_ind_table_obj_new(struct rte_eth_dev *dev, const uint16_t *queues,
                              log2above(queues_n) :
                              log2above(priv->config.ind_table_max_size));
 
-               rqt_attr = rte_calloc(__func__, 1, sizeof(*rqt_attr) +
-                                     rqt_n * sizeof(uint32_t), 0);
+               rqt_attr = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*rqt_attr) +
+                                     rqt_n * sizeof(uint32_t), 0,
+                                     SOCKET_ID_ANY);
                if (!rqt_attr) {
                        DRV_LOG(ERR, "port %u cannot allocate RQT resources",
                                dev->data->port_id);
@@ -2254,7 +2257,7 @@ mlx5_ind_table_obj_new(struct rte_eth_dev *dev, const uint16_t *queues,
                        rqt_attr->rq_list[k] = rqt_attr->rq_list[j];
                ind_tbl->rqt = mlx5_devx_cmd_create_rqt(priv->sh->ctx,
                                                        rqt_attr);
-               rte_free(rqt_attr);
+               mlx5_free(rqt_attr);
                if (!ind_tbl->rqt) {
                        DRV_LOG(ERR, "port %u cannot create DevX RQT",
                                dev->data->port_id);
@@ -2269,7 +2272,7 @@ mlx5_ind_table_obj_new(struct rte_eth_dev *dev, const uint16_t *queues,
 error:
        for (j = 0; j < i; j++)
                mlx5_rxq_release(dev, ind_tbl->queues[j]);
-       rte_free(ind_tbl);
+       mlx5_free(ind_tbl);
        DEBUG("port %u cannot create indirection table", dev->data->port_id);
        return NULL;
 }
@@ -2339,7 +2342,7 @@ mlx5_ind_table_obj_release(struct rte_eth_dev *dev,
                claim_nonzero(mlx5_rxq_release(dev, ind_tbl->queues[i]));
        if (!rte_atomic32_read(&ind_tbl->refcnt)) {
                LIST_REMOVE(ind_tbl, next);
-               rte_free(ind_tbl);
+               mlx5_free(ind_tbl);
                return 0;
        }
        return 1;
@@ -2761,7 +2764,7 @@ mlx5_rxq_obj_drop_new(struct rte_eth_dev *dev)
                rte_errno = errno;
                goto error;
        }
-       rxq = rte_calloc(__func__, 1, sizeof(*rxq), 0);
+       rxq = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*rxq), 0, SOCKET_ID_ANY);
        if (!rxq) {
                DEBUG("port %u cannot allocate drop Rx queue memory",
                      dev->data->port_id);
@@ -2799,7 +2802,7 @@ mlx5_rxq_obj_drop_release(struct rte_eth_dev *dev)
                claim_zero(mlx5_glue->destroy_wq(rxq->wq));
        if (rxq->cq)
                claim_zero(mlx5_glue->destroy_cq(rxq->cq));
-       rte_free(rxq);
+       mlx5_free(rxq);
        priv->drop_queue.rxq = NULL;
 }
 
@@ -2837,7 +2840,8 @@ mlx5_ind_table_obj_drop_new(struct rte_eth_dev *dev)
                rte_errno = errno;
                goto error;
        }
-       ind_tbl = rte_calloc(__func__, 1, sizeof(*ind_tbl), 0);
+       ind_tbl = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*ind_tbl), 0,
+                             SOCKET_ID_ANY);
        if (!ind_tbl) {
                rte_errno = ENOMEM;
                goto error;
@@ -2863,7 +2867,7 @@ mlx5_ind_table_obj_drop_release(struct rte_eth_dev *dev)
 
        claim_zero(mlx5_glue->destroy_rwq_ind_table(ind_tbl->ind_table));
        mlx5_rxq_obj_drop_release(dev);
-       rte_free(ind_tbl);
+       mlx5_free(ind_tbl);
        priv->drop_queue.hrxq->ind_table = NULL;
 }
 
@@ -2888,7 +2892,7 @@ mlx5_hrxq_drop_new(struct rte_eth_dev *dev)
                rte_atomic32_inc(&priv->drop_queue.hrxq->refcnt);
                return priv->drop_queue.hrxq;
        }
-       hrxq = rte_calloc(__func__, 1, sizeof(*hrxq), 0);
+       hrxq = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*hrxq), 0, SOCKET_ID_ANY);
        if (!hrxq) {
                DRV_LOG(WARNING,
                        "port %u cannot allocate memory for drop queue",
@@ -2945,7 +2949,7 @@ error:
                mlx5_ind_table_obj_drop_release(dev);
        if (hrxq) {
                priv->drop_queue.hrxq = NULL;
-               rte_free(hrxq);
+               mlx5_free(hrxq);
        }
        return NULL;
 }
@@ -2968,7 +2972,31 @@ mlx5_hrxq_drop_release(struct rte_eth_dev *dev)
 #endif
                claim_zero(mlx5_glue->destroy_qp(hrxq->qp));
                mlx5_ind_table_obj_drop_release(dev);
-               rte_free(hrxq);
+               mlx5_free(hrxq);
                priv->drop_queue.hrxq = NULL;
        }
 }
+
+
+/**
+ * Set the Rx queue timestamp conversion parameters
+ *
+ * @param[in] dev
+ *   Pointer to the Ethernet device structure.
+ */
+void
+mlx5_rxq_timestamp_set(struct rte_eth_dev *dev)
+{
+       struct mlx5_priv *priv = dev->data->dev_private;
+       struct mlx5_dev_ctx_shared *sh = priv->sh;
+       struct mlx5_rxq_data *data;
+       unsigned int i;
+
+       for (i = 0; i != priv->rxqs_n; ++i) {
+               if (!(*priv->rxqs)[i])
+                       continue;
+               data = (*priv->rxqs)[i];
+               data->sh = sh;
+               data->rt_timestamp = priv->config.rt_timestamp;
+       }
+}