net/mlx5: Use one completion vector if eth is disabled
authorEli Cohen <elic@nvidia.com>
Tue, 3 Jan 2023 07:37:23 +0000 (09:37 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 24 Mar 2023 23:04:30 +0000 (16:04 -0700)
If eth is disabled by devlink, use only a single completion vector to
have minimum performance of all users of completion vectors. This also
affects Infiniband performance.

The rest of the vectors can be used by other consumers on a first come
first served basis.

mlx5_vdpa will make use of this to allocate dedicated vectors for its
own use.

Signed-off-by: Eli Cohen <elic@nvidia.com>
Reviewed-by: Shay Drory <shayd@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
drivers/net/ethernet/mellanox/mlx5/core/dev.c
drivers/net/ethernet/mellanox/mlx5/core/devlink.h
drivers/net/ethernet/mellanox/mlx5/core/eq.c

index 445fe30c3d0bc5aa149f366408cea2bd9fc23497..e7739acc926e93c4a6269e47b7c8d21ba7e1094d 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/mlx5/mlx5_ifc_vdpa.h>
 #include <linux/mlx5/vport.h>
 #include "mlx5_core.h"
+#include "devlink.h"
 
 /* intf dev list mutex */
 static DEFINE_MUTEX(mlx5_intf_mutex);
@@ -109,17 +110,6 @@ bool mlx5_eth_supported(struct mlx5_core_dev *dev)
        return true;
 }
 
-static bool is_eth_enabled(struct mlx5_core_dev *dev)
-{
-       union devlink_param_value val;
-       int err;
-
-       err = devl_param_driverinit_value_get(priv_to_devlink(dev),
-                                             DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH,
-                                             &val);
-       return err ? false : val.vbool;
-}
-
 bool mlx5_vnet_supported(struct mlx5_core_dev *dev)
 {
        if (!IS_ENABLED(CONFIG_MLX5_VDPA_NET))
@@ -251,7 +241,7 @@ static const struct mlx5_adev_device {
                                         .is_enabled = &is_ib_enabled },
        [MLX5_INTERFACE_PROTOCOL_ETH] = { .suffix = "eth",
                                          .is_supported = &mlx5_eth_supported,
-                                         .is_enabled = &is_eth_enabled },
+                                         .is_enabled = &mlx5_core_is_eth_enabled },
        [MLX5_INTERFACE_PROTOCOL_ETH_REP] = { .suffix = "eth-rep",
                                           .is_supported = &is_eth_rep_supported },
        [MLX5_INTERFACE_PROTOCOL_IB_REP] = { .suffix = "rdma-rep",
index 212b12424146af6df5fe2bbbde6993606c78e669..f2601f9eef789d5945d679c259700a9dc4e24d2e 100644 (file)
@@ -44,4 +44,15 @@ void mlx5_devlink_free(struct devlink *devlink);
 int mlx5_devlink_params_register(struct devlink *devlink);
 void mlx5_devlink_params_unregister(struct devlink *devlink);
 
+static inline bool mlx5_core_is_eth_enabled(struct mlx5_core_dev *dev)
+{
+       union devlink_param_value val;
+       int err;
+
+       err = devl_param_driverinit_value_get(priv_to_devlink(dev),
+                                             DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH,
+                                             &val);
+       return err ? false : val.vbool;
+}
+
 #endif /* __MLX5_DEVLINK_H__ */
index 66696c935cc505c2cb64c8bfb69dc5ebf8412625..eb41f0abf798e61588da7f36d585a4d5a95845c6 100644 (file)
@@ -1120,6 +1120,13 @@ static int get_num_eqs(struct mlx5_core_dev *dev)
        int max_eqs_sf;
        int num_eqs;
 
+       /* If ethernet is disabled we use just a single completion vector to
+        * have the other vectors available for other drivers using mlx5_core. For
+        * example, mlx5_vdpa
+        */
+       if (!mlx5_core_is_eth_enabled(dev) && mlx5_eth_supported(dev))
+               return 1;
+
        max_dev_eqs = MLX5_CAP_GEN(dev, max_num_eqs) ?
                      MLX5_CAP_GEN(dev, max_num_eqs) :
                      1 << MLX5_CAP_GEN(dev, log_max_eq);