From: Jakub Kicinski <kuba@kernel.org>
Date: Mon, 14 Mar 2022 23:00:08 -0700
Subject: devlink: hold the instance lock in port_split / port_unsplit
callbacks
Patch-mainline: v5.18-rc1
Git-commit: 49e83bbe8cc32e197fccf4f617b3fa2fedc27a23
References: jsc#PED-1549
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>
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 7 -----
drivers/net/ethernet/netronome/nfp/nfp_devlink.c | 32 +++++------------------
net/core/devlink.c | 2 -
3 files changed, 8 insertions(+), 33 deletions(-)
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -2021,7 +2021,6 @@ static int mlxsw_sp_port_split(struct ml
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;
@@ -2059,7 +2058,6 @@ static int mlxsw_sp_port_split(struct ml
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);
@@ -2073,13 +2071,11 @@ static int mlxsw_sp_port_split(struct ml
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;
}
@@ -2087,7 +2083,6 @@ static int mlxsw_sp_port_unsplit(struct
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;
@@ -2119,7 +2114,6 @@ static int mlxsw_sp_port_unsplit(struct
return err;
}
- devl_lock(devlink);
for (i = 0; i < count; i++) {
u16 s_local_port = mlxsw_reg_pmtdb_port_num_get(pmtdb_pl, i);
@@ -2128,7 +2122,6 @@ static int mlxsw_sp_port_unsplit(struct
}
mlxsw_sp_port_unsplit_create(mlxsw_sp, count, pmtdb_pl);
- devl_unlock(devlink);
return 0;
}
--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
@@ -70,29 +70,21 @@ nfp_devlink_port_split(struct devlink *d
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
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
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -8672,14 +8672,12 @@ static const struct genl_small_ops devli
.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,