]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
IB/mlx5: Push pdn above pagfault_real_mr()
authorJason Gunthorpe <jgg@nvidia.com>
Thu, 4 Jun 2026 01:27:48 +0000 (22:27 -0300)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 8 Jun 2026 17:32:44 +0000 (14:32 -0300)
Remove the mlx5_mr_pdn() in pagefault_real_mr() by pushing the pdn up, all
the callers use 0 since they don't pass MLX5_PF_FLAGS_ENABLE except the
ioctl reg_mr path which can use the ioctl pd.

Link: https://patch.msgid.link/r/9-v1-29ebd2c229b5+fd5-ib_mr_pd_jgg@nvidia.com
Assisted-by: Codex:gpt-5-5
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/mr.c
drivers/infiniband/hw/mlx5/odp.c

index 0ebf1010c709be963072178cc583d969c068925b..bb5383e8ded9d40b3560d86cdc0c6c5cd3aebe00 100644 (file)
@@ -1423,7 +1423,7 @@ int mlx5_odp_populate_xlt(void *xlt, size_t idx, size_t nentries,
 int mlx5_ib_advise_mr_prefetch(struct ib_pd *pd,
                               enum ib_uverbs_advise_mr_advice advice,
                               u32 flags, struct ib_sge *sg_list, u32 num_sge);
-int mlx5_ib_init_odp_mr(struct mlx5_ib_mr *mr);
+int mlx5_ib_init_odp_mr(struct mlx5_ib_mr *mr, struct ib_pd *pd);
 int mlx5_ib_init_dmabuf_mr(struct mlx5_ib_mr *mr);
 #else /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */
 static inline int mlx5_ib_odp_init_one(struct mlx5_ib_dev *ibdev) { return 0; }
@@ -1452,7 +1452,7 @@ mlx5_ib_advise_mr_prefetch(struct ib_pd *pd,
 {
        return -EOPNOTSUPP;
 }
-static inline int mlx5_ib_init_odp_mr(struct mlx5_ib_mr *mr)
+static inline int mlx5_ib_init_odp_mr(struct mlx5_ib_mr *mr, struct ib_pd *pd)
 {
        return -EOPNOTSUPP;
 }
index 7e2d5219fa3ee1a0d2c815859ebe721724f06b42..0c40c06618b648557c3a49c1c2e4f80cf8ff3b56 100644 (file)
@@ -842,7 +842,7 @@ static struct ib_mr *create_user_odp_mr(struct ib_pd *pd, u64 start, u64 length,
        if (err)
                goto err_dereg_mr;
 
-       err = mlx5_ib_init_odp_mr(mr);
+       err = mlx5_ib_init_odp_mr(mr, pd);
        if (err)
                goto err_dereg_mr;
        return &mr->ibmr;
index 50804b4c90e47777bf6a1c708aa096bd49892ea6..2dcc4f5339f9d35c32e962e9e6f82905dbeb385b 100644 (file)
@@ -687,12 +687,16 @@ void mlx5_ib_free_odp_mr(struct mlx5_ib_mr *mr)
        }
 }
 
+/*
+ * pdn must be valid only when xlt_flags updates the mkey PD. In this path that
+ * is only MLX5_PF_FLAGS_ENABLE. DOWNGRADE and SNAPSHOT leave the PD masked out.
+ */
 #define MLX5_PF_FLAGS_DOWNGRADE BIT(1)
 #define MLX5_PF_FLAGS_SNAPSHOT BIT(2)
 #define MLX5_PF_FLAGS_ENABLE BIT(3)
 static int pagefault_real_mr(struct mlx5_ib_mr *mr, struct ib_umem_odp *odp,
                             u64 user_va, size_t bcnt, u32 *bytes_mapped,
-                            u32 flags)
+                            u32 flags, u32 pdn)
 {
        int page_shift, ret, np;
        bool downgrade = flags & MLX5_PF_FLAGS_DOWNGRADE;
@@ -722,7 +726,7 @@ static int pagefault_real_mr(struct mlx5_ib_mr *mr, struct ib_umem_odp *odp,
         * ib_umem_odp_map_dma_and_lock already checks this.
         */
        ret = mlx5r_umr_update_xlt(mr, start_idx, np, page_shift, xlt_flags,
-                                  mlx5_mr_pdn(mr));
+                                  pdn);
        mutex_unlock(&odp->umem_mutex);
 
        if (ret < 0) {
@@ -788,7 +792,7 @@ static int pagefault_implicit_mr(struct mlx5_ib_mr *imr,
                      user_va;
 
                ret = pagefault_real_mr(mtt, umem_odp, user_va, len,
-                                       bytes_mapped, flags);
+                                       bytes_mapped, flags, 0);
 
                mlx5r_deref_odp_mkey(&mtt->mmkey);
 
@@ -930,19 +934,20 @@ static int pagefault_mr(struct mlx5_ib_mr *mr, u64 io_virt, size_t bcnt,
                                    ib_umem_end(odp) - user_va < bcnt))
                        return -EFAULT;
                return pagefault_real_mr(mr, odp, user_va, bcnt, bytes_mapped,
-                                        flags);
+                                        flags, 0);
        }
        return pagefault_implicit_mr(mr, odp, io_virt, bcnt, bytes_mapped,
                                     flags);
 }
 
-int mlx5_ib_init_odp_mr(struct mlx5_ib_mr *mr)
+int mlx5_ib_init_odp_mr(struct mlx5_ib_mr *mr, struct ib_pd *pd)
 {
        int ret;
 
        ret = pagefault_real_mr(mr, to_ib_umem_odp(mr->umem), mr->umem->address,
                                mr->umem->length, NULL,
-                               MLX5_PF_FLAGS_SNAPSHOT | MLX5_PF_FLAGS_ENABLE);
+                               MLX5_PF_FLAGS_SNAPSHOT | MLX5_PF_FLAGS_ENABLE,
+                               to_mpd(pd)->pdn);
        return ret >= 0 ? 0 : ret;
 }
 
@@ -1575,8 +1580,7 @@ static void mlx5_ib_mr_memory_pfault_handler(struct mlx5_ib_dev *dev,
        ret = pagefault_mr(mr, prefetch_va, prefetch_size, NULL, 0, true);
        if (ret < 0) {
                ret = pagefault_mr(mr, pfault->memory.va,
-                                  pfault->memory.fault_byte_count, NULL, 0,
-                                  true);
+                                  pfault->memory.fault_byte_count, NULL, 0, true);
                if (ret < 0)
                        goto err;
        }