regex/mlx5: fix leak on queue setup failure
[dpdk.git] / drivers / regex / mlx5 / mlx5_regex_control.c
index ec57e24..d6f452b 100644 (file)
@@ -10,6 +10,7 @@
 #include <rte_regexdev.h>
 #include <rte_regexdev_core.h>
 #include <rte_regexdev_driver.h>
+#include <rte_dev.h>
 
 #include <mlx5_common.h>
 #include <mlx5_glue.h>
@@ -120,6 +121,7 @@ regex_ctrl_create_cq(struct mlx5_regex_priv *priv, struct mlx5_regex_cq *cq)
        cq->cqe_umem = mlx5_glue->devx_umem_reg(priv->ctx, buf,
                                                sizeof(struct mlx5_cqe) *
                                                cq_size, 7);
+       cq->ci = 0;
        if (!cq->cqe_umem) {
                DRV_LOG(ERR, "Can't register cqe mem.");
                rte_errno  = ENOMEM;
@@ -219,6 +221,8 @@ regex_ctrl_create_sq(struct mlx5_regex_priv *priv, struct mlx5_regex_qp *qp,
        sq->wqe = buf;
        sq->wqe_umem = mlx5_glue->devx_umem_reg(priv->ctx, buf, 64 * sq_size,
                                                7);
+       sq->ci = 0;
+       sq->pi = 0;
        if (!sq->wqe_umem) {
                DRV_LOG(ERR, "Can't register wqe mem.");
                rte_errno  = ENOMEM;
@@ -332,6 +336,7 @@ mlx5_regex_qp_setup(struct rte_regexdev *dev, uint16_t qp_ind,
        struct mlx5_regex_priv *priv = dev->data->dev_private;
        struct mlx5_regex_qp *qp;
        int i;
+       int nb_sq_config = 0;
        int ret;
        uint16_t log_desc;
 
@@ -347,30 +352,45 @@ mlx5_regex_qp_setup(struct rte_regexdev *dev, uint16_t qp_ind,
                             qp->nb_obj * sizeof(struct mlx5_regex_sq), 64);
        if (!qp->sqs) {
                DRV_LOG(ERR, "Can't allocate sq array memory.");
-               rte_errno  = ENOMEM;
+               rte_errno = ENOMEM;
                return -rte_errno;
        }
        log_desc = rte_log2_u32(qp->nb_desc / qp->nb_obj);
        ret = regex_ctrl_create_cq(priv, &qp->cq);
        if (ret) {
                DRV_LOG(ERR, "Can't create cq.");
-               goto error;
+               goto err_cq;
        }
        for (i = 0; i < qp->nb_obj; i++) {
                ret = regex_ctrl_create_sq(priv, qp, i, log_desc);
                if (ret) {
                        DRV_LOG(ERR, "Can't create sq.");
-                       goto error;
+                       goto err_btree;
                }
+               nb_sq_config++;
+       }
+
+       ret = mlx5_mr_btree_init(&qp->mr_ctrl.cache_bh, MLX5_MR_BTREE_CACHE_N,
+                                rte_socket_id());
+       if (ret) {
+               DRV_LOG(ERR, "Error setting up mr btree");
+               goto err_btree;
        }
 
-       mlx5_regexdev_setup_fastpath(priv, qp_ind);
+       ret = mlx5_regexdev_setup_fastpath(priv, qp_ind);
+       if (ret) {
+               DRV_LOG(ERR, "Error setting up fastpath");
+               goto err_fp;
+       }
        return 0;
 
-error:
+err_fp:
+       mlx5_mr_btree_free(&qp->mr_ctrl.cache_bh);
+err_btree:
+       for (i = 0; i < nb_sq_config; i++)
+               regex_ctrl_destroy_sq(priv, qp, i);
        regex_ctrl_destroy_cq(priv, &qp->cq);
-       for (i = 0; i < qp->nb_obj; i++)
-               ret = regex_ctrl_destroy_sq(priv, qp, i);
-       return -rte_errno;
-
+err_cq:
+       rte_free(qp->sqs);
+       return ret;
 }