Commit 075935f0 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

devlink: protect devlink param list by instance lock



Commit 1d18bb1a ("devlink: allow registering parameters after
the instance") as the subject implies introduced possibility to register
devlink params even for already registered devlink instance. This is a
bit problematic, as the consistency or params list was originally
secured by the fact it is static during devlink lifetime. So in order to
protect the params list, take devlink instance lock during the params
operations. Introduce unlocked function variants and use them in drivers
in locked context. Put lock assertions to appropriate places.

Signed-off-by: default avatarJiri Pirko <jiri@nvidia.com>
Reviewed-by: default avatarJakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
Tested-by: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3f716a62
Loading
Loading
Loading
Loading
+40 −40
Original line number Diff line number Diff line
@@ -265,27 +265,27 @@ static void mlx4_devlink_set_params_init_values(struct devlink *devlink)
	union devlink_param_value value;

	value.vbool = !!mlx4_internal_err_reset;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
					value);

	value.vu32 = 1UL << log_num_mac;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
					value);

	value.vbool = enable_64b_cqe_eqe;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					MLX4_DEVLINK_PARAM_ID_ENABLE_64B_CQE_EQE,
					value);

	value.vbool = enable_4k_uar;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					MLX4_DEVLINK_PARAM_ID_ENABLE_4K_UAR,
					value);

	value.vbool = false;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT,
					value);
}
@@ -3910,36 +3910,36 @@ static void mlx4_devlink_param_load_driverinit_values(struct devlink *devlink)
	union devlink_param_value saved_value;
	int err;

	err = devlink_param_driverinit_value_get(devlink,
	err = devl_param_driverinit_value_get(devlink,
					      DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
					      &saved_value);
	if (!err && mlx4_internal_err_reset != saved_value.vbool) {
		mlx4_internal_err_reset = saved_value.vbool;
		/* Notify on value changed on runtime configuration mode */
		devlink_param_value_changed(devlink,
		devl_param_value_changed(devlink,
					 DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET);
	}
	err = devlink_param_driverinit_value_get(devlink,
	err = devl_param_driverinit_value_get(devlink,
					      DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
					      &saved_value);
	if (!err)
		log_num_mac = order_base_2(saved_value.vu32);
	err = devlink_param_driverinit_value_get(devlink,
	err = devl_param_driverinit_value_get(devlink,
					      MLX4_DEVLINK_PARAM_ID_ENABLE_64B_CQE_EQE,
					      &saved_value);
	if (!err)
		enable_64b_cqe_eqe = saved_value.vbool;
	err = devlink_param_driverinit_value_get(devlink,
	err = devl_param_driverinit_value_get(devlink,
					      MLX4_DEVLINK_PARAM_ID_ENABLE_4K_UAR,
					      &saved_value);
	if (!err)
		enable_4k_uar = saved_value.vbool;
	err = devlink_param_driverinit_value_get(devlink,
	err = devl_param_driverinit_value_get(devlink,
					      DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT,
					      &saved_value);
	if (!err && crdump->snapshot_enable != saved_value.vbool) {
		crdump->snapshot_enable = saved_value.vbool;
		devlink_param_value_changed(devlink,
		devl_param_value_changed(devlink,
					 DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT);
	}
}
@@ -4021,7 +4021,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
	mutex_init(&dev->persist->interface_state_mutex);
	mutex_init(&dev->persist->pci_status_mutex);

	ret = devlink_params_register(devlink, mlx4_devlink_params,
	ret = devl_params_register(devlink, mlx4_devlink_params,
				   ARRAY_SIZE(mlx4_devlink_params));
	if (ret)
		goto err_devlink_unregister;
@@ -4037,7 +4037,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
	return 0;

err_params_unregister:
	devlink_params_unregister(devlink, mlx4_devlink_params,
	devl_params_unregister(devlink, mlx4_devlink_params,
			       ARRAY_SIZE(mlx4_devlink_params));
err_devlink_unregister:
	kfree(dev->persist);
@@ -4181,7 +4181,7 @@ static void mlx4_remove_one(struct pci_dev *pdev)

	pci_release_regions(pdev);
	mlx4_pci_disable_device(dev);
	devlink_params_unregister(devlink, mlx4_devlink_params,
	devl_params_unregister(devlink, mlx4_devlink_params,
			       ARRAY_SIZE(mlx4_devlink_params));
	kfree(dev->persist);
	devl_unlock(devlink);
+9 −9
Original line number Diff line number Diff line
@@ -114,7 +114,7 @@ static bool is_eth_enabled(struct mlx5_core_dev *dev)
	union devlink_param_value val;
	int err;

	err = devlink_param_driverinit_value_get(priv_to_devlink(dev),
	err = devl_param_driverinit_value_get(priv_to_devlink(dev),
					      DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH,
					      &val);
	return err ? false : val.vbool;
@@ -147,7 +147,7 @@ static bool is_vnet_enabled(struct mlx5_core_dev *dev)
	union devlink_param_value val;
	int err;

	err = devlink_param_driverinit_value_get(priv_to_devlink(dev),
	err = devl_param_driverinit_value_get(priv_to_devlink(dev),
					      DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET,
					      &val);
	return err ? false : val.vbool;
@@ -221,7 +221,7 @@ static bool is_ib_enabled(struct mlx5_core_dev *dev)
	union devlink_param_value val;
	int err;

	err = devlink_param_driverinit_value_get(priv_to_devlink(dev),
	err = devl_param_driverinit_value_get(priv_to_devlink(dev),
					      DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA,
					      &val);
	return err ? false : val.vbool;
+46 −46
Original line number Diff line number Diff line
@@ -602,24 +602,24 @@ static void mlx5_devlink_set_params_init_values(struct devlink *devlink)
	union devlink_param_value value;

	value.vbool = MLX5_CAP_GEN(dev, roce);
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE,
					value);

#ifdef CONFIG_MLX5_ESWITCH
	value.vu32 = ESW_OFFLOADS_DEFAULT_NUM_GROUPS;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					MLX5_DEVLINK_PARAM_ID_ESW_LARGE_GROUP_NUM,
					value);
#endif

	value.vu32 = MLX5_COMP_EQ_SIZE;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE,
					value);

	value.vu32 = MLX5_NUM_ASYNC_EQE;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE,
					value);
}
@@ -638,13 +638,13 @@ static int mlx5_devlink_eth_params_register(struct devlink *devlink)
	if (!mlx5_eth_supported(dev))
		return 0;

	err = devlink_params_register(devlink, mlx5_devlink_eth_params,
	err = devl_params_register(devlink, mlx5_devlink_eth_params,
				   ARRAY_SIZE(mlx5_devlink_eth_params));
	if (err)
		return err;

	value.vbool = true;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH,
					value);
	return 0;
@@ -657,7 +657,7 @@ static void mlx5_devlink_eth_params_unregister(struct devlink *devlink)
	if (!mlx5_eth_supported(dev))
		return;

	devlink_params_unregister(devlink, mlx5_devlink_eth_params,
	devl_params_unregister(devlink, mlx5_devlink_eth_params,
			       ARRAY_SIZE(mlx5_devlink_eth_params));
}

@@ -686,13 +686,13 @@ static int mlx5_devlink_rdma_params_register(struct devlink *devlink)
	if (!IS_ENABLED(CONFIG_MLX5_INFINIBAND))
		return 0;

	err = devlink_params_register(devlink, mlx5_devlink_rdma_params,
	err = devl_params_register(devlink, mlx5_devlink_rdma_params,
				   ARRAY_SIZE(mlx5_devlink_rdma_params));
	if (err)
		return err;

	value.vbool = true;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA,
					value);
	return 0;
@@ -703,7 +703,7 @@ static void mlx5_devlink_rdma_params_unregister(struct devlink *devlink)
	if (!IS_ENABLED(CONFIG_MLX5_INFINIBAND))
		return;

	devlink_params_unregister(devlink, mlx5_devlink_rdma_params,
	devl_params_unregister(devlink, mlx5_devlink_rdma_params,
			       ARRAY_SIZE(mlx5_devlink_rdma_params));
}

@@ -721,13 +721,13 @@ static int mlx5_devlink_vnet_params_register(struct devlink *devlink)
	if (!mlx5_vnet_supported(dev))
		return 0;

	err = devlink_params_register(devlink, mlx5_devlink_vnet_params,
	err = devl_params_register(devlink, mlx5_devlink_vnet_params,
				   ARRAY_SIZE(mlx5_devlink_vnet_params));
	if (err)
		return err;

	value.vbool = true;
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET,
					value);
	return 0;
@@ -740,7 +740,7 @@ static void mlx5_devlink_vnet_params_unregister(struct devlink *devlink)
	if (!mlx5_vnet_supported(dev))
		return;

	devlink_params_unregister(devlink, mlx5_devlink_vnet_params,
	devl_params_unregister(devlink, mlx5_devlink_vnet_params,
			       ARRAY_SIZE(mlx5_devlink_vnet_params));
}

@@ -814,13 +814,13 @@ static int mlx5_devlink_max_uc_list_params_register(struct devlink *devlink)
	if (!MLX5_CAP_GEN_MAX(dev, log_max_current_uc_list_wr_supported))
		return 0;

	err = devlink_params_register(devlink, mlx5_devlink_max_uc_list_params,
	err = devl_params_register(devlink, mlx5_devlink_max_uc_list_params,
				   ARRAY_SIZE(mlx5_devlink_max_uc_list_params));
	if (err)
		return err;

	value.vu32 = 1 << MLX5_CAP_GEN(dev, log_max_current_uc_list);
	devlink_param_driverinit_value_set(devlink,
	devl_param_driverinit_value_set(devlink,
					DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
					value);
	return 0;
@@ -834,7 +834,7 @@ mlx5_devlink_max_uc_list_params_unregister(struct devlink *devlink)
	if (!MLX5_CAP_GEN_MAX(dev, log_max_current_uc_list_wr_supported))
		return;

	devlink_params_unregister(devlink, mlx5_devlink_max_uc_list_params,
	devl_params_unregister(devlink, mlx5_devlink_max_uc_list_params,
			       ARRAY_SIZE(mlx5_devlink_max_uc_list_params));
}

@@ -886,7 +886,7 @@ int mlx5_devlink_params_register(struct devlink *devlink)
	struct mlx5_core_dev *dev = devlink_priv(devlink);
	int err;

	err = devlink_params_register(devlink, mlx5_devlink_params,
	err = devl_params_register(devlink, mlx5_devlink_params,
				   ARRAY_SIZE(mlx5_devlink_params));
	if (err)
		return err;
@@ -909,7 +909,7 @@ int mlx5_devlink_params_register(struct devlink *devlink)
max_uc_list_err:
	mlx5_devlink_auxdev_params_unregister(devlink);
auxdev_reg_err:
	devlink_params_unregister(devlink, mlx5_devlink_params,
	devl_params_unregister(devlink, mlx5_devlink_params,
			       ARRAY_SIZE(mlx5_devlink_params));
	return err;
}
@@ -918,6 +918,6 @@ void mlx5_devlink_params_unregister(struct devlink *devlink)
{
	mlx5_devlink_max_uc_list_params_unregister(devlink);
	mlx5_devlink_auxdev_params_unregister(devlink);
	devlink_params_unregister(devlink, mlx5_devlink_params,
	devl_params_unregister(devlink, mlx5_devlink_params,
			       ARRAY_SIZE(mlx5_devlink_params));
}
+6 −6
Original line number Diff line number Diff line
@@ -629,7 +629,7 @@ static u16 async_eq_depth_devlink_param_get(struct mlx5_core_dev *dev)
	union devlink_param_value val;
	int err;

	err = devlink_param_driverinit_value_get(devlink,
	err = devl_param_driverinit_value_get(devlink,
					      DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE,
					      &val);
	if (!err)
@@ -874,7 +874,7 @@ static u16 comp_eq_depth_devlink_param_get(struct mlx5_core_dev *dev)
	union devlink_param_value val;
	int err;

	err = devlink_param_driverinit_value_get(devlink,
	err = devl_param_driverinit_value_get(devlink,
					      DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE,
					      &val);
	if (!err)
+3 −3
Original line number Diff line number Diff line
@@ -1190,7 +1190,7 @@ static void mlx5_eswitch_get_devlink_param(struct mlx5_eswitch *esw)
	union devlink_param_value val;
	int err;

	err = devlink_param_driverinit_value_get(devlink,
	err = devl_param_driverinit_value_get(devlink,
					      MLX5_DEVLINK_PARAM_ID_ESW_LARGE_GROUP_NUM,
					      &val);
	if (!err) {
Loading