RDMA/mlx4: Do not fail the registration on port stats

If the FW doesn't support MLX4_DEV_CAP_FLAG2_DIAG_PER_PORT, mlx4 driver
will fail the ib_setup_port_attrs, which is called from
ib_register_device()/enable_device_and_get(), in the end leads to device
not detected[1][2]

To fix it, add a new mlx4_ib_hw_stats_ops1, w/o alloc_hw_port_stats if FW
does not support MLX4_DEV_CAP_FLAG2_DIAG_PER_PORT.

[1] https://bugzilla.redhat.com/show_bug.cgi?id=2014094
[2] https://lore.kernel.org/linux-rdma/CAMGffEn2wvEnmzc0xe=xYiCLqpphiHDBxCxqAELrBofbUAMQxw@mail.gmail.com

Fixes: 4b5f4d3fb4 ("RDMA: Split the alloc_hw_stats() ops to port and device variants")
Link: https://lore.kernel.org/r/20211115101519.27210-1-jinpu.wang@ionos.com
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
Jack Wang 2021-11-15 11:15:19 +01:00 committed by Jason Gunthorpe
parent da86dc175b
commit 378c67413d
1 changed files with 15 additions and 3 deletions

View File

@ -2215,6 +2215,11 @@ static const struct ib_device_ops mlx4_ib_hw_stats_ops = {
.get_hw_stats = mlx4_ib_get_hw_stats, .get_hw_stats = mlx4_ib_get_hw_stats,
}; };
static const struct ib_device_ops mlx4_ib_hw_stats_ops1 = {
.alloc_hw_device_stats = mlx4_ib_alloc_hw_device_stats,
.get_hw_stats = mlx4_ib_get_hw_stats,
};
static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev) static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev)
{ {
struct mlx4_ib_diag_counters *diag = ibdev->diag_counters; struct mlx4_ib_diag_counters *diag = ibdev->diag_counters;
@ -2227,9 +2232,16 @@ static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev)
return 0; return 0;
for (i = 0; i < MLX4_DIAG_COUNTERS_TYPES; i++) { for (i = 0; i < MLX4_DIAG_COUNTERS_TYPES; i++) {
/* i == 1 means we are building port counters */ /*
if (i && !per_port) * i == 1 means we are building port counters, set a different
continue; * stats ops without port stats callback.
*/
if (i && !per_port) {
ib_set_device_ops(&ibdev->ib_dev,
&mlx4_ib_hw_stats_ops1);
return 0;
}
ret = __mlx4_ib_alloc_diag_counters(ibdev, &diag[i].descs, ret = __mlx4_ib_alloc_diag_counters(ibdev, &diag[i].descs,
&diag[i].offset, &diag[i].offset,