Skip to content

Commit

Permalink
devlink: hold the instance lock in port_split / port_unsplit callbacks
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jakub Kicinski committed Mar 16, 2022
1 parent 5e8930a commit 49e83bb
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 33 deletions.
7 changes: 0 additions & 7 deletions drivers/net/ethernet/mellanox/mlxsw/spectrum.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand All @@ -2077,21 +2075,18 @@ 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;
}

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;
Expand Down Expand Up @@ -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);

Expand All @@ -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;
}
Expand Down
32 changes: 8 additions & 24 deletions drivers/net/ethernet/netronome/nfp/nfp_devlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
2 changes: 0 additions & 2 deletions net/core/devlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 49e83bb

Please sign in to comment.