]> www.infradead.org Git - nvme.git/commitdiff
net/mlx5: Set default max eqs for SFs
authorDaniel Jurgens <danielj@nvidia.com>
Fri, 12 Jul 2024 00:33:09 +0000 (17:33 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 13 Jul 2024 22:44:16 +0000 (15:44 -0700)
If the user hasn't configured max_io_eqs set a low default. The SF
driver shouldn't try to create more than this, but FW will enforce this
limit.

Signed-off-by: Daniel Jurgens <danielj@nvidia.com>
Reviewed-by: William Tu <witu@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Link: https://patch.msgid.link/20240712003310.355106-4-saeed@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c

index 88745dc6aed5b7c6f84cf574e90cef4c4e00ae63..578466d69f2196f308e23b0180868e37e3001ada 100644 (file)
@@ -223,6 +223,7 @@ struct mlx5_vport {
 
        u16 vport;
        bool                    enabled;
+       bool max_eqs_set;
        enum mlx5_eswitch_vport_event enabled_events;
        int index;
        struct mlx5_devlink_port *dl_port;
@@ -579,6 +580,8 @@ int mlx5_devlink_port_fn_max_io_eqs_get(struct devlink_port *port,
 int mlx5_devlink_port_fn_max_io_eqs_set(struct devlink_port *port,
                                        u32 max_io_eqs,
                                        struct netlink_ext_ack *extack);
+int mlx5_devlink_port_fn_max_io_eqs_set_sf_default(struct devlink_port *port,
+                                                  struct netlink_ext_ack *extack);
 
 void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type);
 
index 099a716f1784ae13c4939fb3e5deeb7d325a4998..768199d2255a1dc984b73c055b1aaa242f6bf314 100644 (file)
@@ -68,6 +68,7 @@
 #define MLX5_ESW_FT_OFFLOADS_DROP_RULE (1)
 
 #define MLX5_ESW_MAX_CTRL_EQS 4
+#define MLX5_ESW_DEFAULT_SF_COMP_EQS 8
 
 static struct esw_vport_tbl_namespace mlx5_esw_vport_tbl_mirror_ns = {
        .max_fte = MLX5_ESW_VPORT_TBL_SIZE,
@@ -4683,9 +4684,18 @@ mlx5_devlink_port_fn_max_io_eqs_set(struct devlink_port *port, u32 max_io_eqs,
                                            MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE2);
        if (err)
                NL_SET_ERR_MSG_MOD(extack, "Failed setting HCA caps");
-
+       vport->max_eqs_set = true;
 out:
        mutex_unlock(&esw->state_lock);
        kfree(query_ctx);
        return err;
 }
+
+int
+mlx5_devlink_port_fn_max_io_eqs_set_sf_default(struct devlink_port *port,
+                                              struct netlink_ext_ack *extack)
+{
+       return mlx5_devlink_port_fn_max_io_eqs_set(port,
+                                                  MLX5_ESW_DEFAULT_SF_COMP_EQS,
+                                                  extack);
+}
index 6c11e075cab0b96d4082456a9c9bffc3c8a04ec6..a96be98be032f51d5adc7ea07de04501a3d65c55 100644 (file)
@@ -161,6 +161,7 @@ int mlx5_devlink_sf_port_fn_state_get(struct devlink_port *dl_port,
 static int mlx5_sf_activate(struct mlx5_core_dev *dev, struct mlx5_sf *sf,
                            struct netlink_ext_ack *extack)
 {
+       struct mlx5_vport *vport;
        int err;
 
        if (mlx5_sf_is_active(sf))
@@ -170,6 +171,13 @@ static int mlx5_sf_activate(struct mlx5_core_dev *dev, struct mlx5_sf *sf,
                return -EBUSY;
        }
 
+       vport = mlx5_devlink_port_vport_get(&sf->dl_port.dl_port);
+       if (!vport->max_eqs_set && MLX5_CAP_GEN_2(dev, max_num_eqs_24b)) {
+               err = mlx5_devlink_port_fn_max_io_eqs_set_sf_default(&sf->dl_port.dl_port,
+                                                                    extack);
+               if (err)
+                       return err;
+       }
        err = mlx5_cmd_sf_enable_hca(dev, sf->hw_fn_id);
        if (err)
                return err;
@@ -318,7 +326,11 @@ int mlx5_devlink_sf_port_new(struct devlink *devlink,
 
 static void mlx5_sf_dealloc(struct mlx5_sf_table *table, struct mlx5_sf *sf)
 {
+       struct mlx5_vport *vport;
+
        mutex_lock(&table->sf_state_lock);
+       vport = mlx5_devlink_port_vport_get(&sf->dl_port.dl_port);
+       vport->max_eqs_set = false;
 
        mlx5_sf_function_id_erase(table, sf);