[openib-general] [PATCH] ipoib_ib_post_receives error handling
Michael S. Tsirkin
mst at mellanox.co.il
Wed Jan 4 04:13:03 PST 2006
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 <eli at mellanox.co.il>
Signed-off-by: Michael S. Tsirkin <mst at mellanox.co.il>
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
More information about the general
mailing list