IPoIB: Fix AB-BA deadlock when deleting neighbours
authorShlomo Pongratz <shlomop@mellanox.com>
Wed, 29 Aug 2012 15:14:34 +0000 (15:14 +0000)
committerRoland Dreier <roland@purestorage.com>
Wed, 12 Sep 2012 16:21:45 +0000 (09:21 -0700)
commitb5120a6e11e90d98d8a752545ac60bfa1ea95f1a
treef376dd84bf679fb2b3ed5ae18af967455a75a958
parent66172c09938bfc4efdcf9b5e0246a85b9b76dd54
IPoIB: Fix AB-BA deadlock when deleting neighbours

Lockdep points out a circular locking dependency betwwen the ipoib
device priv spinlock (priv->lock) and the neighbour table rwlock
(ntbl->rwlock).

In the normal path, ie neigbour garbage collection task, the neigh
table rwlock is taken first and then if the neighbour needs to be
deleted, priv->lock is taken.

However in some error paths, such as in ipoib_cm_handle_tx_wc(),
priv->lock is taken first and then ipoib_neigh_free routine is called
which in turn takes the neighbour table ntbl->rwlock.

The solution is to get rid the neigh table rwlock completely and use
only priv->lock.

Signed-off-by: Shlomo Pongratz <shlomop@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/ulp/ipoib/ipoib.h
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_multicast.c