diff options
author | Shlomo Pongratz <shlomop@mellanox.com> | 2012-08-29 17:14:34 +0200 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2012-09-12 18:21:45 +0200 |
commit | b5120a6e11e90d98d8a752545ac60bfa1ea95f1a (patch) | |
tree | f376dd84bf679fb2b3ed5ae18af967455a75a958 /drivers/infiniband/ulp/ipoib/ipoib.h | |
parent | IPoIB: Fix memory leak in the neigh table deletion flow (diff) | |
download | linux-b5120a6e11e90d98d8a752545ac60bfa1ea95f1a.tar.xz linux-b5120a6e11e90d98d8a752545ac60bfa1ea95f1a.zip |
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>
Diffstat (limited to 'drivers/infiniband/ulp/ipoib/ipoib.h')
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib.h | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index e6bbeae1c309..0af216d21f87 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h @@ -274,7 +274,6 @@ struct ipoib_neigh_hash { struct ipoib_neigh_table { struct ipoib_neigh_hash __rcu *htbl; - rwlock_t rwlock; atomic_t entries; struct completion flushed; struct completion deleted; |