Commit 644a66c6 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

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: default avatarJiri Pirko <jiri@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c2368b19
...@@ -3958,11 +3958,9 @@ static int mlx4_devlink_reload_down(struct devlink *devlink, bool netns_change, ...@@ -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 ...@@ -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, ...@@ -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, ...@@ -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 ...@@ -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 ...@@ -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, ...@@ -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 ...@@ -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, ...@@ -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 ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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[] = { ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment