]> git.openfabrics.org - ~emulex/compat-rdma_3.12.git/commitdiff
RDMA/nes: Fix for terminate timer crash
authorTatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Sun, 25 Nov 2012 06:49:16 +0000 (00:49 -0600)
committerVladimir Sokolovsky <vlad@mellanox.com>
Sun, 25 Nov 2012 09:54:24 +0000 (11:54 +0200)
Fix for terminate timer crash.

Signed-off-by: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com>
linux-next-pending/0030-RDMA-nes-Fix-for-initializing-terminate-timer.patch [new file with mode: 0644]

diff --git a/linux-next-pending/0030-RDMA-nes-Fix-for-initializing-terminate-timer.patch b/linux-next-pending/0030-RDMA-nes-Fix-for-initializing-terminate-timer.patch
new file mode 100644 (file)
index 0000000..16be677
--- /dev/null
@@ -0,0 +1,81 @@
+Fix for terminate timer crash.
+Nes terminate timer needs to be initialized just once.
+
+Signed-off-by: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com>
+---
+ drivers/infiniband/hw/nes/nes.h       |    1 +
+ drivers/infiniband/hw/nes/nes_hw.c    |    9 ++-------
+ drivers/infiniband/hw/nes/nes_verbs.c |    4 +++-
+ 3 files changed, 6 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h
+index 5cac29e..33cc589 100644
+--- a/drivers/infiniband/hw/nes/nes.h
++++ b/drivers/infiniband/hw/nes/nes.h
+@@ -532,6 +532,7 @@ void nes_iwarp_ce_handler(struct nes_device *, struct nes_hw_cq *);
+ int nes_destroy_cqp(struct nes_device *);
+ int nes_nic_cm_xmit(struct sk_buff *, struct net_device *);
+ void nes_recheck_link_status(struct work_struct *work);
++void nes_terminate_timeout(unsigned long context);
+ /* nes_nic.c */
+ struct net_device *nes_netdev_init(struct nes_device *, void __iomem *);
+diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c
+index fe7965e..67647e2 100644
+--- a/drivers/infiniband/hw/nes/nes_hw.c
++++ b/drivers/infiniband/hw/nes/nes_hw.c
+@@ -75,7 +75,6 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev,
+ static void process_critical_error(struct nes_device *nesdev);
+ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number);
+ static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode);
+-static void nes_terminate_timeout(unsigned long context);
+ static void nes_terminate_start_timer(struct nes_qp *nesqp);
+ #ifdef CONFIG_INFINIBAND_NES_DEBUG
+@@ -3520,7 +3519,7 @@ static void nes_terminate_received(struct nes_device *nesdev,
+ }
+ /* Timeout routine in case terminate fails to complete */
+-static void nes_terminate_timeout(unsigned long context)
++void nes_terminate_timeout(unsigned long context)
+ {
+       struct nes_qp *nesqp = (struct nes_qp *)(unsigned long)context;
+@@ -3530,11 +3529,7 @@ static void nes_terminate_timeout(unsigned long context)
+ /* Set a timer in case hw cannot complete the terminate sequence */
+ static void nes_terminate_start_timer(struct nes_qp *nesqp)
+ {
+-      init_timer(&nesqp->terminate_timer);
+-      nesqp->terminate_timer.function = nes_terminate_timeout;
+-      nesqp->terminate_timer.expires = jiffies + HZ;
+-      nesqp->terminate_timer.data = (unsigned long)nesqp;
+-      add_timer(&nesqp->terminate_timer);
++      mod_timer(&nesqp->terminate_timer, (jiffies + HZ));
+ }
+ /**
+diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
+index cd0ecb2..c47ec25 100644
+--- a/drivers/infiniband/hw/nes/nes_verbs.c
++++ b/drivers/infiniband/hw/nes/nes_verbs.c
+@@ -1404,6 +1404,9 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
+       }
+       nesqp->sig_all = (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR);
++      init_timer(&nesqp->terminate_timer);
++      nesqp->terminate_timer.function = nes_terminate_timeout;
++      nesqp->terminate_timer.data = (unsigned long)nesqp;
+       /* update the QP table */
+       nesdev->nesadapter->qp_table[nesqp->hwqp.qp_id-NES_FIRST_QPN] = nesqp;
+@@ -1413,7 +1416,6 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
+       return &nesqp->ibqp;
+ }
+-
+ /**
+  * nes_clean_cq
+  */
+-- 
+1.7.4.2
+