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: Ido Schimmel <idosch@nvidia.com> Tested-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Родитель
5e8930aa86
Коммит
49e83bbe8c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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, ð_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, ð_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
|
||||
|
|
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче