Commit 1c5cc012 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'devlink-linecard-and-reporters-locking-cleanup'

Jiri Pirko says:

====================
devlink: linecard and reporters locking cleanup

This patchset does not change functionality.

Patches 1-2 remove linecards lock and reference counting, converting
them to be protected by devlink instance lock as the rest of
the objects.

Patches 3-4 fix the mlx5 auxiliary device devlink locking scheme whis is
needed for proper reporters lock conversion done in the following
patches.

Patches 5-8 remove reporters locks and reference counting, converting
them to be protected by devlink instance lock as the rest of
the objects.

Patches 9 and 10 convert linecards and reporters dumpit callbacks to
recently introduced devlink_nl_instance_iter_dump() infra.

Patch 11 removes no longer needed devlink_dump_for_each_instance_get()
helper.

The last patch adds assertion to devl_is_registered() as dependency on
other locks is removed.
====================

Link: https://lore.kernel.org/r/20230118152115.1113149-1-jiri@resnulli.usSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 854617f5 63ba54a5
...@@ -349,7 +349,6 @@ int mlx5_attach_device(struct mlx5_core_dev *dev) ...@@ -349,7 +349,6 @@ int mlx5_attach_device(struct mlx5_core_dev *dev)
devl_assert_locked(priv_to_devlink(dev)); devl_assert_locked(priv_to_devlink(dev));
mutex_lock(&mlx5_intf_mutex); mutex_lock(&mlx5_intf_mutex);
priv->flags &= ~MLX5_PRIV_FLAGS_DETACH; priv->flags &= ~MLX5_PRIV_FLAGS_DETACH;
priv->flags |= MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW;
for (i = 0; i < ARRAY_SIZE(mlx5_adev_devices); i++) { for (i = 0; i < ARRAY_SIZE(mlx5_adev_devices); i++) {
if (!priv->adev[i]) { if (!priv->adev[i]) {
bool is_supported = false; bool is_supported = false;
...@@ -397,7 +396,6 @@ int mlx5_attach_device(struct mlx5_core_dev *dev) ...@@ -397,7 +396,6 @@ int mlx5_attach_device(struct mlx5_core_dev *dev)
break; break;
} }
} }
priv->flags &= ~MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW;
mutex_unlock(&mlx5_intf_mutex); mutex_unlock(&mlx5_intf_mutex);
return ret; return ret;
} }
...@@ -412,7 +410,6 @@ void mlx5_detach_device(struct mlx5_core_dev *dev) ...@@ -412,7 +410,6 @@ void mlx5_detach_device(struct mlx5_core_dev *dev)
devl_assert_locked(priv_to_devlink(dev)); devl_assert_locked(priv_to_devlink(dev));
mutex_lock(&mlx5_intf_mutex); mutex_lock(&mlx5_intf_mutex);
priv->flags |= MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW;
for (i = ARRAY_SIZE(mlx5_adev_devices) - 1; i >= 0; i--) { for (i = ARRAY_SIZE(mlx5_adev_devices) - 1; i >= 0; i--) {
if (!priv->adev[i]) if (!priv->adev[i])
continue; continue;
...@@ -441,7 +438,6 @@ void mlx5_detach_device(struct mlx5_core_dev *dev) ...@@ -441,7 +438,6 @@ void mlx5_detach_device(struct mlx5_core_dev *dev)
del_adev(&priv->adev[i]->adev); del_adev(&priv->adev[i]->adev);
priv->adev[i] = NULL; priv->adev[i] = NULL;
} }
priv->flags &= ~MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW;
priv->flags |= MLX5_PRIV_FLAGS_DETACH; priv->flags |= MLX5_PRIV_FLAGS_DETACH;
mutex_unlock(&mlx5_intf_mutex); mutex_unlock(&mlx5_intf_mutex);
} }
...@@ -540,22 +536,16 @@ static void delete_drivers(struct mlx5_core_dev *dev) ...@@ -540,22 +536,16 @@ static void delete_drivers(struct mlx5_core_dev *dev)
int mlx5_rescan_drivers_locked(struct mlx5_core_dev *dev) int mlx5_rescan_drivers_locked(struct mlx5_core_dev *dev)
{ {
struct mlx5_priv *priv = &dev->priv; struct mlx5_priv *priv = &dev->priv;
int err = 0;
lockdep_assert_held(&mlx5_intf_mutex); lockdep_assert_held(&mlx5_intf_mutex);
if (priv->flags & MLX5_PRIV_FLAGS_DETACH) if (priv->flags & MLX5_PRIV_FLAGS_DETACH)
return 0; return 0;
priv->flags |= MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW;
delete_drivers(dev); delete_drivers(dev);
if (priv->flags & MLX5_PRIV_FLAGS_DISABLE_ALL_ADEV) if (priv->flags & MLX5_PRIV_FLAGS_DISABLE_ALL_ADEV)
goto out; return 0;
err = add_drivers(dev);
out: return add_drivers(dev);
priv->flags &= ~MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW;
return err;
} }
bool mlx5_same_hw_devs(struct mlx5_core_dev *dev, struct mlx5_core_dev *peer_dev) bool mlx5_same_hw_devs(struct mlx5_core_dev *dev, struct mlx5_core_dev *peer_dev)
......
...@@ -971,6 +971,10 @@ struct mlx5e_priv { ...@@ -971,6 +971,10 @@ struct mlx5e_priv {
struct dentry *dfs_root; struct dentry *dfs_root;
}; };
struct mlx5e_dev {
struct mlx5e_priv *priv;
};
struct mlx5e_rx_handlers { struct mlx5e_rx_handlers {
mlx5e_fp_handle_rx_cqe handle_rx_cqe; mlx5e_fp_handle_rx_cqe handle_rx_cqe;
mlx5e_fp_handle_rx_cqe handle_rx_cqe_mpwqe; mlx5e_fp_handle_rx_cqe handle_rx_cqe_mpwqe;
......
...@@ -4,6 +4,29 @@ ...@@ -4,6 +4,29 @@
#include "en/devlink.h" #include "en/devlink.h"
#include "eswitch.h" #include "eswitch.h"
static const struct devlink_ops mlx5e_devlink_ops = {
};
struct mlx5e_dev *mlx5e_create_devlink(struct device *dev)
{
struct mlx5e_dev *mlx5e_dev;
struct devlink *devlink;
devlink = devlink_alloc(&mlx5e_devlink_ops, sizeof(*mlx5e_dev), dev);
if (!devlink)
return ERR_PTR(-ENOMEM);
devlink_register(devlink);
return devlink_priv(devlink);
}
void mlx5e_destroy_devlink(struct mlx5e_dev *mlx5e_dev)
{
struct devlink *devlink = priv_to_devlink(mlx5e_dev);
devlink_unregister(devlink);
devlink_free(devlink);
}
static void static void
mlx5e_devlink_get_port_parent_id(struct mlx5_core_dev *dev, struct netdev_phys_item_id *ppid) mlx5e_devlink_get_port_parent_id(struct mlx5_core_dev *dev, struct netdev_phys_item_id *ppid)
{ {
...@@ -14,14 +37,14 @@ mlx5e_devlink_get_port_parent_id(struct mlx5_core_dev *dev, struct netdev_phys_i ...@@ -14,14 +37,14 @@ mlx5e_devlink_get_port_parent_id(struct mlx5_core_dev *dev, struct netdev_phys_i
memcpy(ppid->id, &parent_id, sizeof(parent_id)); memcpy(ppid->id, &parent_id, sizeof(parent_id));
} }
int mlx5e_devlink_port_register(struct mlx5e_priv *priv) int mlx5e_devlink_port_register(struct mlx5e_dev *mlx5e_dev,
struct mlx5e_priv *priv)
{ {
struct devlink *devlink = priv_to_devlink(priv->mdev); struct devlink *devlink = priv_to_devlink(mlx5e_dev);
struct devlink_port_attrs attrs = {}; struct devlink_port_attrs attrs = {};
struct netdev_phys_item_id ppid = {}; struct netdev_phys_item_id ppid = {};
struct devlink_port *dl_port; struct devlink_port *dl_port;
unsigned int dl_port_index; unsigned int dl_port_index;
int ret;
if (mlx5_core_is_pf(priv->mdev)) { if (mlx5_core_is_pf(priv->mdev)) {
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL; attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
...@@ -42,23 +65,12 @@ int mlx5e_devlink_port_register(struct mlx5e_priv *priv) ...@@ -42,23 +65,12 @@ int mlx5e_devlink_port_register(struct mlx5e_priv *priv)
memset(dl_port, 0, sizeof(*dl_port)); memset(dl_port, 0, sizeof(*dl_port));
devlink_port_attrs_set(dl_port, &attrs); devlink_port_attrs_set(dl_port, &attrs);
if (!(priv->mdev->priv.flags & MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW)) return devlink_port_register(devlink, dl_port, dl_port_index);
devl_lock(devlink);
ret = devl_port_register(devlink, dl_port, dl_port_index);
if (!(priv->mdev->priv.flags & MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW))
devl_unlock(devlink);
return ret;
} }
void mlx5e_devlink_port_unregister(struct mlx5e_priv *priv) void mlx5e_devlink_port_unregister(struct mlx5e_priv *priv)
{ {
struct devlink_port *dl_port = mlx5e_devlink_get_dl_port(priv); struct devlink_port *dl_port = mlx5e_devlink_get_dl_port(priv);
struct devlink *devlink = priv_to_devlink(priv->mdev);
if (!(priv->mdev->priv.flags & MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW)) devlink_port_unregister(dl_port);
devl_lock(devlink);
devl_port_unregister(dl_port);
if (!(priv->mdev->priv.flags & MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW))
devl_unlock(devlink);
} }
...@@ -7,7 +7,10 @@ ...@@ -7,7 +7,10 @@
#include <net/devlink.h> #include <net/devlink.h>
#include "en.h" #include "en.h"
int mlx5e_devlink_port_register(struct mlx5e_priv *priv); struct mlx5e_dev *mlx5e_create_devlink(struct device *dev);
void mlx5e_destroy_devlink(struct mlx5e_dev *mlx5e_dev);
int mlx5e_devlink_port_register(struct mlx5e_dev *mlx5e_dev,
struct mlx5e_priv *priv);
void mlx5e_devlink_port_unregister(struct mlx5e_priv *priv); void mlx5e_devlink_port_unregister(struct mlx5e_priv *priv);
static inline struct devlink_port * static inline struct devlink_port *
......
...@@ -754,6 +754,6 @@ void mlx5e_reporter_rx_destroy(struct mlx5e_priv *priv) ...@@ -754,6 +754,6 @@ void mlx5e_reporter_rx_destroy(struct mlx5e_priv *priv)
if (!priv->rx_reporter) if (!priv->rx_reporter)
return; return;
devlink_port_health_reporter_destroy(priv->rx_reporter); devlink_health_reporter_destroy(priv->rx_reporter);
priv->rx_reporter = NULL; priv->rx_reporter = NULL;
} }
...@@ -609,6 +609,6 @@ void mlx5e_reporter_tx_destroy(struct mlx5e_priv *priv) ...@@ -609,6 +609,6 @@ void mlx5e_reporter_tx_destroy(struct mlx5e_priv *priv)
if (!priv->tx_reporter) if (!priv->tx_reporter)
return; return;
devlink_port_health_reporter_destroy(priv->tx_reporter); devlink_health_reporter_destroy(priv->tx_reporter);
priv->tx_reporter = NULL; priv->tx_reporter = NULL;
} }
...@@ -5876,7 +5876,8 @@ void mlx5e_destroy_netdev(struct mlx5e_priv *priv) ...@@ -5876,7 +5876,8 @@ void mlx5e_destroy_netdev(struct mlx5e_priv *priv)
static int mlx5e_resume(struct auxiliary_device *adev) static int mlx5e_resume(struct auxiliary_device *adev)
{ {
struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev); struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);
struct mlx5e_priv *priv = auxiliary_get_drvdata(adev); struct mlx5e_dev *mlx5e_dev = auxiliary_get_drvdata(adev);
struct mlx5e_priv *priv = mlx5e_dev->priv;
struct net_device *netdev = priv->netdev; struct net_device *netdev = priv->netdev;
struct mlx5_core_dev *mdev = edev->mdev; struct mlx5_core_dev *mdev = edev->mdev;
int err; int err;
...@@ -5899,7 +5900,8 @@ static int mlx5e_resume(struct auxiliary_device *adev) ...@@ -5899,7 +5900,8 @@ static int mlx5e_resume(struct auxiliary_device *adev)
static int mlx5e_suspend(struct auxiliary_device *adev, pm_message_t state) static int mlx5e_suspend(struct auxiliary_device *adev, pm_message_t state)
{ {
struct mlx5e_priv *priv = auxiliary_get_drvdata(adev); struct mlx5e_dev *mlx5e_dev = auxiliary_get_drvdata(adev);
struct mlx5e_priv *priv = mlx5e_dev->priv;
struct net_device *netdev = priv->netdev; struct net_device *netdev = priv->netdev;
struct mlx5_core_dev *mdev = priv->mdev; struct mlx5_core_dev *mdev = priv->mdev;
...@@ -5917,21 +5919,28 @@ static int mlx5e_probe(struct auxiliary_device *adev, ...@@ -5917,21 +5919,28 @@ static int mlx5e_probe(struct auxiliary_device *adev,
struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev); struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);
const struct mlx5e_profile *profile = &mlx5e_nic_profile; const struct mlx5e_profile *profile = &mlx5e_nic_profile;
struct mlx5_core_dev *mdev = edev->mdev; struct mlx5_core_dev *mdev = edev->mdev;
struct mlx5e_dev *mlx5e_dev;
struct net_device *netdev; struct net_device *netdev;
pm_message_t state = {}; pm_message_t state = {};
struct mlx5e_priv *priv; struct mlx5e_priv *priv;
int err; int err;
mlx5e_dev = mlx5e_create_devlink(&adev->dev);
if (IS_ERR(mlx5e_dev))
return PTR_ERR(mlx5e_dev);
auxiliary_set_drvdata(adev, mlx5e_dev);
netdev = mlx5e_create_netdev(mdev, profile); netdev = mlx5e_create_netdev(mdev, profile);
if (!netdev) { if (!netdev) {
mlx5_core_err(mdev, "mlx5e_create_netdev failed\n"); mlx5_core_err(mdev, "mlx5e_create_netdev failed\n");
return -ENOMEM; err = -ENOMEM;
goto err_devlink_unregister;
} }
mlx5e_build_nic_netdev(netdev); mlx5e_build_nic_netdev(netdev);
priv = netdev_priv(netdev); priv = netdev_priv(netdev);
auxiliary_set_drvdata(adev, priv); mlx5e_dev->priv = priv;
priv->profile = profile; priv->profile = profile;
priv->ppriv = NULL; priv->ppriv = NULL;
...@@ -5939,7 +5948,7 @@ static int mlx5e_probe(struct auxiliary_device *adev, ...@@ -5939,7 +5948,7 @@ static int mlx5e_probe(struct auxiliary_device *adev,
priv->dfs_root = debugfs_create_dir("nic", priv->dfs_root = debugfs_create_dir("nic",
mlx5_debugfs_get_dev_root(priv->mdev)); mlx5_debugfs_get_dev_root(priv->mdev));
err = mlx5e_devlink_port_register(priv); err = mlx5e_devlink_port_register(mlx5e_dev, priv);
if (err) { if (err) {
mlx5_core_err(mdev, "mlx5e_devlink_port_register failed, %d\n", err); mlx5_core_err(mdev, "mlx5e_devlink_port_register failed, %d\n", err);
goto err_destroy_netdev; goto err_destroy_netdev;
...@@ -5978,12 +5987,15 @@ static int mlx5e_probe(struct auxiliary_device *adev, ...@@ -5978,12 +5987,15 @@ static int mlx5e_probe(struct auxiliary_device *adev,
err_destroy_netdev: err_destroy_netdev:
debugfs_remove_recursive(priv->dfs_root); debugfs_remove_recursive(priv->dfs_root);
mlx5e_destroy_netdev(priv); mlx5e_destroy_netdev(priv);
err_devlink_unregister:
mlx5e_destroy_devlink(mlx5e_dev);
return err; return err;
} }
static void mlx5e_remove(struct auxiliary_device *adev) static void mlx5e_remove(struct auxiliary_device *adev)
{ {
struct mlx5e_priv *priv = auxiliary_get_drvdata(adev); struct mlx5e_dev *mlx5e_dev = auxiliary_get_drvdata(adev);
struct mlx5e_priv *priv = mlx5e_dev->priv;
pm_message_t state = {}; pm_message_t state = {};
mlx5e_dcbnl_delete_app(priv); mlx5e_dcbnl_delete_app(priv);
...@@ -5993,6 +6005,7 @@ static void mlx5e_remove(struct auxiliary_device *adev) ...@@ -5993,6 +6005,7 @@ static void mlx5e_remove(struct auxiliary_device *adev)
mlx5e_devlink_port_unregister(priv); mlx5e_devlink_port_unregister(priv);
debugfs_remove_recursive(priv->dfs_root); debugfs_remove_recursive(priv->dfs_root);
mlx5e_destroy_netdev(priv); mlx5e_destroy_netdev(priv);
mlx5e_destroy_devlink(mlx5e_dev);
} }
static const struct auxiliary_device_id mlx5e_id_table[] = { static const struct auxiliary_device_id mlx5e_id_table[] = {
......
...@@ -2051,7 +2051,7 @@ static int mlxsw_core_health_init(struct mlxsw_core *mlxsw_core) ...@@ -2051,7 +2051,7 @@ static int mlxsw_core_health_init(struct mlxsw_core *mlxsw_core)
if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX)) if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX))
return 0; return 0;
fw_fatal = devlink_health_reporter_create(devlink, &mlxsw_core_health_fw_fatal_ops, fw_fatal = devl_health_reporter_create(devlink, &mlxsw_core_health_fw_fatal_ops,
0, mlxsw_core); 0, mlxsw_core);
if (IS_ERR(fw_fatal)) { if (IS_ERR(fw_fatal)) {
dev_err(mlxsw_core->bus_info->dev, "Failed to create fw fatal reporter"); dev_err(mlxsw_core->bus_info->dev, "Failed to create fw fatal reporter");
...@@ -2072,7 +2072,7 @@ static int mlxsw_core_health_init(struct mlxsw_core *mlxsw_core) ...@@ -2072,7 +2072,7 @@ static int mlxsw_core_health_init(struct mlxsw_core *mlxsw_core)
err_fw_fatal_config: err_fw_fatal_config:
mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_core_health_listener, mlxsw_core); mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_core_health_listener, mlxsw_core);
err_trap_register: err_trap_register:
devlink_health_reporter_destroy(mlxsw_core->health.fw_fatal); devl_health_reporter_destroy(mlxsw_core->health.fw_fatal);
return err; return err;
} }
...@@ -2085,7 +2085,7 @@ static void mlxsw_core_health_fini(struct mlxsw_core *mlxsw_core) ...@@ -2085,7 +2085,7 @@ static void mlxsw_core_health_fini(struct mlxsw_core *mlxsw_core)
mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_core_health_listener, mlxsw_core); mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_core_health_listener, mlxsw_core);
/* Make sure there is no more event work scheduled */ /* Make sure there is no more event work scheduled */
mlxsw_core_flush_owq(); mlxsw_core_flush_owq();
devlink_health_reporter_destroy(mlxsw_core->health.fw_fatal); devl_health_reporter_destroy(mlxsw_core->health.fw_fatal);
} }
static void mlxsw_core_irq_event_handler_init(struct mlxsw_core *mlxsw_core) static void mlxsw_core_irq_event_handler_init(struct mlxsw_core *mlxsw_core)
......
...@@ -1259,7 +1259,7 @@ static int mlxsw_linecard_init(struct mlxsw_core *mlxsw_core, ...@@ -1259,7 +1259,7 @@ static int mlxsw_linecard_init(struct mlxsw_core *mlxsw_core,
linecard->linecards = linecards; linecard->linecards = linecards;
mutex_init(&linecard->lock); mutex_init(&linecard->lock);
devlink_linecard = devlink_linecard_create(priv_to_devlink(mlxsw_core), devlink_linecard = devl_linecard_create(priv_to_devlink(mlxsw_core),
slot_index, &mlxsw_linecard_ops, slot_index, &mlxsw_linecard_ops,
linecard); linecard);
if (IS_ERR(devlink_linecard)) if (IS_ERR(devlink_linecard))
...@@ -1285,7 +1285,7 @@ static void mlxsw_linecard_fini(struct mlxsw_core *mlxsw_core, ...@@ -1285,7 +1285,7 @@ static void mlxsw_linecard_fini(struct mlxsw_core *mlxsw_core,
if (linecard->active) if (linecard->active)
mlxsw_linecard_active_clear(linecard); mlxsw_linecard_active_clear(linecard);
mlxsw_linecard_bdev_del(linecard); mlxsw_linecard_bdev_del(linecard);
devlink_linecard_destroy(linecard->devlink_linecard); devl_linecard_destroy(linecard->devlink_linecard);
mutex_destroy(&linecard->lock); mutex_destroy(&linecard->lock);
} }
......
...@@ -233,14 +233,14 @@ int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink) ...@@ -233,14 +233,14 @@ int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink)
int err; int err;
health->empty_reporter = health->empty_reporter =
devlink_health_reporter_create(devlink, devl_health_reporter_create(devlink,
&nsim_dev_empty_reporter_ops, &nsim_dev_empty_reporter_ops,
0, health); 0, health);
if (IS_ERR(health->empty_reporter)) if (IS_ERR(health->empty_reporter))
return PTR_ERR(health->empty_reporter); return PTR_ERR(health->empty_reporter);
health->dummy_reporter = health->dummy_reporter =
devlink_health_reporter_create(devlink, devl_health_reporter_create(devlink,
&nsim_dev_dummy_reporter_ops, &nsim_dev_dummy_reporter_ops,
0, health); 0, health);
if (IS_ERR(health->dummy_reporter)) { if (IS_ERR(health->dummy_reporter)) {
...@@ -266,9 +266,9 @@ int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink) ...@@ -266,9 +266,9 @@ int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink)
return 0; return 0;
err_dummy_reporter_destroy: err_dummy_reporter_destroy:
devlink_health_reporter_destroy(health->dummy_reporter); devl_health_reporter_destroy(health->dummy_reporter);
err_empty_reporter_destroy: err_empty_reporter_destroy:
devlink_health_reporter_destroy(health->empty_reporter); devl_health_reporter_destroy(health->empty_reporter);
return err; return err;
} }
...@@ -278,6 +278,6 @@ void nsim_dev_health_exit(struct nsim_dev *nsim_dev) ...@@ -278,6 +278,6 @@ void nsim_dev_health_exit(struct nsim_dev *nsim_dev)
debugfs_remove_recursive(health->ddir); debugfs_remove_recursive(health->ddir);
kfree(health->recovered_break_msg); kfree(health->recovered_break_msg);
devlink_health_reporter_destroy(health->dummy_reporter); devl_health_reporter_destroy(health->dummy_reporter);
devlink_health_reporter_destroy(health->empty_reporter); devl_health_reporter_destroy(health->empty_reporter);
} }
...@@ -554,10 +554,6 @@ enum { ...@@ -554,10 +554,6 @@ enum {
* creation/deletion on drivers rescan. Unset during device attach. * creation/deletion on drivers rescan. Unset during device attach.
*/ */
MLX5_PRIV_FLAGS_DETACH = 1 << 2, MLX5_PRIV_FLAGS_DETACH = 1 << 2,
/* Distinguish between mlx5e_probe/remove called by module init/cleanup
* and called by other flows which can already hold devlink lock
*/
MLX5_PRIV_FLAGS_MLX5E_LOCKED_FLOW = 1 << 3,
}; };
struct mlx5_adev { struct mlx5_adev {
......
...@@ -146,7 +146,6 @@ struct devlink_port { ...@@ -146,7 +146,6 @@ struct devlink_port {
initialized:1; initialized:1;
struct delayed_work type_warn_dw; struct delayed_work type_warn_dw;
struct list_head reporter_list; struct list_head reporter_list;
struct mutex reporters_lock; /* Protects reporter_list */
struct devlink_rate *devlink_rate; struct devlink_rate *devlink_rate;
struct devlink_linecard *linecard; struct devlink_linecard *linecard;
...@@ -1687,9 +1686,9 @@ void devl_rate_nodes_destroy(struct devlink *devlink); ...@@ -1687,9 +1686,9 @@ void devl_rate_nodes_destroy(struct devlink *devlink);
void devlink_port_linecard_set(struct devlink_port *devlink_port, void devlink_port_linecard_set(struct devlink_port *devlink_port,
struct devlink_linecard *linecard); struct devlink_linecard *linecard);
struct devlink_linecard * struct devlink_linecard *
devlink_linecard_create(struct devlink *devlink, unsigned int linecard_index, devl_linecard_create(struct devlink *devlink, unsigned int linecard_index,
const struct devlink_linecard_ops *ops, void *priv); const struct devlink_linecard_ops *ops, void *priv);
void devlink_linecard_destroy(struct devlink_linecard *linecard); void devl_linecard_destroy(struct devlink_linecard *linecard);
void devlink_linecard_provision_set(struct devlink_linecard *linecard, void devlink_linecard_provision_set(struct devlink_linecard *linecard,
const char *type); const char *type);
void devlink_linecard_provision_clear(struct devlink_linecard *linecard); void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
...@@ -1865,7 +1864,7 @@ int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name, ...@@ -1865,7 +1864,7 @@ int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name,
const void *value, u32 value_len); const void *value, u32 value_len);
struct devlink_health_reporter * struct devlink_health_reporter *
devlink_health_reporter_create(struct devlink *devlink, devl_port_health_reporter_create(struct devlink_port *port,
const struct devlink_health_reporter_ops *ops, const struct devlink_health_reporter_ops *ops,
u64 graceful_period, void *priv); u64 graceful_period, void *priv);
...@@ -1874,11 +1873,21 @@ devlink_port_health_reporter_create(struct devlink_port *port, ...@@ -1874,11 +1873,21 @@ devlink_port_health_reporter_create(struct devlink_port *port,
const struct devlink_health_reporter_ops *ops, const struct devlink_health_reporter_ops *ops,
u64 graceful_period, void *priv); u64 graceful_period, void *priv);
struct devlink_health_reporter *
devl_health_reporter_create(struct devlink *devlink,
const struct devlink_health_reporter_ops *ops,
u64 graceful_period, void *priv);
struct devlink_health_reporter *
devlink_health_reporter_create(struct devlink *devlink,
const struct devlink_health_reporter_ops *ops,
u64 graceful_period, void *priv);
void void
devlink_health_reporter_destroy(struct devlink_health_reporter *reporter); devl_health_reporter_destroy(struct devlink_health_reporter *reporter);
void void
devlink_port_health_reporter_destroy(struct devlink_health_reporter *reporter); devlink_health_reporter_destroy(struct devlink_health_reporter *reporter);
void * void *
devlink_health_reporter_priv(struct devlink_health_reporter *reporter); devlink_health_reporter_priv(struct devlink_health_reporter *reporter);
......
...@@ -246,8 +246,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops, ...@@ -246,8 +246,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
lockdep_register_key(&devlink->lock_key); lockdep_register_key(&devlink->lock_key);
mutex_init(&devlink->lock); mutex_init(&devlink->lock);
lockdep_set_class(&devlink->lock, &devlink->lock_key); lockdep_set_class(&devlink->lock, &devlink->lock_key);
mutex_init(&devlink->reporters_lock);
mutex_init(&devlink->linecards_lock);
refcount_set(&devlink->refcount, 1); refcount_set(&devlink->refcount, 1);
return devlink; return devlink;
...@@ -269,8 +267,6 @@ void devlink_free(struct devlink *devlink) ...@@ -269,8 +267,6 @@ void devlink_free(struct devlink *devlink)
{ {
ASSERT_DEVLINK_NOT_REGISTERED(devlink); ASSERT_DEVLINK_NOT_REGISTERED(devlink);
mutex_destroy(&devlink->linecards_lock);
mutex_destroy(&devlink->reporters_lock);
WARN_ON(!list_empty(&devlink->trap_policer_list)); WARN_ON(!list_empty(&devlink->trap_policer_list));
WARN_ON(!list_empty(&devlink->trap_group_list)); WARN_ON(!list_empty(&devlink->trap_group_list));
WARN_ON(!list_empty(&devlink->trap_list)); WARN_ON(!list_empty(&devlink->trap_list));
......
...@@ -32,13 +32,11 @@ struct devlink { ...@@ -32,13 +32,11 @@ struct devlink {
struct list_head param_list; struct list_head param_list;
struct list_head region_list; struct list_head region_list;
struct list_head reporter_list; struct list_head reporter_list;
struct mutex reporters_lock; /* protects reporter_list */
struct devlink_dpipe_headers *dpipe_headers; struct devlink_dpipe_headers *dpipe_headers;
struct list_head trap_list; struct list_head trap_list;
struct list_head trap_group_list; struct list_head trap_group_list;
struct list_head trap_policer_list; struct list_head trap_policer_list;
struct list_head linecard_list; struct list_head linecard_list;
struct mutex linecards_lock; /* protects linecard_list */
const struct devlink_ops *ops; const struct devlink_ops *ops;
u64 features; u64 features;
struct xarray snapshot_ids; struct xarray snapshot_ids;
...@@ -87,9 +85,7 @@ struct devlink *devlinks_xa_find_get(struct net *net, unsigned long *indexp); ...@@ -87,9 +85,7 @@ struct devlink *devlinks_xa_find_get(struct net *net, unsigned long *indexp);
static inline bool devl_is_registered(struct devlink *devlink) static inline bool devl_is_registered(struct devlink *devlink)
{ {
/* To prevent races the caller must hold the instance lock devl_assert_locked(devlink);
* or another lock taken during unregistration.
*/
return xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); return xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED);
} }
...@@ -125,17 +121,6 @@ struct devlink_gen_cmd { ...@@ -125,17 +121,6 @@ struct devlink_gen_cmd {
struct netlink_callback *cb); struct netlink_callback *cb);
}; };
/* Iterate over registered devlink instances for devlink dump.
* devlink_put() needs to be called for each iterated devlink pointer
* in loop body in order to release the reference.
* Note: this is NOT a generic iterator, it makes assumptions about the use
* of @state and can only be used once per dumpit implementation.
*/
#define devlink_dump_for_each_instance_get(msg, state, devlink) \
for (; (devlink = devlinks_xa_find_get(sock_net(msg->sk), \
&state->instance)); \
state->instance++, state->idx = 0)
extern const struct genl_small_ops devlink_nl_ops[56]; extern const struct genl_small_ops devlink_nl_ops[56];
struct devlink * struct devlink *
...@@ -166,9 +151,11 @@ extern const struct devlink_gen_cmd devl_gen_selftests; ...@@ -166,9 +151,11 @@ extern const struct devlink_gen_cmd devl_gen_selftests;
extern const struct devlink_gen_cmd devl_gen_param; extern const struct devlink_gen_cmd devl_gen_param;
extern const struct devlink_gen_cmd devl_gen_region; extern const struct devlink_gen_cmd devl_gen_region;
extern const struct devlink_gen_cmd devl_gen_info; extern const struct devlink_gen_cmd devl_gen_info;
extern const struct devlink_gen_cmd devl_gen_health_reporter;
extern const struct devlink_gen_cmd devl_gen_trap; extern const struct devlink_gen_cmd devl_gen_trap;
extern const struct devlink_gen_cmd devl_gen_trap_group; extern const struct devlink_gen_cmd devl_gen_trap_group;
extern const struct devlink_gen_cmd devl_gen_trap_policer; extern const struct devlink_gen_cmd devl_gen_trap_policer;
extern const struct devlink_gen_cmd devl_gen_linecard;
/* Ports */ /* Ports */
int devlink_port_netdevice_event(struct notifier_block *nb, int devlink_port_netdevice_event(struct notifier_block *nb,
...@@ -194,7 +181,6 @@ struct devlink_linecard; ...@@ -194,7 +181,6 @@ struct devlink_linecard;
struct devlink_linecard * struct devlink_linecard *
devlink_linecard_get_from_info(struct devlink *devlink, struct genl_info *info); devlink_linecard_get_from_info(struct devlink *devlink, struct genl_info *info);
void devlink_linecard_put(struct devlink_linecard *linecard);
/* Rates */ /* Rates */
extern const struct devlink_gen_cmd devl_gen_rate_get; extern const struct devlink_gen_cmd devl_gen_rate_get;
......
This diff is collapsed.
...@@ -170,14 +170,9 @@ static int devlink_nl_pre_doit(const struct genl_split_ops *ops, ...@@ -170,14 +170,9 @@ static int devlink_nl_pre_doit(const struct genl_split_ops *ops,
static void devlink_nl_post_doit(const struct genl_split_ops *ops, static void devlink_nl_post_doit(const struct genl_split_ops *ops,
struct sk_buff *skb, struct genl_info *info) struct sk_buff *skb, struct genl_info *info)
{ {
struct devlink_linecard *linecard;
struct devlink *devlink; struct devlink *devlink;
devlink = info->user_ptr[0]; devlink = info->user_ptr[0];
if (ops->internal_flags & DEVLINK_NL_FLAG_NEED_LINECARD) {
linecard = info->user_ptr[1];
devlink_linecard_put(linecard);
}
devl_unlock(devlink); devl_unlock(devlink);
devlink_put(devlink); devlink_put(devlink);
} }
...@@ -192,10 +187,12 @@ static const struct devlink_gen_cmd *devl_gen_cmds[] = { ...@@ -192,10 +187,12 @@ static const struct devlink_gen_cmd *devl_gen_cmds[] = {
[DEVLINK_CMD_PARAM_GET] = &devl_gen_param, [DEVLINK_CMD_PARAM_GET] = &devl_gen_param,
[DEVLINK_CMD_REGION_GET] = &devl_gen_region, [DEVLINK_CMD_REGION_GET] = &devl_gen_region,
[DEVLINK_CMD_INFO_GET] = &devl_gen_info, [DEVLINK_CMD_INFO_GET] = &devl_gen_info,
[DEVLINK_CMD_HEALTH_REPORTER_GET] = &devl_gen_health_reporter,
[DEVLINK_CMD_RATE_GET] = &devl_gen_rate_get, [DEVLINK_CMD_RATE_GET] = &devl_gen_rate_get,
[DEVLINK_CMD_TRAP_GET] = &devl_gen_trap, [DEVLINK_CMD_TRAP_GET] = &devl_gen_trap,
[DEVLINK_CMD_TRAP_GROUP_GET] = &devl_gen_trap_group, [DEVLINK_CMD_TRAP_GROUP_GET] = &devl_gen_trap_group,
[DEVLINK_CMD_TRAP_POLICER_GET] = &devl_gen_trap_policer, [DEVLINK_CMD_TRAP_POLICER_GET] = &devl_gen_trap_policer,
[DEVLINK_CMD_LINECARD_GET] = &devl_gen_linecard,
[DEVLINK_CMD_SELFTESTS_GET] = &devl_gen_selftests, [DEVLINK_CMD_SELFTESTS_GET] = &devl_gen_selftests,
}; };
...@@ -210,7 +207,8 @@ int devlink_nl_instance_iter_dump(struct sk_buff *msg, ...@@ -210,7 +207,8 @@ int devlink_nl_instance_iter_dump(struct sk_buff *msg,
cmd = devl_gen_cmds[info->op.cmd]; cmd = devl_gen_cmds[info->op.cmd];
devlink_dump_for_each_instance_get(msg, state, devlink) { while ((devlink = devlinks_xa_find_get(sock_net(msg->sk),
&state->instance))) {
devl_lock(devlink); devl_lock(devlink);
if (devl_is_registered(devlink)) if (devl_is_registered(devlink))
...@@ -224,6 +222,8 @@ int devlink_nl_instance_iter_dump(struct sk_buff *msg, ...@@ -224,6 +222,8 @@ int devlink_nl_instance_iter_dump(struct sk_buff *msg,
if (err) if (err)
break; break;
state->instance++;
/* restart sub-object walk for the next instance */ /* restart sub-object walk for the next instance */
state->idx = 0; state->idx = 0;
} }
......
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