]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/mlx5: Fix state and counter desync on loopback enable failure
authorLi RongQing <lirongqing@baidu.com>
Mon, 1 Jun 2026 09:58:18 +0000 (05:58 -0400)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 5 Jun 2026 16:41:48 +0000 (13:41 -0300)
In mlx5_ib_enable_lb(), dev->lb.enabled was unconditionally set
to true even if mlx5_nic_vport_update_local_lb() failed.

Fix this by only setting dev->lb.enabled on success. On failure,
roll back the reference counters and return the error.

Link: https://patch.msgid.link/r/20260601095818.2227-1-lirongqing@baidu.com
Signed-off-by: Li RongQing <lirongqing@baidu.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/mlx5/main.c

index e2e8feb1b60d139d5fe18d41f3e7785fe76e5f23..a558ac5bb219dee5a3150fd24f0314485151a6da 100644 (file)
@@ -2024,6 +2024,9 @@ int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)
            dev->lb.qps == 1) {
                if (!dev->lb.enabled) {
                        err = mlx5_nic_vport_update_local_lb(dev->mdev, true);
+                       if (err)
+                               goto err_rollback;
+
                        dev->lb.enabled = true;
                }
        }
@@ -2031,6 +2034,14 @@ int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)
        mutex_unlock(&dev->lb.mutex);
 
        return err;
+
+err_rollback:
+       if (td)
+               dev->lb.user_td--;
+       if (qp)
+               dev->lb.qps--;
+       mutex_unlock(&dev->lb.mutex);
+       return err;
 }
 
 void mlx5_ib_disable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)