• Jason Gunthorpe's avatar
    RDMA/mlx5: Do not race with mlx5_ib_invalidate_range during create and destroy · 09689703
    Jason Gunthorpe authored
    For creation, as soon as the umem_odp is created the notifier can be
    called, however the underlying MR may not have been setup yet. This would
    cause problems if mlx5_ib_invalidate_range() runs. There is some
    confusing/ulocked/racy code that might by trying to solve this, but
    without locks it isn't going to work right.
    
    Instead trivially solve the problem by short-circuiting the invalidation
    if there are not yet any DMA mapped pages. By definition there is nothing
    to invalidate in this case.
    
    The create code will have the umem fully setup before anything is DMA
    mapped, and npages is fully locked by the umem_mutex.
    
    For destroy, invalidate the entire MR at the HW to stop DMA then DMA unmap
    the pages before destroying the MR. This drives npages to zero and
    prevents similar racing with invalidate while the MR is undergoing
    destruction.
    
    Arguably it would be better if the umem was created after the MR and
    destroyed before, but that would require a big rework of the MR code.
    
    Fixes: 6aec21f6 ("IB/mlx5: Page faults handling infrastructure")
    Link: https://lore.kernel.org/r/20191009160934.3143-15-jgg@ziepe.caReviewed-by: default avatarArtemy Kovalyov <artemyko@mellanox.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    09689703
mlx5_ib.h 42.6 KB