IB: Fix RCU lockdep splats
Commit f2c31e32b3
("net: fix NULL dereferences in check_peer_redir()")
forgot to take care of infiniband uses of dst neighbours.
Many thanks to Marc Aurele who provided a nice bug report and feedback.
Reported-by: Marc Aurele La France <tsi@ualberta.ca>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Cc: David Miller <davem@davemloft.net>
Cc: <stable@kernel.org>
Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:

committed by
Roland Dreier

parent
1ea6b8f489
commit
580da35a31
@@ -266,7 +266,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
|
||||
|
||||
skb->dev = dev;
|
||||
if (dst)
|
||||
n = dst_get_neighbour(dst);
|
||||
n = dst_get_neighbour_raw(dst);
|
||||
if (!dst || !n) {
|
||||
/* put pseudoheader back on for next time */
|
||||
skb_push(skb, sizeof (struct ipoib_pseudoheader));
|
||||
@@ -722,6 +722,8 @@ out:
|
||||
if (mcast && mcast->ah) {
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct neighbour *n = NULL;
|
||||
|
||||
rcu_read_lock();
|
||||
if (dst)
|
||||
n = dst_get_neighbour(dst);
|
||||
if (n && !*to_ipoib_neigh(n)) {
|
||||
@@ -734,7 +736,7 @@ out:
|
||||
list_add_tail(&neigh->list, &mcast->neigh_list);
|
||||
}
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN);
|
||||
return;
|
||||
|
Reference in New Issue
Block a user