On Monday 29 June 2009 07:14, Jack Morgenstein wrote:
> >
> On second thought, maybe it would be simpler to just create an
> ipoib_stop_task(),
> and do everything ipoib_stop() does in that workqueue task. leave would thus
> always
> be executed in the workqueue.
>
> Thoughts?
>
Looked at this again. There is a problem with this approach -- If I do
ipoib_stop in
the workqueue, I need to do ipoib_open in the workqueue as well. In
ipoib_open, I will
lose all the error returns if I take this approach:
int ipoib_open(struct net_device *dev)
{
struct ipoib_dev_priv *priv = netdev_priv(dev);
ipoib_dbg(priv, "bringing up interface\n");
napi_enable(&priv->napi);
set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
if (ipoib_pkey_dev_delay_open(dev))
return 0;
if (ipoib_ib_dev_open(dev)) {
napi_disable(&priv->napi);
return -EINVAL;
}
if (ipoib_ib_dev_up(dev)) {
ipoib_ib_dev_stop(dev, 1);
napi_disable(&priv->napi);
return -EINVAL;
}
if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
struct ipoib_dev_priv *cpriv;
/* Bring up any child interfaces too */
mutex_lock(&priv->vlan_mutex);
list_for_each_entry(cpriv, &priv->child_intfs, list) {
int flags;
flags = cpriv->dev->flags;
if (flags & IFF_UP)
continue;
dev_change_flags(cpriv->dev, flags | IFF_UP);
}
mutex_unlock(&priv->vlan_mutex);
}
netif_start_queue(dev);
return 0;
}
I'm very worried that if we do things asymmetrically we will introduce
instability.
Regarding doing only the multicast leave/free in the workqueue -- I do not see
how to do
this cleanly (i.e., everything as is, but simply scheduling a leave-free task).
Yossi, Roland, Eli?
-Jack
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general