]> git.droids-corp.org - dpdk.git/commitdiff
crypto/mlx5: fix login release in probing and removal
authorMichael Baum <michaelba@nvidia.com>
Wed, 3 Nov 2021 18:35:08 +0000 (20:35 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Sun, 7 Nov 2021 15:20:35 +0000 (16:20 +0100)
The probe function creates DevX object named login and saves pointer to
it in priv structure.

The remove function releases first the priv structure and then releases
the login object.
However, the pointer to login object is field of priv structure, which
is invalid.

Release the login object and then release the priv structure.

Fixes: debb27ea3442 ("crypto/mlx5: create login object using DevX")
Cc: stable@dpdk.org
Signed-off-by: Michael Baum <michaelba@nvidia.com>
Reviewed-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
drivers/crypto/mlx5/mlx5_crypto.c

index 44dae37aec8da272c92335c227d83e902938746e..36d41805c5f32bcbf9aba591e62a2c050dcb19b5 100644 (file)
@@ -883,12 +883,6 @@ mlx5_crypto_dev_probe(struct mlx5_common_device *cdev)
                DRV_LOG(ERR, "Failed to parse devargs.");
                return -rte_errno;
        }
-       login = mlx5_devx_cmd_create_crypto_login_obj(cdev->ctx,
-                                                     &devarg_prms.login_attr);
-       if (login == NULL) {
-               DRV_LOG(ERR, "Failed to configure login.");
-               return -rte_errno;
-       }
        crypto_dev = rte_cryptodev_pmd_create(ibdev_name, cdev->dev,
                                              &init_params);
        if (crypto_dev == NULL) {
@@ -904,12 +898,20 @@ mlx5_crypto_dev_probe(struct mlx5_common_device *cdev)
        crypto_dev->driver_id = mlx5_crypto_driver_id;
        priv = crypto_dev->data->dev_private;
        priv->cdev = cdev;
-       priv->login_obj = login;
        priv->crypto_dev = crypto_dev;
        if (mlx5_crypto_uar_prepare(priv) != 0) {
                rte_cryptodev_pmd_destroy(priv->crypto_dev);
                return -1;
        }
+       login = mlx5_devx_cmd_create_crypto_login_obj(cdev->ctx,
+                                                     &devarg_prms.login_attr);
+       if (login == NULL) {
+               DRV_LOG(ERR, "Failed to configure login.");
+               mlx5_crypto_uar_release(priv);
+               rte_cryptodev_pmd_destroy(priv->crypto_dev);
+               return -rte_errno;
+       }
+       priv->login_obj = login;
        priv->keytag = rte_cpu_to_be_64(devarg_prms.keytag);
        priv->max_segs_num = devarg_prms.max_segs_num;
        priv->umr_wqe_size = sizeof(struct mlx5_wqe_umr_bsf_seg) +
@@ -947,9 +949,9 @@ mlx5_crypto_dev_remove(struct mlx5_common_device *cdev)
                TAILQ_REMOVE(&mlx5_crypto_priv_list, priv, next);
        pthread_mutex_unlock(&priv_list_lock);
        if (priv) {
+               claim_zero(mlx5_devx_cmd_destroy(priv->login_obj));
                mlx5_crypto_uar_release(priv);
                rte_cryptodev_pmd_destroy(priv->crypto_dev);
-               claim_zero(mlx5_devx_cmd_destroy(priv->login_obj));
        }
        return 0;
 }