[ofa-general] Re: [RFC] [PATCH v3] IB/ipoib: Add bonding support to IPoIB
Moni Shoua
monisonlists at gmail.com
Tue Mar 13 02:39:00 PDT 2007
Michael S. Tsirkin wrote:
> Another question.
>
>> @@ -769,32 +768,32 @@ static void ipoib_set_mcast_list(struct
>> static void ipoib_neigh_destructor(struct neighbour *n)
>> {
>> struct ipoib_neigh *neigh;
>> - struct ipoib_dev_priv *priv = netdev_priv(n->dev);
>> + struct ipoib_dev_priv *priv;
>> unsigned long flags;
>> struct ipoib_ah *ah = NULL;
>>
>> - ipoib_dbg(priv,
>> - "neigh_destructor for %06x " IPOIB_GID_FMT "\n",
>> - IPOIB_QPN(n->ha),
>> - IPOIB_GID_RAW_ARG(n->ha + 4));
>> -
>> - spin_lock_irqsave(&priv->lock, flags);
>>
>> neigh = *to_ipoib_neigh(n);
>> if (neigh) {
>> + priv = netdev_priv(neigh->dev);
>> + ipoib_dbg(priv,
>> + "neigh_destructor for %06x " IPOIB_GID_FMT "\n",
>> + IPOIB_QPN(n->ha),
>> + IPOIB_GID_RAW_ARG(n->ha + 4));
>> +
>> + spin_lock_irqsave(&priv->lock, flags);
>> if (neigh->ah)
>> ah = neigh->ah;
>> list_del(&neigh->list);
>> ipoib_neigh_free(n->dev, neigh);
>> + spin_unlock_irqrestore(&priv->lock, flags);
>> }
>> -
>> - spin_unlock_irqrestore(&priv->lock, flags);
>> -
>> if (ah)
>> ipoib_put_ah(ah);
>> }
>
> Using to_ipoib_neigh outside priv->lock looks problematic.
> Can you convince me this does not introduce new races?
>
>
I can try...
ipoib_neigh_destructor is called from neigh_destroy() and this is when the kernel neighbour
is under destruction itself and no one holds a reference to it.
My opinion is that if I can't assume that no one is touching ipoib_neigh when kernel
neighbour is being destroyed then we have a bigger problem.
More information about the general
mailing list