devlink: pass devlink_port pointer to ops->port_del() instead of index
authorJiri Pirko <jiri@nvidia.com>
Tue, 23 May 2023 12:38:01 +0000 (14:38 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 May 2023 09:34:26 +0000 (10:34 +0100)
Historically there was a reason why port_dev() along with for example
port_split() did get port_index instead of the devlink_port pointer.
With the locking changes that were done which ensured devlink instance
mutex is hold for every command, the port ops could get devlink_port
pointer directly. Change the forgotten port_dev() op to be as others
and pass devlink_port pointer instead of port_index.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c
drivers/net/ethernet/mellanox/mlx5/core/sf/sf.h
include/net/devlink.h
net/devlink/leftover.c

index de15b9c85e1ba3afedbc7c426964320e87003187..c7d4691cb65ad2275ed7cf8f6a76f8e3c58faa9f 100644 (file)
@@ -376,7 +376,8 @@ static void mlx5_sf_dealloc(struct mlx5_sf_table *table, struct mlx5_sf *sf)
        }
 }
 
-int mlx5_devlink_sf_port_del(struct devlink *devlink, unsigned int port_index,
+int mlx5_devlink_sf_port_del(struct devlink *devlink,
+                            struct devlink_port *dl_port,
                             struct netlink_ext_ack *extack)
 {
        struct mlx5_core_dev *dev = devlink_priv(devlink);
@@ -391,7 +392,7 @@ int mlx5_devlink_sf_port_del(struct devlink *devlink, unsigned int port_index,
                                   "Port del is only supported in eswitch switchdev mode or SF ports are disabled.");
                return -EOPNOTSUPP;
        }
-       sf = mlx5_sf_lookup_by_index(table, port_index);
+       sf = mlx5_sf_lookup_by_index(table, dl_port->index);
        if (!sf) {
                err = -ENODEV;
                goto sf_err;
index 1f7d8cbd72e837c700ff904003af8717a8fd93ff..c5430b8dcdf622fefe30c652d64f90aa1a8e5c34 100644 (file)
@@ -21,7 +21,8 @@ void mlx5_sf_table_cleanup(struct mlx5_core_dev *dev);
 int mlx5_devlink_sf_port_new(struct devlink *devlink,
                             const struct devlink_port_new_attrs *add_attr,
                             struct netlink_ext_ack *extack);
-int mlx5_devlink_sf_port_del(struct devlink *devlink, unsigned int port_index,
+int mlx5_devlink_sf_port_del(struct devlink *devlink,
+                            struct devlink_port *dl_port,
                             struct netlink_ext_ack *extack);
 int mlx5_devlink_sf_port_fn_state_get(struct devlink_port *dl_port,
                                      enum devlink_port_fn_state *state,
index 24a48f3d4c3502b2ad421b8cc43b745ba1b0a219..1bd56c8d6f3c0216265246ed7546ec70fd6979fb 100644 (file)
@@ -1516,7 +1516,7 @@ struct devlink_ops {
        /**
         * port_del() - Delete a port function
         * @devlink: Devlink instance
-        * @port_index: port function index to delete
+        * @port: The devlink port
         * @extack: extack for reporting error messages
         *
         * Devlink core will call this device driver function upon user request
@@ -1528,7 +1528,7 @@ struct devlink_ops {
         *
         * Return: 0 on success, negative value otherwise.
         */
-       int (*port_del)(struct devlink *devlink, unsigned int port_index,
+       int (*port_del)(struct devlink *devlink, struct devlink_port *port,
                        struct netlink_ext_ack *extack);
        /**
         * port_fn_state_get() - Get the state of a port function
index cb60e42b27611dd0bd0ee839cb7d3f507b520cf4..0410137a4a312681205cc619cb6ac840a8114bc5 100644 (file)
@@ -1396,20 +1396,14 @@ static int devlink_nl_cmd_port_new_doit(struct sk_buff *skb,
 static int devlink_nl_cmd_port_del_doit(struct sk_buff *skb,
                                        struct genl_info *info)
 {
+       struct devlink_port *devlink_port = info->user_ptr[1];
        struct netlink_ext_ack *extack = info->extack;
        struct devlink *devlink = info->user_ptr[0];
-       unsigned int port_index;
 
        if (!devlink->ops->port_del)
                return -EOPNOTSUPP;
 
-       if (GENL_REQ_ATTR_CHECK(info, DEVLINK_ATTR_PORT_INDEX)) {
-               NL_SET_ERR_MSG(extack, "Port index is not specified");
-               return -EINVAL;
-       }
-       port_index = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_INDEX]);
-
-       return devlink->ops->port_del(devlink, port_index, extack);
+       return devlink->ops->port_del(devlink, devlink_port, extack);
 }
 
 static int
@@ -6341,6 +6335,7 @@ const struct genl_small_ops devlink_nl_ops[56] = {
                .cmd = DEVLINK_CMD_PORT_DEL,
                .doit = devlink_nl_cmd_port_del_doit,
                .flags = GENL_ADMIN_PERM,
+               .internal_flags = DEVLINK_NL_FLAG_NEED_PORT,
        },
        {
                .cmd = DEVLINK_CMD_LINECARD_GET,