net: devlink: convert reload command to take implicit devlink->lock
Convert reload command to behave the same way as the rest of the commands and let if be called with devlink->lock held. Remove the temporary devl_lock taking from drivers. As the DEVLINK_NL_FLAG_NO_LOCK flag is no longer used, remove it alongside. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c2368b1980
commit
644a66c60f
|
@ -3958,11 +3958,9 @@ static int mlx4_devlink_reload_down(struct devlink *devlink, bool netns_change,
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Namespace change is not supported");
|
NL_SET_ERR_MSG_MOD(extack, "Namespace change is not supported");
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
devl_lock(devlink);
|
|
||||||
if (persist->num_vfs)
|
if (persist->num_vfs)
|
||||||
mlx4_warn(persist->dev, "Reload performed on PF, will cause reset on operating Virtual Functions\n");
|
mlx4_warn(persist->dev, "Reload performed on PF, will cause reset on operating Virtual Functions\n");
|
||||||
mlx4_restart_one_down(persist->pdev);
|
mlx4_restart_one_down(persist->pdev);
|
||||||
devl_unlock(devlink);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3975,10 +3973,8 @@ static int mlx4_devlink_reload_up(struct devlink *devlink, enum devlink_reload_a
|
||||||
struct mlx4_dev_persistent *persist = dev->persist;
|
struct mlx4_dev_persistent *persist = dev->persist;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
devl_lock(devlink);
|
|
||||||
*actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
|
*actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
|
||||||
err = mlx4_restart_one_up(persist->pdev, true, devlink);
|
err = mlx4_restart_one_up(persist->pdev, true, devlink);
|
||||||
devl_unlock(devlink);
|
|
||||||
if (err)
|
if (err)
|
||||||
mlx4_err(persist->dev, "mlx4_restart_one_up failed, ret=%d\n",
|
mlx4_err(persist->dev, "mlx4_restart_one_up failed, ret=%d\n",
|
||||||
err);
|
err);
|
||||||
|
|
|
@ -164,7 +164,6 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
|
||||||
NL_SET_ERR_MSG_MOD(extack, "reload while VFs are present is unfavorable");
|
NL_SET_ERR_MSG_MOD(extack, "reload while VFs are present is unfavorable");
|
||||||
}
|
}
|
||||||
|
|
||||||
devl_lock(devlink);
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:
|
case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:
|
||||||
mlx5_unload_one_devl_locked(dev);
|
mlx5_unload_one_devl_locked(dev);
|
||||||
|
@ -181,7 +180,6 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
|
||||||
ret = -EOPNOTSUPP;
|
ret = -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
devl_unlock(devlink);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,7 +190,6 @@ static int mlx5_devlink_reload_up(struct devlink *devlink, enum devlink_reload_a
|
||||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
devl_lock(devlink);
|
|
||||||
*actions_performed = BIT(action);
|
*actions_performed = BIT(action);
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:
|
case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:
|
||||||
|
@ -211,7 +208,6 @@ static int mlx5_devlink_reload_up(struct devlink *devlink, enum devlink_reload_a
|
||||||
ret = -EOPNOTSUPP;
|
ret = -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
devl_unlock(devlink);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1499,9 +1499,7 @@ mlxsw_devlink_core_bus_device_reload_down(struct devlink *devlink,
|
||||||
if (!(mlxsw_core->bus->features & MLXSW_BUS_F_RESET))
|
if (!(mlxsw_core->bus->features & MLXSW_BUS_F_RESET))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
devl_lock(devlink);
|
|
||||||
mlxsw_core_bus_device_unregister(mlxsw_core, true);
|
mlxsw_core_bus_device_unregister(mlxsw_core, true);
|
||||||
devl_unlock(devlink);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1515,12 +1513,10 @@ mlxsw_devlink_core_bus_device_reload_up(struct devlink *devlink, enum devlink_re
|
||||||
|
|
||||||
*actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT) |
|
*actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT) |
|
||||||
BIT(DEVLINK_RELOAD_ACTION_FW_ACTIVATE);
|
BIT(DEVLINK_RELOAD_ACTION_FW_ACTIVATE);
|
||||||
devl_lock(devlink);
|
|
||||||
err = mlxsw_core_bus_device_register(mlxsw_core->bus_info,
|
err = mlxsw_core_bus_device_register(mlxsw_core->bus_info,
|
||||||
mlxsw_core->bus,
|
mlxsw_core->bus,
|
||||||
mlxsw_core->bus_priv, true,
|
mlxsw_core->bus_priv, true,
|
||||||
devlink, extack);
|
devlink, extack);
|
||||||
devl_unlock(devlink);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -948,18 +948,15 @@ static int nsim_dev_reload_down(struct devlink *devlink, bool netns_change,
|
||||||
{
|
{
|
||||||
struct nsim_dev *nsim_dev = devlink_priv(devlink);
|
struct nsim_dev *nsim_dev = devlink_priv(devlink);
|
||||||
|
|
||||||
devl_lock(devlink);
|
|
||||||
if (nsim_dev->dont_allow_reload) {
|
if (nsim_dev->dont_allow_reload) {
|
||||||
/* For testing purposes, user set debugfs dont_allow_reload
|
/* For testing purposes, user set debugfs dont_allow_reload
|
||||||
* value to true. So forbid it.
|
* value to true. So forbid it.
|
||||||
*/
|
*/
|
||||||
NL_SET_ERR_MSG_MOD(extack, "User forbid the reload for testing purposes");
|
NL_SET_ERR_MSG_MOD(extack, "User forbid the reload for testing purposes");
|
||||||
devl_unlock(devlink);
|
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsim_dev_reload_destroy(nsim_dev);
|
nsim_dev_reload_destroy(nsim_dev);
|
||||||
devl_unlock(devlink);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -970,19 +967,16 @@ static int nsim_dev_reload_up(struct devlink *devlink, enum devlink_reload_actio
|
||||||
struct nsim_dev *nsim_dev = devlink_priv(devlink);
|
struct nsim_dev *nsim_dev = devlink_priv(devlink);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
devl_lock(devlink);
|
|
||||||
if (nsim_dev->fail_reload) {
|
if (nsim_dev->fail_reload) {
|
||||||
/* For testing purposes, user set debugfs fail_reload
|
/* For testing purposes, user set debugfs fail_reload
|
||||||
* value to true. Fail right away.
|
* value to true. Fail right away.
|
||||||
*/
|
*/
|
||||||
NL_SET_ERR_MSG_MOD(extack, "User setup the reload to fail for testing purposes");
|
NL_SET_ERR_MSG_MOD(extack, "User setup the reload to fail for testing purposes");
|
||||||
devl_unlock(devlink);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
*actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
|
*actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
|
||||||
ret = nsim_dev_reload_create(nsim_dev, extack);
|
ret = nsim_dev_reload_create(nsim_dev, extack);
|
||||||
devl_unlock(devlink);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -768,12 +768,6 @@ devlink_region_snapshot_get_by_id(struct devlink_region *region, u32 id)
|
||||||
#define DEVLINK_NL_FLAG_NEED_RATE_NODE BIT(3)
|
#define DEVLINK_NL_FLAG_NEED_RATE_NODE BIT(3)
|
||||||
#define DEVLINK_NL_FLAG_NEED_LINECARD BIT(4)
|
#define DEVLINK_NL_FLAG_NEED_LINECARD BIT(4)
|
||||||
|
|
||||||
/* The per devlink instance lock is taken by default in the pre-doit
|
|
||||||
* operation, yet several commands do not require this. The global
|
|
||||||
* devlink lock is taken and protects from disruption by user-calls.
|
|
||||||
*/
|
|
||||||
#define DEVLINK_NL_FLAG_NO_LOCK BIT(5)
|
|
||||||
|
|
||||||
static int devlink_nl_pre_doit(const struct genl_ops *ops,
|
static int devlink_nl_pre_doit(const struct genl_ops *ops,
|
||||||
struct sk_buff *skb, struct genl_info *info)
|
struct sk_buff *skb, struct genl_info *info)
|
||||||
{
|
{
|
||||||
|
@ -788,8 +782,7 @@ static int devlink_nl_pre_doit(const struct genl_ops *ops,
|
||||||
mutex_unlock(&devlink_mutex);
|
mutex_unlock(&devlink_mutex);
|
||||||
return PTR_ERR(devlink);
|
return PTR_ERR(devlink);
|
||||||
}
|
}
|
||||||
if (~ops->internal_flags & DEVLINK_NL_FLAG_NO_LOCK)
|
devl_lock(devlink);
|
||||||
devl_lock(devlink);
|
|
||||||
info->user_ptr[0] = devlink;
|
info->user_ptr[0] = devlink;
|
||||||
if (ops->internal_flags & DEVLINK_NL_FLAG_NEED_PORT) {
|
if (ops->internal_flags & DEVLINK_NL_FLAG_NEED_PORT) {
|
||||||
devlink_port = devlink_port_get_from_info(devlink, info);
|
devlink_port = devlink_port_get_from_info(devlink, info);
|
||||||
|
@ -831,8 +824,7 @@ static int devlink_nl_pre_doit(const struct genl_ops *ops,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
if (~ops->internal_flags & DEVLINK_NL_FLAG_NO_LOCK)
|
devl_unlock(devlink);
|
||||||
devl_unlock(devlink);
|
|
||||||
devlink_put(devlink);
|
devlink_put(devlink);
|
||||||
mutex_unlock(&devlink_mutex);
|
mutex_unlock(&devlink_mutex);
|
||||||
return err;
|
return err;
|
||||||
|
@ -849,8 +841,7 @@ static void devlink_nl_post_doit(const struct genl_ops *ops,
|
||||||
linecard = info->user_ptr[1];
|
linecard = info->user_ptr[1];
|
||||||
devlink_linecard_put(linecard);
|
devlink_linecard_put(linecard);
|
||||||
}
|
}
|
||||||
if (~ops->internal_flags & DEVLINK_NL_FLAG_NO_LOCK)
|
devl_unlock(devlink);
|
||||||
devl_unlock(devlink);
|
|
||||||
devlink_put(devlink);
|
devlink_put(devlink);
|
||||||
mutex_unlock(&devlink_mutex);
|
mutex_unlock(&devlink_mutex);
|
||||||
}
|
}
|
||||||
|
@ -9414,7 +9405,6 @@ static const struct genl_small_ops devlink_nl_ops[] = {
|
||||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||||
.doit = devlink_nl_cmd_reload,
|
.doit = devlink_nl_cmd_reload,
|
||||||
.flags = GENL_ADMIN_PERM,
|
.flags = GENL_ADMIN_PERM,
|
||||||
.internal_flags = DEVLINK_NL_FLAG_NO_LOCK,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = DEVLINK_CMD_PARAM_GET,
|
.cmd = DEVLINK_CMD_PARAM_GET,
|
||||||
|
@ -12507,10 +12497,12 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net)
|
||||||
mutex_lock(&devlink_mutex);
|
mutex_lock(&devlink_mutex);
|
||||||
devlinks_xa_for_each_registered_get(net, index, devlink) {
|
devlinks_xa_for_each_registered_get(net, index, devlink) {
|
||||||
WARN_ON(!(devlink->features & DEVLINK_F_RELOAD));
|
WARN_ON(!(devlink->features & DEVLINK_F_RELOAD));
|
||||||
|
mutex_lock(&devlink->lock);
|
||||||
err = devlink_reload(devlink, &init_net,
|
err = devlink_reload(devlink, &init_net,
|
||||||
DEVLINK_RELOAD_ACTION_DRIVER_REINIT,
|
DEVLINK_RELOAD_ACTION_DRIVER_REINIT,
|
||||||
DEVLINK_RELOAD_LIMIT_UNSPEC,
|
DEVLINK_RELOAD_LIMIT_UNSPEC,
|
||||||
&actions_performed, NULL);
|
&actions_performed, NULL);
|
||||||
|
mutex_unlock(&devlink->lock);
|
||||||
if (err && err != -EOPNOTSUPP)
|
if (err && err != -EOPNOTSUPP)
|
||||||
pr_warn("Failed to reload devlink instance into init_net\n");
|
pr_warn("Failed to reload devlink instance into init_net\n");
|
||||||
devlink_put(devlink);
|
devlink_put(devlink);
|
||||||
|
|
Loading…
Reference in New Issue