| From 7bfcfa51c35cdd2d37e0d70fc11790642dd11fb3 Mon Sep 17 00:00:00 2001 |
| From: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com> |
| Date: Thu, 6 Dec 2012 19:58:27 +0000 |
| Subject: RDMA/nes: Fix for terminate timer crash |
| |
| From: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com> |
| |
| commit 7bfcfa51c35cdd2d37e0d70fc11790642dd11fb3 upstream. |
| |
| The terminate timer needs to be initialized just once. |
| |
| Signed-off-by: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com> |
| Signed-off-by: Roland Dreier <roland@purestorage.com> |
| Signed-off-by: CAI Qian <caiqian@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| 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(-) |
| |
| --- 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_dev |
| 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 *); |
| --- 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(struc |
| 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(struc |
| } |
| |
| /* 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(unsign |
| /* 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)); |
| } |
| |
| /** |
| --- 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(struc |
| } |
| |
| 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(struc |
| return &nesqp->ibqp; |
| } |
| |
| - |
| /** |
| * nes_clean_cq |
| */ |