summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gunthorpe <jgg@mellanox.com>2019-10-01 11:38:16 -0400
committerJason Gunthorpe <jgg@mellanox.com>2019-10-04 14:54:21 -0400
commit880505cfef1d086d18b59d2920eb2160429ffa1f (patch)
treea8762b59e316f0f342e4845b77f1f446188841a3
parent1cbe866cbcb53338de33cf67262e73f9315a9725 (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.c6
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
1522err: 1522err: