aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/core/fmr_pool.c
diff options
context:
space:
mode:
authorRoland Dreier <rolandd@cisco.com>2008-01-25 14:15:42 -0800
committerRoland Dreier <rolandd@cisco.com>2008-01-25 14:15:42 -0800
commit2fe7e6f7c9f55eac24c5b3cdf56af29ab9b0ca81 (patch)
tree0e3712ae9033d133e839a22ac28144215a7ece4a /drivers/infiniband/core/fmr_pool.c
parentIB/ipath: Fix some sparse warnings about shadowed symbols (diff)
downloadlinux-dev-2fe7e6f7c9f55eac24c5b3cdf56af29ab9b0ca81.tar.xz
linux-dev-2fe7e6f7c9f55eac24c5b3cdf56af29ab9b0ca81.zip
IB/umad: Simplify and fix locking
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: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/core/fmr_pool.c')
0 files changed, 0 insertions, 0 deletions