net/mlx5: fix DevX resources freeing
authorGregory Etelson <getelson@nvidia.com>
Tue, 24 Nov 2020 08:10:13 +0000 (10:10 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 24 Nov 2020 22:17:19 +0000 (23:17 +0100)
Invalid memory release order of DevX resources caused PMD crash.

1. SQ and CQ memory must be unregistered with DevX before it is freed.
2. SQ objects reference to a CQ ones. Hence, SQ should be destroyed in
   advance of CQ it references to.

Fixes: 6deb19e1b2d2 ("net/mlx5: separate Rx queue object creations")
Fixes: 88f2e3f18cc7 ("net/mlx5: rearrange SQ and CQ creation in DevX module")

Signed-off-by: Gregory Etelson <getelson@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
drivers/net/mlx5/mlx5_devx.c

index 73ee147..de9b204 100644 (file)
@@ -154,14 +154,14 @@ mlx5_rxq_release_devx_rq_resources(struct mlx5_rxq_ctrl *rxq_ctrl)
 {
        struct mlx5_devx_dbr_page *dbr_page = rxq_ctrl->rq_dbrec_page;
 
-       if (rxq_ctrl->rxq.wqes) {
-               mlx5_free((void *)(uintptr_t)rxq_ctrl->rxq.wqes);
-               rxq_ctrl->rxq.wqes = NULL;
-       }
        if (rxq_ctrl->wq_umem) {
                mlx5_glue->devx_umem_dereg(rxq_ctrl->wq_umem);
                rxq_ctrl->wq_umem = NULL;
        }
+       if (rxq_ctrl->rxq.wqes) {
+               mlx5_free((void *)(uintptr_t)rxq_ctrl->rxq.wqes);
+               rxq_ctrl->rxq.wqes = NULL;
+       }
        if (dbr_page) {
                claim_zero(mlx5_release_dbr(&rxq_ctrl->priv->dbrpgs,
                                            mlx5_os_get_umem_id(dbr_page->umem),
@@ -181,14 +181,14 @@ mlx5_rxq_release_devx_cq_resources(struct mlx5_rxq_ctrl *rxq_ctrl)
 {
        struct mlx5_devx_dbr_page *dbr_page = rxq_ctrl->cq_dbrec_page;
 
-       if (rxq_ctrl->rxq.cqes) {
-               rte_free((void *)(uintptr_t)rxq_ctrl->rxq.cqes);
-               rxq_ctrl->rxq.cqes = NULL;
-       }
        if (rxq_ctrl->cq_umem) {
                mlx5_glue->devx_umem_dereg(rxq_ctrl->cq_umem);
                rxq_ctrl->cq_umem = NULL;
        }
+       if (rxq_ctrl->rxq.cqes) {
+               rte_free((void *)(uintptr_t)rxq_ctrl->rxq.cqes);
+               rxq_ctrl->rxq.cqes = NULL;
+       }
        if (dbr_page) {
                claim_zero(mlx5_release_dbr(&rxq_ctrl->priv->dbrpgs,
                                            mlx5_os_get_umem_id(dbr_page->umem),
@@ -1174,8 +1174,8 @@ mlx5_txq_release_devx_cq_resources(struct mlx5_txq_obj *txq_obj)
 static void
 mlx5_txq_release_devx_resources(struct mlx5_txq_obj *txq_obj)
 {
-       mlx5_txq_release_devx_cq_resources(txq_obj);
        mlx5_txq_release_devx_sq_resources(txq_obj);
+       mlx5_txq_release_devx_cq_resources(txq_obj);
 }
 
 /**