[ofa-general] [PATCH] IB/IPoIB: Don't let a bad muticast address in the join list stop subsequent joins
Moni Shoua
monis at Voltaire.COM
Tue Jul 7 02:34:55 PDT 2009
Yossi Etigin wrote:
> Moni Shoua wrote:
>> diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
>> index a0e9753..024fd18 100644
>> --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
>> +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
>> @@ -379,6 +379,7 @@ static int ipoib_mcast_join_complete(int status,
>> struct ipoib_mcast *mcast = multicast->context;
>> struct net_device *dev = mcast->dev;
>> struct ipoib_dev_priv *priv = netdev_priv(dev);
>> + struct ipoib_mcast *next_mcast;
>>
>> ipoib_dbg_mcast(priv, "join completion for %pI6 (status %d)\n",
>> mcast->mcmember.mgid.raw, status);
>> @@ -427,9 +428,16 @@ static int ipoib_mcast_join_complete(int status,
>>
>> mutex_lock(&mcast_mutex);
>> spin_lock_irq(&priv->lock);
>> - if (test_bit(IPOIB_MCAST_RUN, &priv->flags))
>> - queue_delayed_work(ipoib_workqueue, &priv->mcast_task,
>> - mcast->backoff * HZ);
>> + if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) {
>> + list_for_each_entry(next_mcast, &priv->multicast_list, list) {
>> + if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &next_mcast->flags)
>> + && !test_bit(IPOIB_MCAST_FLAG_BUSY, &next_mcast->flags)
>> + && !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &next_mcast->flags))
>> + break;
>> + }
>> + queue_delayed_work(ipoib_workqueue, &priv->mcast_join_task,
>> + next_mcast->backoff * HZ);
>> + }
>> spin_unlock_irq(&priv->lock);
>> mutex_unlock(&mcast_mutex);
>>
>
> The scan is only done to get the backoff to use, right?
Yes
>
> You should also check (&next_mcast->list != &priv->multicast_list) to make sure
> something is really found. For example the device might be flushed and priv->multicast_list
> become empty (emptying the multicast list does not wait for the query to finish).
You are right.
>
>> @@ -577,6 +585,9 @@ void ipoib_mcast_join_task(struct work_struct *work)
>> break;
>> }
>>
>> + if (!list_is_last(&mcast->list, &priv->multicast_list))
>> + list_move_tail(&mcast->list, &priv->multicast_list);
>> +
>> ipoib_mcast_join(dev, mcast, 1);
>> return;
>> }
>
> I don't think the list_is_last() check is really needed here.
It's just to prevent from doing nothing.
> And isn't priv->lock required for priv->multicast_list modifications?
You are right again.
>
> --Yossi
> _______________________________________________
> general mailing list
> general at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
>
> To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
>
More information about the general
mailing list