• Jason Gunthorpe's avatar
    RDMA/mlx5: Fix handling of IOVA != user_va in ODP paths · 8ffc3248
    Jason Gunthorpe authored
    Till recently it was not possible for userspace to specify a different
    IOVA, but with the new ibv_reg_mr_iova() library call this can be done.
    
    To compute the user_va we must compute:
      user_va = (iova - iova_start) + user_va_start
    
    while being cautious of overflow and other math problems.
    
    The iova is not reliably stored in the mmkey when the MR is created. Only
    the cached creation path (the common one) set it, so it must also be set
    when creating uncached MRs.
    
    Fix the weird use of iova when computing the starting page index in the
    MR. In the normal case, when iova == umem.address:
      iova & (~(BIT(page_shift) - 1)) ==
      ALIGN_DOWN(umem.address, odp->page_size) ==
      ib_umem_start(odp)
    
    And when iova is different using it in math with a user_va is wrong.
    
    Finally, do not allow an implicit ODP to be created with a non-zero IOVA
    as we have no support for that.
    
    Fixes: 7bdf65d4 ("IB/mlx5: Handle page faults")
    Signed-off-by: default avatarMoni Shoua <monis@mellanox.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
    8ffc3248
odp.c 48.3 KB