Commit 90e8ca0a authored by David S. Miller's avatar David S. Miller

Merge branch 'devlink-next'

Jakub Kicinski says:

====================
devlink: fix reload notifications and remove features

First two patches adjust notifications during devlink reload.
The last patch removes no longer needed devlink features.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Reviewed-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 166a1a5a fb8421a9
...@@ -1303,7 +1303,6 @@ int bnxt_dl_register(struct bnxt *bp) ...@@ -1303,7 +1303,6 @@ int bnxt_dl_register(struct bnxt *bp)
if (rc) if (rc)
goto err_dl_port_unreg; goto err_dl_port_unreg;
devlink_set_features(dl, DEVLINK_F_RELOAD);
out: out:
devlink_register(dl); devlink_register(dl);
return 0; return 0;
......
...@@ -114,7 +114,6 @@ int hclge_devlink_init(struct hclge_dev *hdev) ...@@ -114,7 +114,6 @@ int hclge_devlink_init(struct hclge_dev *hdev)
priv->hdev = hdev; priv->hdev = hdev;
hdev->devlink = devlink; hdev->devlink = devlink;
devlink_set_features(devlink, DEVLINK_F_RELOAD);
devlink_register(devlink); devlink_register(devlink);
return 0; return 0;
} }
......
...@@ -116,7 +116,6 @@ int hclgevf_devlink_init(struct hclgevf_dev *hdev) ...@@ -116,7 +116,6 @@ int hclgevf_devlink_init(struct hclgevf_dev *hdev)
priv->hdev = hdev; priv->hdev = hdev;
hdev->devlink = devlink; hdev->devlink = devlink;
devlink_set_features(devlink, DEVLINK_F_RELOAD);
devlink_register(devlink); devlink_register(devlink);
return 0; return 0;
} }
......
...@@ -1376,7 +1376,6 @@ void ice_devlink_register(struct ice_pf *pf) ...@@ -1376,7 +1376,6 @@ void ice_devlink_register(struct ice_pf *pf)
{ {
struct devlink *devlink = priv_to_devlink(pf); struct devlink *devlink = priv_to_devlink(pf);
devlink_set_features(devlink, DEVLINK_F_RELOAD);
devlink_register(devlink); devlink_register(devlink);
} }
......
...@@ -4031,7 +4031,6 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -4031,7 +4031,6 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
goto err_params_unregister; goto err_params_unregister;
pci_save_state(pdev); pci_save_state(pdev);
devlink_set_features(devlink, DEVLINK_F_RELOAD);
devl_unlock(devlink); devl_unlock(devlink);
devlink_register(devlink); devlink_register(devlink);
return 0; return 0;
......
...@@ -156,6 +156,11 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change, ...@@ -156,6 +156,11 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
if (mlx5_core_is_mp_slave(dev)) {
NL_SET_ERR_MSG_MOD(extack, "reload is unsupported for multi port slave");
return -EOPNOTSUPP;
}
if (pci_num_vf(pdev)) { if (pci_num_vf(pdev)) {
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");
} }
...@@ -744,7 +749,6 @@ void mlx5_devlink_traps_unregister(struct devlink *devlink) ...@@ -744,7 +749,6 @@ void mlx5_devlink_traps_unregister(struct devlink *devlink)
int mlx5_devlink_params_register(struct devlink *devlink) int mlx5_devlink_params_register(struct devlink *devlink)
{ {
struct mlx5_core_dev *dev = devlink_priv(devlink);
int err; int err;
err = devl_params_register(devlink, mlx5_devlink_params, err = devl_params_register(devlink, mlx5_devlink_params,
...@@ -762,9 +766,6 @@ int mlx5_devlink_params_register(struct devlink *devlink) ...@@ -762,9 +766,6 @@ int mlx5_devlink_params_register(struct devlink *devlink)
if (err) if (err)
goto max_uc_list_err; goto max_uc_list_err;
if (!mlx5_core_is_mp_slave(dev))
devlink_set_features(devlink, DEVLINK_F_RELOAD);
return 0; return 0;
max_uc_list_err: max_uc_list_err:
......
...@@ -2285,7 +2285,6 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info, ...@@ -2285,7 +2285,6 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
} }
if (!reload) { if (!reload) {
devlink_set_features(devlink, DEVLINK_F_RELOAD);
devl_unlock(devlink); devl_unlock(devlink);
devlink_register(devlink); devlink_register(devlink);
} }
......
...@@ -1609,7 +1609,6 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev) ...@@ -1609,7 +1609,6 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
goto err_hwstats_exit; goto err_hwstats_exit;
nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY; nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY;
devlink_set_features(devlink, DEVLINK_F_RELOAD);
devl_unlock(devlink); devl_unlock(devlink);
return 0; return 0;
......
...@@ -1645,7 +1645,7 @@ static inline struct devlink *devlink_alloc(const struct devlink_ops *ops, ...@@ -1645,7 +1645,7 @@ static inline struct devlink *devlink_alloc(const struct devlink_ops *ops,
{ {
return devlink_alloc_ns(ops, priv_size, &init_net, dev); return devlink_alloc_ns(ops, priv_size, &init_net, dev);
} }
void devlink_set_features(struct devlink *devlink, u64 features);
int devl_register(struct devlink *devlink); int devl_register(struct devlink *devlink);
void devl_unregister(struct devlink *devlink); void devl_unregister(struct devlink *devlink);
void devlink_register(struct devlink *devlink); void devlink_register(struct devlink *devlink);
......
...@@ -125,23 +125,6 @@ struct devlink *devlinks_xa_find_get(struct net *net, unsigned long *indexp) ...@@ -125,23 +125,6 @@ struct devlink *devlinks_xa_find_get(struct net *net, unsigned long *indexp)
goto retry; goto retry;
} }
/**
* devlink_set_features - Set devlink supported features
*
* @devlink: devlink
* @features: devlink support features
*
* This interface allows us to set reload ops separatelly from
* the devlink_alloc.
*/
void devlink_set_features(struct devlink *devlink, u64 features)
{
WARN_ON(features & DEVLINK_F_RELOAD &&
!devlink_reload_supported(devlink->ops));
devlink->features = features;
}
EXPORT_SYMBOL_GPL(devlink_set_features);
/** /**
* devl_register - Register devlink instance * devl_register - Register devlink instance
* @devlink: devlink * @devlink: devlink
...@@ -303,7 +286,6 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net) ...@@ -303,7 +286,6 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net)
* all devlink instances from this namespace into init_net. * all devlink instances from this namespace into init_net.
*/ */
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));
devl_lock(devlink); devl_lock(devlink);
err = 0; err = 0;
if (devl_is_registered(devlink)) if (devl_is_registered(devlink))
...@@ -313,7 +295,6 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net) ...@@ -313,7 +295,6 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net)
&actions_performed, NULL); &actions_performed, NULL);
devl_unlock(devlink); devl_unlock(devlink);
devlink_put(devlink); devlink_put(devlink);
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");
} }
......
...@@ -38,7 +38,6 @@ struct devlink { ...@@ -38,7 +38,6 @@ struct devlink {
struct list_head trap_policer_list; struct list_head trap_policer_list;
struct list_head linecard_list; struct list_head linecard_list;
const struct devlink_ops *ops; const struct devlink_ops *ops;
u64 features;
struct xarray snapshot_ids; struct xarray snapshot_ids;
struct devlink_dev_stats stats; struct devlink_dev_stats stats;
struct device *dev; struct device *dev;
......
...@@ -4230,36 +4230,20 @@ static struct net *devlink_netns_get(struct sk_buff *skb, ...@@ -4230,36 +4230,20 @@ static struct net *devlink_netns_get(struct sk_buff *skb,
return net; return net;
} }
static void devlink_param_notify(struct devlink *devlink, static void devlink_reload_netns_change(struct devlink *devlink,
unsigned int port_index, struct net *curr_net,
struct devlink_param_item *param_item, struct net *dest_net)
enum devlink_command cmd);
static void devlink_ns_change_notify(struct devlink *devlink,
struct net *dest_net, struct net *curr_net,
bool new)
{ {
struct devlink_param_item *param_item;
enum devlink_command cmd;
/* Userspace needs to be notified about devlink objects /* Userspace needs to be notified about devlink objects
* removed from original and entering new network namespace. * removed from original and entering new network namespace.
* The rest of the devlink objects are re-created during * The rest of the devlink objects are re-created during
* reload process so the notifications are generated separatelly. * reload process so the notifications are generated separatelly.
*/ */
devlink_notify_unregister(devlink);
if (!dest_net || net_eq(dest_net, curr_net)) move_netdevice_notifier_net(curr_net, dest_net,
return; &devlink->netdevice_nb);
write_pnet(&devlink->_net, dest_net);
if (new) devlink_notify_register(devlink);
devlink_notify(devlink, DEVLINK_CMD_NEW);
cmd = new ? DEVLINK_CMD_PARAM_NEW : DEVLINK_CMD_PARAM_DEL;
list_for_each_entry(param_item, &devlink->param_list, list)
devlink_param_notify(devlink, 0, param_item, cmd);
if (!new)
devlink_notify(devlink, DEVLINK_CMD_DEL);
} }
static void devlink_reload_failed_set(struct devlink *devlink, static void devlink_reload_failed_set(struct devlink *devlink,
...@@ -4341,24 +4325,19 @@ int devlink_reload(struct devlink *devlink, struct net *dest_net, ...@@ -4341,24 +4325,19 @@ int devlink_reload(struct devlink *devlink, struct net *dest_net,
memcpy(remote_reload_stats, devlink->stats.remote_reload_stats, memcpy(remote_reload_stats, devlink->stats.remote_reload_stats,
sizeof(remote_reload_stats)); sizeof(remote_reload_stats));
curr_net = devlink_net(devlink);
devlink_ns_change_notify(devlink, dest_net, curr_net, false);
err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack); err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack);
if (err) if (err)
return err; return err;
if (dest_net && !net_eq(dest_net, curr_net)) { curr_net = devlink_net(devlink);
move_netdevice_notifier_net(curr_net, dest_net, if (dest_net && !net_eq(dest_net, curr_net))
&devlink->netdevice_nb); devlink_reload_netns_change(devlink, curr_net, dest_net);
write_pnet(&devlink->_net, dest_net);
}
err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack);
devlink_reload_failed_set(devlink, !!err); devlink_reload_failed_set(devlink, !!err);
if (err) if (err)
return err; return err;
devlink_ns_change_notify(devlink, dest_net, curr_net, true);
WARN_ON(!(*actions_performed & BIT(action))); WARN_ON(!(*actions_performed & BIT(action)));
/* Catch driver on updating the remote action within devlink reload */ /* Catch driver on updating the remote action within devlink reload */
WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats, WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats,
...@@ -4408,9 +4387,6 @@ static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info) ...@@ -4408,9 +4387,6 @@ static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info)
u32 actions_performed; u32 actions_performed;
int err; int err;
if (!(devlink->features & DEVLINK_F_RELOAD))
return -EOPNOTSUPP;
err = devlink_resources_validate(devlink, NULL, info); err = devlink_resources_validate(devlink, NULL, info);
if (err) { if (err) {
NL_SET_ERR_MSG_MOD(info->extack, "resources size validation failed"); NL_SET_ERR_MSG_MOD(info->extack, "resources size validation failed");
......
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