• R
    IB/umad: Simplify and fix locking · 2fe7e6f7
    Roland Dreier 提交于
    In addition to being overly complex, the locking in user_mad.c is
    broken: there were multiple reports of deadlocks and lockdep warnings.
    In particular it seems that a single thread may end up trying to take
    the same rwsem for reading more than once, which is explicitly
    forbidden in the comments in <linux/rwsem.h>.
    
    To solve this, we change the locking to use plain mutexes instead of
    rwsems.  There is one mutex per open file, which protects the contents
    of the struct ib_umad_file, including the array of agents and list of
    queued packets; and there is one mutex per struct ib_umad_port, which
    protects the contents, including the list of open files.  We never
    hold the file mutex across calls to functions like ib_unregister_mad_agent(),
    which can call back into other ib_umad code to queue a packet, and we
    always hold the port mutex as long as we need to make sure that a
    device is not hot-unplugged from under us.
    
    This even makes things nicer for users of the -rt patch, since we
    remove calls to downgrade_write() (which is not implemented in -rt).
    Signed-off-by: NRoland Dreier <rolandd@cisco.com>
    2fe7e6f7
user_mad.c 29.7 KB