net/mlx5: Use devl_ API for rate nodes destroy
authorMoshe Shemesh <moshe@nvidia.com>
Mon, 11 Jul 2022 08:14:01 +0000 (01:14 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 12 Jul 2022 08:26:22 +0000 (10:26 +0200)
Use devl_rate_nodes_destroy() instead of devlink_rate_nodes_destroy().
Add devlink instance lock in the driver paths to this function to have
it locked while calling devl_ API function.

This will be used by the downstream patch to invoke
mlx5_devlink_eswitch_mode_set() with devlink lock held.

Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index b938632..571114e 100644 (file)
@@ -1330,9 +1330,13 @@ int mlx5_eswitch_enable(struct mlx5_eswitch *esw, int num_vfs)
 /* When disabling sriov, free driver level resources. */
 void mlx5_eswitch_disable_sriov(struct mlx5_eswitch *esw, bool clear_vf)
 {
+       struct devlink *devlink;
+
        if (!mlx5_esw_allowed(esw))
                return;
 
+       devlink = priv_to_devlink(esw->dev);
+       devl_lock(devlink);
        down_write(&esw->mode_lock);
        /* If driver is unloaded, this function is called twice by remove_one()
         * and mlx5_unload(). Prevent the second call.
@@ -1354,13 +1358,14 @@ void mlx5_eswitch_disable_sriov(struct mlx5_eswitch *esw, bool clear_vf)
                struct devlink *devlink = priv_to_devlink(esw->dev);
 
                esw_offloads_del_send_to_vport_meta_rules(esw);
-               devlink_rate_nodes_destroy(devlink);
+               devl_rate_nodes_destroy(devlink);
        }
 
        esw->esw_funcs.num_vfs = 0;
 
 unlock:
        up_write(&esw->mode_lock);
+       devl_unlock(devlink);
 }
 
 /* Free resources for corresponding eswitch mode. It is called by devlink
@@ -1389,18 +1394,23 @@ void mlx5_eswitch_disable_locked(struct mlx5_eswitch *esw)
        mlx5_esw_acls_ns_cleanup(esw);
 
        if (esw->mode == MLX5_ESWITCH_OFFLOADS)
-               devlink_rate_nodes_destroy(devlink);
+               devl_rate_nodes_destroy(devlink);
 }
 
 void mlx5_eswitch_disable(struct mlx5_eswitch *esw)
 {
+       struct devlink *devlink;
+
        if (!mlx5_esw_allowed(esw))
                return;
 
        mlx5_lag_disable_change(esw->dev);
+       devlink = priv_to_devlink(esw->dev);
+       devl_lock(devlink);
        down_write(&esw->mode_lock);
        mlx5_eswitch_disable_locked(esw);
        up_write(&esw->mode_lock);
+       devl_unlock(devlink);
        mlx5_lag_enable_change(esw->dev);
 }
 
index 3bd843e..f1640e4 100644 (file)
@@ -3377,7 +3377,9 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
        if (cur_mlx5_mode == mlx5_mode)
                goto unlock;
 
+       devl_lock(devlink);
        mlx5_eswitch_disable_locked(esw);
+       devl_unlock(devlink);
        if (mode == DEVLINK_ESWITCH_MODE_SWITCHDEV) {
                if (mlx5_devlink_trap_get_num_active(esw->dev)) {
                        NL_SET_ERR_MSG_MOD(extack,