From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id F02DEA04BB; Wed, 2 Sep 2020 13:38:32 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9CC61137D; Wed, 2 Sep 2020 13:38:32 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 70DF3E07 for ; Wed, 2 Sep 2020 13:38:31 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from yuvalav@mellanox.com) with SMTP; 2 Sep 2020 14:38:25 +0300 Received: from pegasus04.mtr.labs.mlnx (pegasus04.mtr.labs.mlnx [10.210.16.126]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 082BcPDX002564; Wed, 2 Sep 2020 14:38:25 +0300 Received: from pegasus04.mtr.labs.mlnx (localhost [127.0.0.1]) by pegasus04.mtr.labs.mlnx (8.14.7/8.14.7) with ESMTP id 082BcPE3069749; Wed, 2 Sep 2020 11:38:25 GMT Received: (from yuvalav@localhost) by pegasus04.mtr.labs.mlnx (8.14.7/8.14.7/Submit) id 082BcOJs069747; Wed, 2 Sep 2020 11:38:24 GMT From: Yuval Avnery To: Ori Kam Cc: thomas@monjalon.net, dev@dpdk.org, yuvalav@mellanox.com Date: Wed, 2 Sep 2020 11:38:22 +0000 Message-Id: <1599046703-69676-1-git-send-email-yuvalav@nvidia.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH v2] regex/mlx5: add teardown flow to fastpath buffers X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Yuval Avnery Added missing code to free Input/Output buffers and memory registration. Also added calls to this code in case of error in the qp setup procedure. The rollback code itself did not handle rollback properly and did not check return value from the fastpath setup. Signed-off-by: Yuval Avnery Acked-by: Ori Kam --- drivers/regex/mlx5/mlx5_regex.h | 2 ++ drivers/regex/mlx5/mlx5_regex_control.c | 20 ++++++++++++------- drivers/regex/mlx5/mlx5_regex_fastpath.c | 33 +++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/drivers/regex/mlx5/mlx5_regex.h b/drivers/regex/mlx5/mlx5_regex.h index 6098fb1..fc0f362 100644 --- a/drivers/regex/mlx5/mlx5_regex.h +++ b/drivers/regex/mlx5/mlx5_regex.h @@ -109,6 +109,8 @@ int mlx5_regex_qp_setup(struct rte_regexdev *dev, uint16_t qp_ind, /* mlx5_regex_fastpath.c */ int mlx5_regexdev_setup_fastpath(struct mlx5_regex_priv *priv, uint32_t qp_id); +void mlx5_regexdev_teardown_fastpath(struct mlx5_regex_priv *priv, + uint32_t qp_id); uint16_t mlx5_regexdev_enqueue(struct rte_regexdev *dev, uint16_t qp_id, struct rte_regex_ops **ops, uint16_t nb_ops); uint16_t mlx5_regexdev_dequeue(struct rte_regexdev *dev, uint16_t qp_id, diff --git a/drivers/regex/mlx5/mlx5_regex_control.c b/drivers/regex/mlx5/mlx5_regex_control.c index faafb76..187c3de 100644 --- a/drivers/regex/mlx5/mlx5_regex_control.c +++ b/drivers/regex/mlx5/mlx5_regex_control.c @@ -357,23 +357,29 @@ 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_sq; } } - mlx5_regexdev_setup_fastpath(priv, qp_ind); + ret = mlx5_regexdev_setup_fastpath(priv, qp_ind); + if (ret) { + DRV_LOG(ERR, "Fail to setup fastpath."); + goto err_fp; + } return 0; -error: - regex_ctrl_destroy_cq(priv, &qp->cq); +err_fp: for (i = 0; i < qp->nb_obj; i++) ret = regex_ctrl_destroy_sq(priv, qp, i); - return -rte_errno; - +err_sq: + regex_ctrl_destroy_cq(priv, &qp->cq); +err_cq: + rte_free(qp->sqs); + return ret; } diff --git a/drivers/regex/mlx5/mlx5_regex_fastpath.c b/drivers/regex/mlx5/mlx5_regex_fastpath.c index 2c6c9e1..6fafcff 100644 --- a/drivers/regex/mlx5/mlx5_regex_fastpath.c +++ b/drivers/regex/mlx5/mlx5_regex_fastpath.c @@ -407,8 +407,39 @@ struct mlx5_regex_job { if (!qp->jobs) return -ENOMEM; err = setup_buffers(qp, priv->pd); - if (err) + if (err) { + rte_free(qp->jobs); return err; + } setup_sqs(qp); return 0; } + +static void +free_buffers(struct mlx5_regex_qp *qp) +{ + if (qp->metadata) { + mlx5_glue->dereg_mr(qp->metadata); + rte_free(qp->metadata->addr); + } + if (qp->inputs) { + mlx5_glue->dereg_mr(qp->inputs); + rte_free(qp->inputs->addr); + } + if (qp->outputs) { + mlx5_glue->dereg_mr(qp->outputs); + rte_free(qp->outputs->addr); + } +} + +void +mlx5_regexdev_teardown_fastpath(struct mlx5_regex_priv *priv, uint32_t qp_id) +{ + struct mlx5_regex_qp *qp = &priv->qps[qp_id]; + + if (qp) { + free_buffers(qp); + if (qp->jobs) + rte_free(qp->jobs); + } +} -- 1.8.3.1