Skip to content

Commit

Permalink
net/mlx5: Use devl_ API for rate nodes destroy
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Moshe Shemesh authored and Paolo Abeni committed Jul 12, 2022
1 parent 367dfa1 commit 03f9c47
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
14 changes: 12 additions & 2 deletions drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down Expand Up @@ -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);
}

Expand Down
2 changes: 2 additions & 0 deletions drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 03f9c47

Please sign in to comment.