• Jason Gunthorpe's avatar
    RDMA/devices: Re-organize device.c locking · 921eab11
    Jason Gunthorpe authored
    The locking here started out with a single lock that covered everything
    and then has lately veered into crazy town.
    
    The fundamental problem is that several places need to iterate over a
    linked list, but also need to drop their locks to avoid deadlock during
    client callbacks.
    
    xarray's restartable iteration offers a simple solution to the
    problem. Once all the lists are xarrays we can drop locks in the places
    that need that and rely on xarray to provide consistency and locking for
    the data structure.
    
    The resulting simplification is that each of the three lists has a
    dedicated rwsem that must be held when working with the list it
    covers. One data structure is no longer covered by multiple locks.
    
    The sleeping semaphore is selected because the read side generally needs
    to be held over something sleeping, and using RCU reader locking in those
    cases is overkill.
    
    In the process this simplifies the entire registration/unregistration flow
    to be the expected list of setups and the reversed list of matching
    teardowns, and the registration lock 'refcount' can now be revised to be
    released after the ULPs are removed, providing a very sane semantic for
    this feature.
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    921eab11
ib_verbs.h 123 KB