Clean up if ipoib_ib_post_receives returns an error code.
Rename ipoib_ib_dev_stop to ipoib_reset_qp and call that if posting receive work
requests fails.

Signed-off-by: Eli Cohen <[EMAIL PROTECTED]>
Signed-off-by: Michael S. Tsirkin <[EMAIL PROTECTED]>

Index: latest/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
--- latest.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ latest/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -391,83 +391,6 @@ static void __ipoib_reap_ah(struct net_d
        }
 }
 
-void ipoib_reap_ah(void *dev_ptr)
-{
-       struct net_device *dev = dev_ptr;
-       struct ipoib_dev_priv *priv = netdev_priv(dev);
-
-       __ipoib_reap_ah(dev);
-
-       if (!test_bit(IPOIB_STOP_REAPER, &priv->flags))
-               queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ);
-}
-
-int ipoib_ib_dev_open(struct net_device *dev)
-{
-       struct ipoib_dev_priv *priv = netdev_priv(dev);
-       int ret;
-
-       ret = ipoib_init_qp(dev);
-       if (ret) {
-               ipoib_warn(priv, "ipoib_init_qp returned %d\n", ret);
-               return -1;
-       }
-
-       ret = ipoib_ib_post_receives(dev);
-       if (ret) {
-               ipoib_warn(priv, "ipoib_ib_post_receives returned %d\n", ret);
-               return -1;
-       }
-
-       clear_bit(IPOIB_STOP_REAPER, &priv->flags);
-       queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ);
-
-       return 0;
-}
-
-int ipoib_ib_dev_up(struct net_device *dev)
-{
-       struct ipoib_dev_priv *priv = netdev_priv(dev);
-
-       set_bit(IPOIB_FLAG_OPER_UP, &priv->flags);
-
-       return ipoib_mcast_start_thread(dev);
-}
-
-int ipoib_ib_dev_down(struct net_device *dev)
-{
-       struct ipoib_dev_priv *priv = netdev_priv(dev);
-
-       ipoib_dbg(priv, "downing ib_dev\n");
-
-       clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags);
-       netif_carrier_off(dev);
-
-       /* Shutdown the P_Key thread if still active */
-       if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) {
-               down(&pkey_sem);
-               set_bit(IPOIB_PKEY_STOP, &priv->flags);
-               cancel_delayed_work(&priv->pkey_task);
-               up(&pkey_sem);
-               flush_workqueue(ipoib_workqueue);
-       }
-
-       ipoib_mcast_stop_thread(dev, 1);
-
-       /*
-        * Flush the multicast groups first so we stop any multicast joins. The
-        * completion thread may have already died and we may deadlock waiting
-        * for the completion thread to finish some multicast joins.
-        */
-       ipoib_mcast_dev_flush(dev);
-
-       /* Delete broadcast and local addresses since they will be recreated */
-       ipoib_mcast_dev_down(dev);
-
-       ipoib_flush_paths(dev);
-
-       return 0;
-}
 
 static int recvs_pending(struct net_device *dev)
 {
@@ -482,7 +405,8 @@ static int recvs_pending(struct net_devi
        return pending;
 }
 
-int ipoib_ib_dev_stop(struct net_device *dev)
+
+static int ipoib_reset_qp(struct net_device *dev)
 {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        struct ib_qp_attr qp_attr;
@@ -564,6 +488,94 @@ timeout:
        }
 
        return 0;
+
+}
+
+
+void ipoib_reap_ah(void *dev_ptr)
+{
+       struct net_device *dev = dev_ptr;
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+
+       __ipoib_reap_ah(dev);
+
+       if (!test_bit(IPOIB_STOP_REAPER, &priv->flags))
+               queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ);
+}
+
+int ipoib_ib_dev_open(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       int ret;
+
+       ret = ipoib_init_qp(dev);
+       if (ret) {
+               ipoib_warn(priv, "ipoib_init_qp returned %d\n", ret);
+               return -1;
+       }
+
+       ret = ipoib_ib_post_receives(dev);
+       if (ret) {
+               ipoib_warn(priv, "ipoib_ib_post_receives returned %d\n", ret);
+               goto error;
+       }
+
+       clear_bit(IPOIB_STOP_REAPER, &priv->flags);
+       queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ);
+
+       return 0;
+error:
+       ipoib_reset_qp(dev);
+       return ret;
+}
+
+int ipoib_ib_dev_up(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+
+       set_bit(IPOIB_FLAG_OPER_UP, &priv->flags);
+
+       return ipoib_mcast_start_thread(dev);
+}
+
+int ipoib_ib_dev_down(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+
+       ipoib_dbg(priv, "downing ib_dev\n");
+
+       clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags);
+       netif_carrier_off(dev);
+
+       /* Shutdown the P_Key thread if still active */
+       if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) {
+               down(&pkey_sem);
+               set_bit(IPOIB_PKEY_STOP, &priv->flags);
+               cancel_delayed_work(&priv->pkey_task);
+               up(&pkey_sem);
+               flush_workqueue(ipoib_workqueue);
+       }
+
+       ipoib_mcast_stop_thread(dev, 1);
+
+       /*
+        * Flush the multicast groups first so we stop any multicast joins. The
+        * completion thread may have already died and we may deadlock waiting
+        * for the completion thread to finish some multicast joins.
+        */
+       ipoib_mcast_dev_flush(dev);
+
+       /* Delete broadcast and local addresses since they will be recreated */
+       ipoib_mcast_dev_down(dev);
+
+       ipoib_flush_paths(dev);
+
+       return 0;
+}
+
+int ipoib_ib_dev_stop(struct net_device *dev)
+{
+       return ipoib_reset_qp(dev);
 }
 
 int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port)

-- 
MST
_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to