]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/mlx5: Remove the redundant MLX5_IB_STAGE_UAR stage
authorYishai Hadas <yishaih@nvidia.com>
Tue, 13 May 2025 11:02:40 +0000 (14:02 +0300)
committerLeon Romanovsky <leon@kernel.org>
Sun, 18 May 2025 07:52:03 +0000 (03:52 -0400)
The MLX5_IB_STAGE_UAR stage in the RDMA driver is redundant and should
be removed.

Responsibility for initializing the device's UAR pointer
(mdev->priv.uar) lies with mlx5_core, which already sets it during the
mlx5_load() process.

At present, the RDMA UAR stage overwrites this pointer, which was
correctly initialized by mlx5_core, creating the risk of inconsistency.

Ownership and management of the UAR pointer should remain exclusively
within mlx5_core.

In the current upstream code, we luckily receive the same pointer, since
mlx5_get_uars_page() still finds available BF registers for that UAR,
allowing it to be shared.

However, future changes in mlx5_core may expose this flaw.
For instance, if mlx5_alloc_bfreg() is invoked twice before the RDMA UAR
stage runs, the RDMA driver may overwrite the UAR allocated by
mlx5_core.

This could lead to real bugs. For example, if mlx5_ib is unloaded
(rmmod), it might free the UAR, leaving mlx5_core with a dangling
reference to an invalid UAR.

Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Reviewed-by: Fan Li <fanl@nvidia.com>
Link: https://patch.msgid.link/feaa84ec6f20468b4935c439923e9266122a93d0.1747134130.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h

index d07cacaa0abd00488fd34bd05a3dd65fe9c7fe68..32ad066c3c4a995b48fdb028f77c0c734ccfb738 100644 (file)
@@ -4422,17 +4422,6 @@ static void mlx5_ib_stage_cong_debugfs_cleanup(struct mlx5_ib_dev *dev)
                                     mlx5_core_native_port_num(dev->mdev) - 1);
 }
 
-static int mlx5_ib_stage_uar_init(struct mlx5_ib_dev *dev)
-{
-       dev->mdev->priv.uar = mlx5_get_uars_page(dev->mdev);
-       return PTR_ERR_OR_ZERO(dev->mdev->priv.uar);
-}
-
-static void mlx5_ib_stage_uar_cleanup(struct mlx5_ib_dev *dev)
-{
-       mlx5_put_uars_page(dev->mdev, dev->mdev->priv.uar);
-}
-
 static int mlx5_ib_stage_bfrag_init(struct mlx5_ib_dev *dev)
 {
        int err;
@@ -4662,9 +4651,6 @@ static const struct mlx5_ib_profile pf_profile = {
        STAGE_CREATE(MLX5_IB_STAGE_CONG_DEBUGFS,
                     mlx5_ib_stage_cong_debugfs_init,
                     mlx5_ib_stage_cong_debugfs_cleanup),
-       STAGE_CREATE(MLX5_IB_STAGE_UAR,
-                    mlx5_ib_stage_uar_init,
-                    mlx5_ib_stage_uar_cleanup),
        STAGE_CREATE(MLX5_IB_STAGE_BFREG,
                     mlx5_ib_stage_bfrag_init,
                     mlx5_ib_stage_bfrag_cleanup),
@@ -4722,9 +4708,6 @@ const struct mlx5_ib_profile raw_eth_profile = {
        STAGE_CREATE(MLX5_IB_STAGE_CONG_DEBUGFS,
                     mlx5_ib_stage_cong_debugfs_init,
                     mlx5_ib_stage_cong_debugfs_cleanup),
-       STAGE_CREATE(MLX5_IB_STAGE_UAR,
-                    mlx5_ib_stage_uar_init,
-                    mlx5_ib_stage_uar_cleanup),
        STAGE_CREATE(MLX5_IB_STAGE_BFREG,
                     mlx5_ib_stage_bfrag_init,
                     mlx5_ib_stage_bfrag_cleanup),
index 27fbf5f3a2d639fbd0c2107daf3dcb0df99867a1..fde859d207aea4c3da0670d94ba4658e013e9436 100644 (file)
@@ -1006,7 +1006,6 @@ enum mlx5_ib_stages {
        MLX5_IB_STAGE_ODP,
        MLX5_IB_STAGE_COUNTERS,
        MLX5_IB_STAGE_CONG_DEBUGFS,
-       MLX5_IB_STAGE_UAR,
        MLX5_IB_STAGE_BFREG,
        MLX5_IB_STAGE_PRE_IB_REG_UMR,
        MLX5_IB_STAGE_WHITELIST_UID,