Skip to content

Commit 5eb29f0

Browse files
committed
RDMA/mlx5: Make mkeys always owned by the kernel's PD when not enabled
Any mkey that is not enabled and assigned to userspace should have the PD set to a kernel owned PD. When cache entries are created for the first time the PDN is set to 0, which is probably a kernel PD, but be explicit. When a MR is registered using the hybrid reg_create with UMR xlt & enable the disabled mkey is pointing at the user PD, keep it pointing at the kernel until a UMR enables it and sets the user PD. Fixes: 9ec4483 ("IB/mlx5: Move MRs to a kernel PD when freeing them to the MR cache") Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 1c97ca3 commit 5eb29f0

File tree

1 file changed

+26
-25
lines changed
  • drivers/infiniband/hw/mlx5

1 file changed

+26
-25
lines changed

drivers/infiniband/hw/mlx5/mr.c

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,29 @@ enum {
5050
static void
5151
create_mkey_callback(int status, struct mlx5_async_work *context);
5252

53+
static void set_mkc_access_pd_addr_fields(void *mkc, int acc, u64 start_addr,
54+
struct ib_pd *pd)
55+
{
56+
struct mlx5_ib_dev *dev = to_mdev(pd->device);
57+
58+
MLX5_SET(mkc, mkc, a, !!(acc & IB_ACCESS_REMOTE_ATOMIC));
59+
MLX5_SET(mkc, mkc, rw, !!(acc & IB_ACCESS_REMOTE_WRITE));
60+
MLX5_SET(mkc, mkc, rr, !!(acc & IB_ACCESS_REMOTE_READ));
61+
MLX5_SET(mkc, mkc, lw, !!(acc & IB_ACCESS_LOCAL_WRITE));
62+
MLX5_SET(mkc, mkc, lr, 1);
63+
64+
if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_write))
65+
MLX5_SET(mkc, mkc, relaxed_ordering_write,
66+
!!(acc & IB_ACCESS_RELAXED_ORDERING));
67+
if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read))
68+
MLX5_SET(mkc, mkc, relaxed_ordering_read,
69+
!!(acc & IB_ACCESS_RELAXED_ORDERING));
70+
71+
MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn);
72+
MLX5_SET(mkc, mkc, qpn, 0xffffff);
73+
MLX5_SET64(mkc, mkc, start_addr, start_addr);
74+
}
75+
5376
static void
5477
assign_mkey_variant(struct mlx5_ib_dev *dev, struct mlx5_core_mkey *mkey,
5578
u32 *in)
@@ -152,12 +175,12 @@ static struct mlx5_ib_mr *alloc_cache_mr(struct mlx5_cache_ent *ent, void *mkc)
152175
mr->cache_ent = ent;
153176
mr->dev = ent->dev;
154177

178+
set_mkc_access_pd_addr_fields(mkc, 0, 0, ent->dev->umrc.pd);
155179
MLX5_SET(mkc, mkc, free, 1);
156180
MLX5_SET(mkc, mkc, umr_en, 1);
157181
MLX5_SET(mkc, mkc, access_mode_1_0, ent->access_mode & 0x3);
158182
MLX5_SET(mkc, mkc, access_mode_4_2, (ent->access_mode >> 2) & 0x7);
159183

160-
MLX5_SET(mkc, mkc, qpn, 0xffffff);
161184
MLX5_SET(mkc, mkc, translations_octword_size, ent->xlt);
162185
MLX5_SET(mkc, mkc, log_page_size, ent->page);
163186
return mr;
@@ -774,29 +797,6 @@ int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev)
774797
return 0;
775798
}
776799

777-
static void set_mkc_access_pd_addr_fields(void *mkc, int acc, u64 start_addr,
778-
struct ib_pd *pd)
779-
{
780-
struct mlx5_ib_dev *dev = to_mdev(pd->device);
781-
782-
MLX5_SET(mkc, mkc, a, !!(acc & IB_ACCESS_REMOTE_ATOMIC));
783-
MLX5_SET(mkc, mkc, rw, !!(acc & IB_ACCESS_REMOTE_WRITE));
784-
MLX5_SET(mkc, mkc, rr, !!(acc & IB_ACCESS_REMOTE_READ));
785-
MLX5_SET(mkc, mkc, lw, !!(acc & IB_ACCESS_LOCAL_WRITE));
786-
MLX5_SET(mkc, mkc, lr, 1);
787-
788-
if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_write))
789-
MLX5_SET(mkc, mkc, relaxed_ordering_write,
790-
!!(acc & IB_ACCESS_RELAXED_ORDERING));
791-
if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read))
792-
MLX5_SET(mkc, mkc, relaxed_ordering_read,
793-
!!(acc & IB_ACCESS_RELAXED_ORDERING));
794-
795-
MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn);
796-
MLX5_SET(mkc, mkc, qpn, 0xffffff);
797-
MLX5_SET64(mkc, mkc, start_addr, start_addr);
798-
}
799-
800800
struct ib_mr *mlx5_ib_get_dma_mr(struct ib_pd *pd, int acc)
801801
{
802802
struct mlx5_ib_dev *dev = to_mdev(pd->device);
@@ -1190,7 +1190,8 @@ static struct mlx5_ib_mr *reg_create(struct ib_mr *ibmr, struct ib_pd *pd,
11901190
MLX5_SET(create_mkey_in, in, pg_access, !!(pg_cap));
11911191

11921192
mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
1193-
set_mkc_access_pd_addr_fields(mkc, access_flags, virt_addr, pd);
1193+
set_mkc_access_pd_addr_fields(mkc, access_flags, virt_addr,
1194+
populate ? pd : dev->umrc.pd);
11941195
MLX5_SET(mkc, mkc, free, !populate);
11951196
MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_MTT);
11961197
MLX5_SET(mkc, mkc, umr_en, 1);

0 commit comments

Comments
 (0)