IPoIB: Do not join broadcast group if interface is brought down
authorYossi Etigin <yosefe@Voltaire.COM>
Tue, 13 Jan 2009 03:28:42 +0000 (19:28 -0800)
committerRoland Dreier <rolandd@cisco.com>
Tue, 13 Jan 2009 03:28:42 +0000 (19:28 -0800)
Because the ipoib_workqueue is not flushed when ipoib interface is
brought down, ipoib_mcast_join() may trigger a join to the broadcast
group after priv->broadcast was set to NULL (during cleanup).  This
will cause the system to be a member of the broadcast group when
interface is down.  As a side effect, this breaks the optimization of
setting the Q_key only when joining the broadcast group.

Signed-off-by: Yossi Etigin <yosefe@voltaire.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/ulp/ipoib/ipoib_multicast.c

index a2eb3b9789ebabb08f69f3b0421128900db22bd6..59d02e0b8df168aa8698e56008bdfc5f518282bb 100644 (file)
@@ -529,6 +529,9 @@ void ipoib_mcast_join_task(struct work_struct *work)
        if (!priv->broadcast) {
                struct ipoib_mcast *broadcast;
 
+               if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
+                       return;
+
                broadcast = ipoib_mcast_alloc(dev, 1);
                if (!broadcast) {
                        ipoib_warn(priv, "failed to allocate broadcast group\n");