diff options
author | 2019-10-01 12:38:18 -0300 | |
---|---|---|
committer | 2019-10-04 15:54:21 -0300 | |
commit | 9dc775e7f5508f848661bbfb2e15683affb85f24 (patch) | |
tree | aeb8c269379663f95cb5a03a9d2b1a7b264d8a01 /virt | |
parent | RDMA/mlx5: Fix a race with mlx5_ib_update_xlt on an implicit MR (diff) | |
download | linux-9dc775e7f5508f848661bbfb2e15683affb85f24.tar.gz linux-9dc775e7f5508f848661bbfb2e15683affb85f24.tar.bz2 linux-9dc775e7f5508f848661bbfb2e15683affb85f24.zip |
RDMA/odp: Lift umem_mutex out of ib_umem_odp_unmap_dma_pages()
This fixes a race of the form:
CPU0 CPU1
mlx5_ib_invalidate_range() mlx5_ib_invalidate_range()
// This one actually makes npages == 0
ib_umem_odp_unmap_dma_pages()
if (npages == 0 && !dying)
// This one does nothing
ib_umem_odp_unmap_dma_pages()
if (npages == 0 && !dying)
dying = 1;
dying = 1;
schedule_work(&umem_odp->work);
// Double schedule of the same work
schedule_work(&umem_odp->work); // BOOM
npages and dying must be read and written under the umem_mutex lock.
Since whenever ib_umem_odp_unmap_dma_pages() is called mlx5 must also call
mlx5_ib_update_xlt, and both need to be done in the same locking region,
hoist the lock out of unmap.
This avoids an expensive double critical section in
mlx5_ib_invalidate_range().
Fixes: 81713d3788d2 ("IB/mlx5: Add implicit MR support")
Link: https://lore.kernel.org/r/20191001153821.23621-4-jgg@ziepe.ca
Reviewed-by: Artemy Kovalyov <artemyko@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Diffstat (limited to 'virt')
0 files changed, 0 insertions, 0 deletions