mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
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: David S. Miller <davem@davemloft.net> Reviewed-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
90e8ca0abb
12 changed files with 17 additions and 67 deletions
|
@ -1303,7 +1303,6 @@ int bnxt_dl_register(struct bnxt *bp)
|
|||
if (rc)
|
||||
goto err_dl_port_unreg;
|
||||
|
||||
devlink_set_features(dl, DEVLINK_F_RELOAD);
|
||||
out:
|
||||
devlink_register(dl);
|
||||
return 0;
|
||||
|
|
|
@ -114,7 +114,6 @@ int hclge_devlink_init(struct hclge_dev *hdev)
|
|||
priv->hdev = hdev;
|
||||
hdev->devlink = devlink;
|
||||
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devlink_register(devlink);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -116,7 +116,6 @@ int hclgevf_devlink_init(struct hclgevf_dev *hdev)
|
|||
priv->hdev = hdev;
|
||||
hdev->devlink = devlink;
|
||||
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devlink_register(devlink);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1376,7 +1376,6 @@ void ice_devlink_register(struct ice_pf *pf)
|
|||
{
|
||||
struct devlink *devlink = priv_to_devlink(pf);
|
||||
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devlink_register(devlink);
|
||||
}
|
||||
|
||||
|
|
|
@ -4031,7 +4031,6 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
goto err_params_unregister;
|
||||
|
||||
pci_save_state(pdev);
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devl_unlock(devlink);
|
||||
devlink_register(devlink);
|
||||
return 0;
|
||||
|
|
|
@ -156,6 +156,11 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
|
|||
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)) {
|
||||
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)
|
|||
|
||||
int mlx5_devlink_params_register(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
int err;
|
||||
|
||||
err = devl_params_register(devlink, mlx5_devlink_params,
|
||||
|
@ -762,9 +766,6 @@ int mlx5_devlink_params_register(struct devlink *devlink)
|
|||
if (err)
|
||||
goto max_uc_list_err;
|
||||
|
||||
if (!mlx5_core_is_mp_slave(dev))
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
|
||||
return 0;
|
||||
|
||||
max_uc_list_err:
|
||||
|
|
|
@ -2285,7 +2285,6 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
|
|||
}
|
||||
|
||||
if (!reload) {
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devl_unlock(devlink);
|
||||
devlink_register(devlink);
|
||||
}
|
||||
|
|
|
@ -1609,7 +1609,6 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
|
|||
goto err_hwstats_exit;
|
||||
|
||||
nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY;
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devl_unlock(devlink);
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
void devlink_set_features(struct devlink *devlink, u64 features);
|
||||
|
||||
int devl_register(struct devlink *devlink);
|
||||
void devl_unregister(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)
|
|||
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
|
||||
* @devlink: devlink
|
||||
|
@ -303,7 +286,6 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net)
|
|||
* all devlink instances from this namespace into init_net.
|
||||
*/
|
||||
devlinks_xa_for_each_registered_get(net, index, devlink) {
|
||||
WARN_ON(!(devlink->features & DEVLINK_F_RELOAD));
|
||||
devl_lock(devlink);
|
||||
err = 0;
|
||||
if (devl_is_registered(devlink))
|
||||
|
@ -313,7 +295,6 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net)
|
|||
&actions_performed, NULL);
|
||||
devl_unlock(devlink);
|
||||
devlink_put(devlink);
|
||||
|
||||
if (err && err != -EOPNOTSUPP)
|
||||
pr_warn("Failed to reload devlink instance into init_net\n");
|
||||
}
|
||||
|
|
|
@ -38,7 +38,6 @@ struct devlink {
|
|||
struct list_head trap_policer_list;
|
||||
struct list_head linecard_list;
|
||||
const struct devlink_ops *ops;
|
||||
u64 features;
|
||||
struct xarray snapshot_ids;
|
||||
struct devlink_dev_stats stats;
|
||||
struct device *dev;
|
||||
|
|
|
@ -4230,36 +4230,20 @@ static struct net *devlink_netns_get(struct sk_buff *skb,
|
|||
return net;
|
||||
}
|
||||
|
||||
static void devlink_param_notify(struct devlink *devlink,
|
||||
unsigned int port_index,
|
||||
struct devlink_param_item *param_item,
|
||||
enum devlink_command cmd);
|
||||
|
||||
static void devlink_ns_change_notify(struct devlink *devlink,
|
||||
struct net *dest_net, struct net *curr_net,
|
||||
bool new)
|
||||
static void devlink_reload_netns_change(struct devlink *devlink,
|
||||
struct net *curr_net,
|
||||
struct net *dest_net)
|
||||
{
|
||||
struct devlink_param_item *param_item;
|
||||
enum devlink_command cmd;
|
||||
|
||||
/* Userspace needs to be notified about devlink objects
|
||||
* removed from original and entering new network namespace.
|
||||
* The rest of the devlink objects are re-created during
|
||||
* reload process so the notifications are generated separatelly.
|
||||
*/
|
||||
|
||||
if (!dest_net || net_eq(dest_net, curr_net))
|
||||
return;
|
||||
|
||||
if (new)
|
||||
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);
|
||||
devlink_notify_unregister(devlink);
|
||||
move_netdevice_notifier_net(curr_net, dest_net,
|
||||
&devlink->netdevice_nb);
|
||||
write_pnet(&devlink->_net, dest_net);
|
||||
devlink_notify_register(devlink);
|
||||
}
|
||||
|
||||
static void devlink_reload_failed_set(struct devlink *devlink,
|
||||
|
@ -4341,24 +4325,19 @@ int devlink_reload(struct devlink *devlink, struct net *dest_net,
|
|||
memcpy(remote_reload_stats, devlink->stats.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);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (dest_net && !net_eq(dest_net, curr_net)) {
|
||||
move_netdevice_notifier_net(curr_net, dest_net,
|
||||
&devlink->netdevice_nb);
|
||||
write_pnet(&devlink->_net, dest_net);
|
||||
}
|
||||
curr_net = devlink_net(devlink);
|
||||
if (dest_net && !net_eq(dest_net, curr_net))
|
||||
devlink_reload_netns_change(devlink, curr_net, dest_net);
|
||||
|
||||
err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack);
|
||||
devlink_reload_failed_set(devlink, !!err);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
devlink_ns_change_notify(devlink, dest_net, curr_net, true);
|
||||
WARN_ON(!(*actions_performed & BIT(action)));
|
||||
/* Catch driver on updating the remote action within devlink reload */
|
||||
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)
|
|||
u32 actions_performed;
|
||||
int err;
|
||||
|
||||
if (!(devlink->features & DEVLINK_F_RELOAD))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = devlink_resources_validate(devlink, NULL, info);
|
||||
if (err) {
|
||||
NL_SET_ERR_MSG_MOD(info->extack, "resources size validation failed");
|
||||
|
|
Loading…
Reference in a new issue