mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 18:21:24 +02:00
IB/mlx4: Fill in the access_flags if IB_MR_REREG_ACCESS is not specified
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: 9376932d0c ("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>
This commit is contained in:
parent
54bf38b27a
commit
bade9a3150
|
|
@ -136,6 +136,7 @@ struct mlx4_ib_mr {
|
|||
dma_addr_t page_map;
|
||||
u32 npages;
|
||||
u32 max_pages;
|
||||
int access_flags;
|
||||
struct mlx4_mr mmr;
|
||||
struct ib_umem *umem;
|
||||
size_t page_map_size;
|
||||
|
|
|
|||
|
|
@ -181,6 +181,7 @@ struct ib_mr *mlx4_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
|
|||
if (err)
|
||||
goto err_mr;
|
||||
|
||||
mr->access_flags = access_flags;
|
||||
mr->ibmr.rkey = mr->ibmr.lkey = mr->mmr.key;
|
||||
mr->ibmr.page_size = 1U << shift;
|
||||
|
||||
|
|
@ -237,6 +238,8 @@ struct ib_mr *mlx4_ib_rereg_user_mr(struct ib_mr *mr, int flags, u64 start,
|
|||
|
||||
if (err)
|
||||
goto release_mpt_entry;
|
||||
} else {
|
||||
mr_access_flags = mmr->access_flags;
|
||||
}
|
||||
|
||||
if (flags & IB_MR_REREG_TRANS) {
|
||||
|
|
@ -278,8 +281,10 @@ struct ib_mr *mlx4_ib_rereg_user_mr(struct ib_mr *mr, int flags, u64 start,
|
|||
* return a failure. But dereg_mr will free the resources.
|
||||
*/
|
||||
err = mlx4_mr_hw_write_mpt(dev->dev, &mmr->mmr, pmpt_entry);
|
||||
if (!err && flags & IB_MR_REREG_ACCESS)
|
||||
mmr->mmr.access = mr_access_flags;
|
||||
if (!err && flags & IB_MR_REREG_ACCESS) {
|
||||
mmr->access_flags = mr_access_flags;
|
||||
mmr->mmr.access = convert_access(mr_access_flags);
|
||||
}
|
||||
|
||||
release_mpt_entry:
|
||||
mlx4_mr_hw_put_mpt(dev->dev, pmpt_entry);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user