mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 23:45:31 +08:00
e8224e4b80
Taking rtnl_lock in ipoib_mcast_join_complete() causes a deadlock with
ipoib_stop(). We avoid it by scheduling the piece of code that takes
the lock on ipoib_workqueue instead of executing it directly. This
works because we only flush the ipoib_workqueue with the RTNL not held.
The deadlock happens because ipoib_stop() calls ipoib_ib_dev_down()
which calls ipoib_mcast_dev_flush(), which calls ipoib_mcast_free(),
which calls ipoib_mcast_leave(). The latter calls
ib_sa_free_multicast(), and this waits until the multicast completion
handler finishes. This handler is ipoib_mcast_join_complete(), which
waits for the rtnl_lock(), which was already taken by ipoib_stop().
This bug was introduced in commit
|
||
---|---|---|
.. | ||
ipoib_cm.c | ||
ipoib_ethtool.c | ||
ipoib_fs.c | ||
ipoib_ib.c | ||
ipoib_main.c | ||
ipoib_multicast.c | ||
ipoib_verbs.c | ||
ipoib_vlan.c | ||
ipoib.h | ||
Kconfig | ||
Makefile |