diff options
author | Jason Gunthorpe <jgg@mellanox.com> | 2019-10-01 11:38:16 -0400 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2019-10-04 14:54:21 -0400 |
commit | 880505cfef1d086d18b59d2920eb2160429ffa1f (patch) | |
tree | a8762b59e316f0f342e4845b77f1f446188841a3 | |
parent | 1cbe866cbcb53338de33cf67262e73f9315a9725 (diff) |
RDMA/mlx5: Do not allow rereg of a ODP MR
This code is completely broken, the umem of a ODP MR simply cannot be
discarded without a lot more locking, nor can an ODP mkey be blithely
destroyed via destroy_mkey().
Fixes: 6aec21f6a832 ("IB/mlx5: Page faults handling infrastructure")
Link: https://lore.kernel.org/r/20191001153821.23621-2-jgg@ziepe.ca
Reviewed-by: Artemy Kovalyov <artemyko@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
-rw-r--r-- | drivers/infiniband/hw/mlx5/mr.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 1eff031ef048..e7f840f306e4 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c | |||
@@ -1441,6 +1441,9 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, | |||
1441 | if (!mr->umem) | 1441 | if (!mr->umem) |
1442 | return -EINVAL; | 1442 | return -EINVAL; |
1443 | 1443 | ||
1444 | if (is_odp_mr(mr)) | ||
1445 | return -EOPNOTSUPP; | ||
1446 | |||
1444 | if (flags & IB_MR_REREG_TRANS) { | 1447 | if (flags & IB_MR_REREG_TRANS) { |
1445 | addr = virt_addr; | 1448 | addr = virt_addr; |
1446 | len = length; | 1449 | len = length; |
@@ -1486,8 +1489,6 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, | |||
1486 | } | 1489 | } |
1487 | 1490 | ||
1488 | mr->allocated_from_cache = 0; | 1491 | mr->allocated_from_cache = 0; |
1489 | if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) | ||
1490 | mr->live = 1; | ||
1491 | } else { | 1492 | } else { |
1492 | /* | 1493 | /* |
1493 | * Send a UMR WQE | 1494 | * Send a UMR WQE |
@@ -1516,7 +1517,6 @@ int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, | |||
1516 | 1517 | ||
1517 | set_mr_fields(dev, mr, npages, len, access_flags); | 1518 | set_mr_fields(dev, mr, npages, len, access_flags); |
1518 | 1519 | ||
1519 | update_odp_mr(mr); | ||
1520 | return 0; | 1520 | return 0; |
1521 | 1521 | ||
1522 | err: | 1522 | err: |