IPoIB: Always initialize poll_timer to avoid crash on unload
authorRoland Dreier <rolandd@cisco.com>
Fri, 10 Oct 2008 22:58:52 +0000 (15:58 -0700)
committerRoland Dreier <rolandd@cisco.com>
Fri, 10 Oct 2008 22:58:52 +0000 (15:58 -0700)
ipoib_ib_dev_stop() does del_timer_sync(&priv->poll_timer), but if a
P_key for an interface is not found, poll_timer is not initialized, so
this leads to a crash or hang.  Fix this by moving where poll_timer is
initialized to ipoib_ib_dev_init(), which is always called.

This fixes <https://bugs.openfabrics.org/show_bug.cgi?id=1172>.

Debugged-by: Yosef Etigin <yosefe@voltaire.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/ulp/ipoib/ipoib_ib.c

index 0e748aeeae99fe830eb3c9e1c1e8bd96461ba30a..28eb6f03c588987c1c417377205e53b34b2f5058 100644 (file)
@@ -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);