Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e07832b66285124038a96b25a2056e91a55d8b1e
Commit:     e07832b66285124038a96b25a2056e91a55d8b1e
Parent:     60a596dab7c82bdfa5ee7abcee8e0ce385d4ef21
Author:     Sean Hefty <[EMAIL PROTECTED]>
AuthorDate: Mon Mar 19 14:31:36 2007 -0800
Committer:  Roland Dreier <[EMAIL PROTECTED]>
CommitDate: Thu Mar 22 14:32:09 2007 -0700

    IPoIB: Fix race in detaching from mcast group before attaching
    
    There's a race between ipoib_mcast_leave() and ipoib_mcast_join_finish()
    where we can try to detach from a multicast group before we've
    attached to it.  Fix this by reordering the code in ipoib_mcast_leave
    to free the multicast group first, which waits for the multicast
    callback thread (which calls ipoib_mcast_join_finish()) to complete
    before detaching from the group.
    
    Signed-off-by: Sean Hefty <[EMAIL PROTECTED]>
    Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 
b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index 56c87a8..54fbead 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -644,6 +644,9 @@ static int ipoib_mcast_leave(struct net_device *dev, struct 
ipoib_mcast *mcast)
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        int ret = 0;
 
+       if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
+               ib_sa_free_multicast(mcast->mc);
+
        if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
                ipoib_dbg_mcast(priv, "leaving MGID " IPOIB_GID_FMT "\n",
                                IPOIB_GID_ARG(mcast->mcmember.mgid));
@@ -655,9 +658,6 @@ static int ipoib_mcast_leave(struct net_device *dev, struct 
ipoib_mcast *mcast)
                        ipoib_warn(priv, "ipoib_mcast_detach failed (result = 
%d)\n", ret);
        }
 
-       if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
-               ib_sa_free_multicast(mcast->mc);
-
        return 0;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to