Skip to content

Commit 407472d

Browse files
jgunthorpegregkh
authored andcommitted
IB/mlx4: Fill in the access_flags if IB_MR_REREG_ACCESS is not specified
[ Upstream commit bade9a3 ] Sashiko noticed mlx4 was using whatever random access flags were provided when IB_MR_REREG_ACCESS is not used. Since IB_MR_REREG_TRANS needs access_flags it used the random ones which means it doesn't work sensibly if userspace provides only IB_MR_REREG_TRANS. Keep track of the current access_flag of the MR and use it if the user does not specify one. Also fixup a little confusion around mmr.access, it is the HW access flags so the convert_access() was missing. But nothing reads this by the time rereg_mr can happen. Fixes: 9376932 ("IB/mlx4_ib: Add support for user MR re-registration") Link: https://patch.msgid.link/r/0-v1-29ca7a402625+ddd6-mlx4_rereg_flags_jgg@nvidia.com Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent fcce8a4 commit 407472d

2 files changed

Lines changed: 8 additions & 2 deletions

File tree

drivers/infiniband/hw/mlx4/mlx4_ib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ struct mlx4_ib_mr {
137137
dma_addr_t page_map;
138138
u32 npages;
139139
u32 max_pages;
140+
int access_flags;
140141
struct mlx4_mr mmr;
141142
struct ib_umem *umem;
142143
size_t page_map_size;

drivers/infiniband/hw/mlx4/mr.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ struct ib_mr *mlx4_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
439439
if (err)
440440
goto err_mr;
441441

442+
mr->access_flags = access_flags;
442443
mr->ibmr.rkey = mr->ibmr.lkey = mr->mmr.key;
443444
mr->ibmr.page_size = 1U << shift;
444445

@@ -499,6 +500,8 @@ struct ib_mr *mlx4_ib_rereg_user_mr(struct ib_mr *mr, int flags, u64 start,
499500

500501
if (err)
501502
goto release_mpt_entry;
503+
} else {
504+
mr_access_flags = mmr->access_flags;
502505
}
503506

504507
if (flags & IB_MR_REREG_TRANS) {
@@ -540,8 +543,10 @@ struct ib_mr *mlx4_ib_rereg_user_mr(struct ib_mr *mr, int flags, u64 start,
540543
* return a failure. But dereg_mr will free the resources.
541544
*/
542545
err = mlx4_mr_hw_write_mpt(dev->dev, &mmr->mmr, pmpt_entry);
543-
if (!err && flags & IB_MR_REREG_ACCESS)
544-
mmr->mmr.access = mr_access_flags;
546+
if (!err && flags & IB_MR_REREG_ACCESS) {
547+
mmr->access_flags = mr_access_flags;
548+
mmr->mmr.access = convert_access(mr_access_flags);
549+
}
545550

546551
release_mpt_entry:
547552
mlx4_mr_hw_put_mpt(dev->dev, pmpt_entry);

0 commit comments

Comments
 (0)