From 96da5e253024d48762b6ca0ae0c105203cfb6d48 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Thu, 5 Jul 2012 21:08:05 -0700 Subject: [PATCH] --- yaml --- r: 314999 b: refs/heads/master c: 700db99d0140e9da2a31e08ebd3e1b121691aa26 h: refs/heads/master i: 314997: fd2a1d84346da9212c9ba8a9f392a64404a0a924 314995: d59e7d318fb750c5790034057d2322015b7f5f5e 314991: 46df32f79bc1c3d8db11250efeae1c8cbf419f1f v: v3 --- [refs] | 2 +- .../infiniband/ulp/ipoib/ipoib_multicast.c | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 68fbaa5cb8a8..e4aa7f15cc60 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a2de86f63cfc92f7aaf11e7b9d9f2150946a1622 +refs/heads/master: 700db99d0140e9da2a31e08ebd3e1b121691aa26 diff --git a/trunk/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/trunk/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index fbb95ee538b2..7cecb16d3d48 100644 --- a/trunk/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/trunk/drivers/infiniband/ulp/ipoib/ipoib_multicast.c @@ -658,9 +658,15 @@ static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb) { struct ipoib_dev_priv *priv = netdev_priv(dev); + struct dst_entry *dst = skb_dst(skb); struct ipoib_mcast *mcast; + struct neighbour *n; unsigned long flags; + n = NULL; + if (dst) + n = dst_neigh_lookup_skb(dst, skb); + spin_lock_irqsave(&priv->lock, flags); if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) || @@ -715,12 +721,6 @@ void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb) out: if (mcast && mcast->ah) { - struct dst_entry *dst = skb_dst(skb); - struct neighbour *n = NULL; - - rcu_read_lock(); - if (dst) - n = dst_neigh_lookup_skb(dst, skb); if (n) { if (!*to_ipoib_neigh(n)) { struct ipoib_neigh *neigh; @@ -735,13 +735,14 @@ void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb) } neigh_release(n); } - rcu_read_unlock(); spin_unlock_irqrestore(&priv->lock, flags); ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN); return; } unlock: + if (n) + neigh_release(n); spin_unlock_irqrestore(&priv->lock, flags); }