***SPAM*** Re: [ofa-general] [PATCH] IB/IPoIB: Decrease the time that invalid paths stay useless

Yossi Etigin yossi.openib at gmail.com
Mon Dec 8 06:38:38 PST 2008


Looks OK to me

Moni Shoua wrote:
> Yossi Etigin wrote:
>>> @@ -360,12 +360,15 @@ void ipoib_mark_paths_invalid(struct net_device
>>> *dev)
>>>      spin_lock_irq(&priv->lock);
>>>  
>>>      list_for_each_entry_safe(path, tp, &priv->path_list, list) {
>>> -        ipoib_dbg(priv, "mark path LID 0x%04x GID " IPOIB_GID_FMT "
>>> invalid\n",
>>> +        ipoib_dbg(priv, "mark path LID 0x%04x GID " IPOIB_GID_FMT "
>>> stale\n",
>>>              be16_to_cpu(path->pathrec.dlid),
>>>              IPOIB_GID_ARG(path->pathrec.dgid));
>>> -        path->valid =  0;
>>> +        path->stale =  1;
>>>      }
>>>  
>>> +    if (!list_empty(&priv->path_list))
>>> +        queue_delayed_work(ipoib_workqueue, &priv->path_refresh_task,
>>> +                    round_jiffies_relative(HZ));
>>>      spin_unlock_irq(&priv->lock);
>>>  }
>>>  
>> What if there is already an outstanding path query on one
>> of the paths you mark stale? ipoib_refresh_paths() will issue another
>> query, making it two
>> queries on the same path. Then, if you bring the device
>> down (call ipoib_flush_paths()) it will wait for completion
>> of one query, causing a crash.
>> _______________________________________________
>> 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
>>
> Thanks. You're right. I think that the change to the patch below should fix what you pointed at
> Do you agree?
> 
> @@ -551,9 +557,29 @@ static int path_rec_start(struct net_device *dev,
>                 return path->query_id;
>         }
> 
> +       path->stale =  0;
>         return 0;
>  }
> 
> +void ipoib_refresh_paths(struct work_struct *work)
> +{
> +       struct ipoib_dev_priv *priv =
> +               container_of(work, struct ipoib_dev_priv, path_refresh_task.work);
> +       struct net_device *dev = priv->dev;
> +       struct ipoib_path *path, *tp;
> +
> +       spin_lock_irq(&priv->lock);
> +       list_for_each_entry_safe(path, tp, &priv->path_list, list) {
> +               ipoib_dbg(priv, "restart path LID 0x%04x GID " IPOIB_GID_FMT "\n",
> +                       be16_to_cpu(path->pathrec.dlid),
> +                       IPOIB_GID_ARG(path->pathrec.dgid));
> +               if (path->stale && !path->query)                 <<<<<<<<<<<<<<<<  CHANGE IS HERE
> +                       path_rec_start(dev, path);
> +       }
> +
> +       spin_unlock_irq(&priv->lock);
> +}
> +
>  static void neigh_add_path(struct sk_buff *skb, struct net_device *dev)
>  {
>         struct ipoib_dev_priv *priv = netdev_priv(dev);
> 
> 



More information about the general mailing list