Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

RDMA/mlx5: Fix Q-counters query in LAG mode

Previously we used the core device associated to the IB device in order
to do the Q-counters query to the FW, but in LAG mode it is possible
that the core device isn't the one that created this VF.

Hence instead of using the core device to query the Q-counters
we use the ESW core device which is guaranteed to be that of the VF.

Fixes: d22467a71ebe ("RDMA/mlx5: Expand switchdev Q-counters to expose representor statistics")
Signed-off-by: Patrisious Haddad <phaddad@nvidia.com>
Reviewed-by: Mark Zhang <markzhang@nvidia.com>
Link: https://lore.kernel.org/r/778d7d7a24892348d0bdef17d2e5f9e044717e86.1685960567.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>

authored by

Patrisious Haddad and committed by
Leon Romanovsky
2de43f5b e80ef139

+6 -1
+6 -1
drivers/infiniband/hw/mlx5/counters.c
··· 330 330 { 331 331 u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {}; 332 332 u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {}; 333 + struct mlx5_core_dev *mdev; 333 334 __be32 val; 334 335 int ret, i; 335 336 ··· 338 337 dev->port[port_num].rep->vport == MLX5_VPORT_UPLINK) 339 338 return 0; 340 339 340 + mdev = mlx5_eswitch_get_core_dev(dev->port[port_num].rep->esw); 341 + if (!mdev) 342 + return -EOPNOTSUPP; 343 + 341 344 MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER); 342 345 MLX5_SET(query_q_counter_in, in, other_vport, 1); 343 346 MLX5_SET(query_q_counter_in, in, vport_number, 344 347 dev->port[port_num].rep->vport); 345 348 MLX5_SET(query_q_counter_in, in, aggregate, 1); 346 - ret = mlx5_cmd_exec_inout(dev->mdev, query_q_counter, in, out); 349 + ret = mlx5_cmd_exec_inout(mdev, query_q_counter, in, out); 347 350 if (ret) 348 351 return ret; 349 352