[ofa-general] Re: [PATCH v2] ipoib: fix hang while bringing down uninitialized interface

Roland Dreier rdreier at cisco.com
Fri Oct 10 11:58:52 PDT 2008


 > Fix bug #1172: If a pkey for an interface is not found during
 > initialization, then poll_timer is left uninitialized. When the
 > device is brought down, ipoib tries to del_timer_sync() it. This
 > call hangs in an infinite loop in lock_timer_base(), because
 > timer_base is NULL. We should check whether the timer was really
 > initialized.

Sorry for being so slow to get to this.

But does it work to just make sure the timer is always initialized?
Seems cleaner that way, and it makes the code an insignificant bit
smaller as a bonus.  ie does the patch below fix things too?

 drivers/infiniband/ulp/ipoib/ipoib_ib.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 0e748ae..28eb6f0 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -685,10 +685,6 @@ int ipoib_ib_dev_open(struct net_device *dev)
 	queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task,
 			   round_jiffies_relative(HZ));
 
-	init_timer(&priv->poll_timer);
-	priv->poll_timer.function = ipoib_ib_tx_timer_func;
-	priv->poll_timer.data = (unsigned long)dev;
-
 	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 
 	return 0;
@@ -906,6 +902,9 @@ int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port)
 		return -ENODEV;
 	}
 
+	setup_timer(&priv->poll_timer, ipoib_ib_tx_timer_func,
+		    (unsigned long) dev);
+
 	if (dev->flags & IFF_UP) {
 		if (ipoib_ib_dev_open(dev)) {
 			ipoib_transport_dev_cleanup(dev);



More information about the general mailing list