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:
parent
da86dc175b
commit
378c67413d
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue