Commit 49e83bbe authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

devlink: hold the instance lock in port_split / port_unsplit callbacks



Let the core take the devlink instance lock around port splitting
and remove the now redundant locking in the drivers.

Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Tested-by: default avatarIdo Schimmel <idosch@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 5e8930aa
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
@@ -2025,7 +2025,6 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u16 local_port,
			       struct netlink_ext_ack *extack)
{
	struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
	struct devlink *devlink = priv_to_devlink(mlxsw_core);
	struct mlxsw_sp_port_mapping port_mapping;
	struct mlxsw_sp_port *mlxsw_sp_port;
	enum mlxsw_reg_pmtdb_status status;
@@ -2063,7 +2062,6 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u16 local_port,

	port_mapping = mlxsw_sp_port->mapping;

	devl_lock(devlink);
	for (i = 0; i < count; i++) {
		u16 s_local_port = mlxsw_reg_pmtdb_port_num_get(pmtdb_pl, i);

@@ -2077,13 +2075,11 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u16 local_port,
		dev_err(mlxsw_sp->bus_info->dev, "Failed to create split ports\n");
		goto err_port_split_create;
	}
	devl_unlock(devlink);

	return 0;

err_port_split_create:
	mlxsw_sp_port_unsplit_create(mlxsw_sp, count, pmtdb_pl);
	devl_unlock(devlink);
	return err;
}

@@ -2091,7 +2087,6 @@ static int mlxsw_sp_port_unsplit(struct mlxsw_core *mlxsw_core, u16 local_port,
				 struct netlink_ext_ack *extack)
{
	struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
	struct devlink *devlink = priv_to_devlink(mlxsw_core);
	struct mlxsw_sp_port *mlxsw_sp_port;
	char pmtdb_pl[MLXSW_REG_PMTDB_LEN];
	unsigned int count;
@@ -2123,7 +2118,6 @@ static int mlxsw_sp_port_unsplit(struct mlxsw_core *mlxsw_core, u16 local_port,
		return err;
	}

	devl_lock(devlink);
	for (i = 0; i < count; i++) {
		u16 s_local_port = mlxsw_reg_pmtdb_port_num_get(pmtdb_pl, i);

@@ -2132,7 +2126,6 @@ static int mlxsw_sp_port_unsplit(struct mlxsw_core *mlxsw_core, u16 local_port,
	}

	mlxsw_sp_port_unsplit_create(mlxsw_sp, count, pmtdb_pl);
	devl_unlock(devlink);

	return 0;
}
+8 −24
Original line number Diff line number Diff line
@@ -70,29 +70,21 @@ nfp_devlink_port_split(struct devlink *devlink, unsigned int port_index,
	unsigned int lanes;
	int ret;

	devl_lock(devlink);

	rtnl_lock();
	ret = nfp_devlink_fill_eth_port_from_id(pf, port_index, &eth_port);
	rtnl_unlock();
	if (ret)
		goto out;
		return ret;

	if (eth_port.port_lanes % count) {
		ret = -EINVAL;
		goto out;
	}
	if (eth_port.port_lanes % count)
		return -EINVAL;

	/* Special case the 100G CXP -> 2x40G split */
	lanes = eth_port.port_lanes / count;
	if (eth_port.lanes == 10 && count == 2)
		lanes = 8 / count;

	ret = nfp_devlink_set_lanes(pf, eth_port.index, lanes);
out:
	devl_unlock(devlink);

	return ret;
	return nfp_devlink_set_lanes(pf, eth_port.index, lanes);
}

static int
@@ -104,29 +96,21 @@ nfp_devlink_port_unsplit(struct devlink *devlink, unsigned int port_index,
	unsigned int lanes;
	int ret;

	devl_lock(devlink);

	rtnl_lock();
	ret = nfp_devlink_fill_eth_port_from_id(pf, port_index, &eth_port);
	rtnl_unlock();
	if (ret)
		goto out;
		return ret;

	if (!eth_port.is_split) {
		ret = -EINVAL;
		goto out;
	}
	if (!eth_port.is_split)
		return -EINVAL;

	/* Special case the 100G CXP -> 2x40G unsplit */
	lanes = eth_port.port_lanes;
	if (eth_port.port_lanes == 8)
		lanes = 10;

	ret = nfp_devlink_set_lanes(pf, eth_port.index, lanes);
out:
	devl_unlock(devlink);

	return ret;
	return nfp_devlink_set_lanes(pf, eth_port.index, lanes);
}

static int
+0 −2
Original line number Diff line number Diff line
@@ -8672,14 +8672,12 @@ static const struct genl_small_ops devlink_nl_ops[] = {
		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
		.doit = devlink_nl_cmd_port_split_doit,
		.flags = GENL_ADMIN_PERM,
		.internal_flags = DEVLINK_NL_FLAG_NO_LOCK,
	},
	{
		.cmd = DEVLINK_CMD_PORT_UNSPLIT,
		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
		.doit = devlink_nl_cmd_port_unsplit_doit,
		.flags = GENL_ADMIN_PERM,
		.internal_flags = DEVLINK_NL_FLAG_NO_LOCK,
	},
	{
		.cmd = DEVLINK_CMD_PORT_NEW,