RDMA/core: Introduce peer memory interface

The peer_memory_client scheme allows a driver to register with the ib_umem
system that it has the ability to understand user virtual address ranges
that are not compatible with get_user_pages(). For instance VMAs created
with io_remap_pfn_range(), or other driver special VMA.

For ranges the interface understands it can provide a DMA mapped sg_table
for use by the ib_umem, allowing user virtual ranges that cannot be
supported by get_user_pages() to be used as umems for RDMA.

This is designed to preserve the kABI, no functions or structures are
changed, only new symbols are added:

 ib_register_peer_memory_client
 ib_unregister_peer_memory_client
 ib_umem_activate_invalidation_notifier
 ib_umem_get_peer

And a bitfield in struct ib_umem uses more bits.

This interface is compatible with the two out of tree GPU drivers:
 https://github.com/RadeonOpenCompute/ROCK-Kernel-Driver/blob/master/drivers/gpu/drm/amd/amdkfd/kfd_peerdirect.c
 https://github.com/Mellanox/nv_peer_memory/blob/master/nv_peer_mem.c

NOTES (remote before sending):
 - The exact locking semantics from the GPU side during invalidation
   are confusing. I've made it sane but perhaps this will hit locking
   problems. Test with lockdep and test invalidation.

   The main difference here is that get_pages and dma_map are called
   from a context that will block progress of invalidation.

   The old design blocked progress of invalidation using a completion for
   unmap and unpin, so those should be proven safe now.

   Since the old design used a completion it doesn't work with lockdep,
   even though it has basically the same blocking semantics.

 - The API exported to the GPU side is crufty and makes very little
   sense. Functionally it should be the same still, but many useless
   things were dropped off

 - I rewrote all the comments please check spelling/grammar

 - Compile tested only

Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Feras Daoud <ferasda@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
12 files changed