OSDN Git Service

devlink: hold the instance lock in port_split / port_unsplit callbacks
authorJakub Kicinski <kuba@kernel.org>
Tue, 15 Mar 2022 06:00:08 +0000 (23:00 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 16 Mar 2022 19:56:42 +0000 (12:56 -0700)
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>
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/netronome/nfp/nfp_devlink.c
net/core/devlink.c

index 1e823b6..8eb0509 100644 (file)
@@ -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;
 }
index 865f629..6bd6f4a 100644 (file)
@@ -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
index 769e5f7..545ae78 100644 (file)
@@ -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,