]> www.infradead.org Git - users/hch/misc.git/commitdiff
net/mlx5: {DR,HWS}, Use the cached vhca_id for this device
authorSaeed Mahameed <saeedm@nvidia.com>
Fri, 29 Aug 2025 22:37:22 +0000 (15:37 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 2 Sep 2025 13:18:16 +0000 (15:18 +0200)
The mlx5 driver caches many capabilities to be used by mlx5 layers.

In SW and HW steering we can use the cached vhca_id instead of invoking
FW commands.

Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250829223722.900629-8-saeed@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/cmd.c
drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_cmd.c

index acb0317f930b9a813fc3d8929e0173e2465263bc..f22eaf506d28cc5171751ad1a4ed18aab11d654e 100644 (file)
@@ -1200,40 +1200,20 @@ out:
 int mlx5hws_cmd_query_gvmi(struct mlx5_core_dev *mdev, bool other_function,
                           u16 vport_number, u16 *gvmi)
 {
-       u32 in[MLX5_ST_SZ_DW(query_hca_cap_in)] = {};
-       int out_size;
-       void *out;
        int err;
 
-       if (other_function) {
-               err = mlx5_vport_get_vhca_id(mdev, vport_number, gvmi);
-               if  (!err)
-                       return 0;
-
-               mlx5_core_err(mdev, "Failed to get vport vhca id for vport %d\n",
-                             vport_number);
-               return err;
+       if (!other_function) {
+               /* self vhca_id */
+               *gvmi = MLX5_CAP_GEN(mdev, vhca_id);
+               return 0;
        }
 
-       /* get vhca_id for `this` function */
-       out_size = MLX5_ST_SZ_BYTES(query_hca_cap_out);
-       out = kzalloc(out_size, GFP_KERNEL);
-       if (!out)
-               return -ENOMEM;
-
-       MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
-       MLX5_SET(query_hca_cap_in, in, op_mod,
-                MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE << 1 | HCA_CAP_OPMOD_GET_CUR);
-
-       err = mlx5_cmd_exec_inout(mdev, query_hca_cap, in, out);
+       err = mlx5_vport_get_vhca_id(mdev, vport_number, gvmi);
        if (err) {
-               kfree(out);
+               mlx5_core_err(mdev, "Failed to get vport vhca id for vport %d\n",
+                             vport_number);
                return err;
        }
 
-       *gvmi = MLX5_GET(query_hca_cap_out, out, capability.cmd_hca_cap.vhca_id);
-
-       kfree(out);
-
        return 0;
 }
index bf99b933fd14bebefb2c96e52d7dff7c52382e2a..1ebb2b15c0806d8b348f109e1ef9f8764aba07a4 100644 (file)
@@ -35,41 +35,21 @@ int mlx5dr_cmd_query_esw_vport_context(struct mlx5_core_dev *mdev,
 int mlx5dr_cmd_query_gvmi(struct mlx5_core_dev *mdev, bool other_vport,
                          u16 vport_number, u16 *gvmi)
 {
-       u32 in[MLX5_ST_SZ_DW(query_hca_cap_in)] = {};
-       int out_size;
-       void *out;
        int err;
 
-       if (other_vport) {
-               err = mlx5_vport_get_vhca_id(mdev, vport_number, gvmi);
-               if  (!err)
-                       return 0;
-
-               mlx5_core_err(mdev, "Failed to get vport vhca id for vport %d\n",
-                             vport_number);
-               return err;
+       if (!other_vport) {
+               /* self vhca_id */
+               *gvmi = MLX5_CAP_GEN(mdev, vhca_id);
+               return 0;
        }
 
-       /* get vhca_id for `this` function */
-       out_size = MLX5_ST_SZ_BYTES(query_hca_cap_out);
-       out = kzalloc(out_size, GFP_KERNEL);
-       if (!out)
-               return -ENOMEM;
-
-       MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
-       MLX5_SET(query_hca_cap_in, in, op_mod,
-                MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE << 1 |
-                HCA_CAP_OPMOD_GET_CUR);
-
-       err = mlx5_cmd_exec_inout(mdev, query_hca_cap, in, out);
+       err = mlx5_vport_get_vhca_id(mdev, vport_number, gvmi);
        if (err) {
-               kfree(out);
+               mlx5_core_err(mdev, "Failed to get vport vhca id for vport %d\n",
+                             vport_number);
                return err;
        }
 
-       *gvmi = MLX5_GET(query_hca_cap_out, out, capability.cmd_hca_cap.vhca_id);
-
-       kfree(out);
        return 0;
 }