aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorDon Wood <donald.e.wood@intel.com>2009-09-05 23:36:36 -0400
committerRoland Dreier <rolandd@cisco.com>2009-09-05 23:36:36 -0400
commitc4c3f279cd8e9cc1d3e2f364a27beadb2e69cda8 (patch)
tree30324ca5c323132e2e7d3beecdef84ee8ac4b610 /drivers/infiniband
parente07cccf4046978df10f2e13fe2b99b2f9b3a65db (diff)
RDMA/nes: Update refcnt during disconnect
During termination, it is possible for the refcnt to go to zero while the worker thread is posting events upward. This fix increments the refcnt before the request is passed to the worker thread. The thread decrements the refcnt when the request is completed. Signed-off-by: Don Wood <donald.e.wood@intel.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/nes/nes_cm.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
index 114b802771ad..fe08eb57c99f 100644
--- a/drivers/infiniband/hw/nes/nes_cm.c
+++ b/drivers/infiniband/hw/nes/nes_cm.c
@@ -2456,6 +2456,7 @@ int nes_cm_disconn(struct nes_qp *nesqp)
2456 if (nesqp->disconn_pending == 0) { 2456 if (nesqp->disconn_pending == 0) {
2457 nesqp->disconn_pending++; 2457 nesqp->disconn_pending++;
2458 spin_unlock_irqrestore(&nesqp->lock, flags); 2458 spin_unlock_irqrestore(&nesqp->lock, flags);
2459 nes_add_ref(&nesqp->ibqp);
2459 /* init our disconnect work element, to */ 2460 /* init our disconnect work element, to */
2460 INIT_WORK(&nesqp->disconn_work, nes_disconnect_worker); 2461 INIT_WORK(&nesqp->disconn_work, nes_disconnect_worker);
2461 2462
@@ -2477,6 +2478,7 @@ static void nes_disconnect_worker(struct work_struct *work)
2477 nes_debug(NES_DBG_CM, "processing AEQE id 0x%04X for QP%u.\n", 2478 nes_debug(NES_DBG_CM, "processing AEQE id 0x%04X for QP%u.\n",
2478 nesqp->last_aeq, nesqp->hwqp.qp_id); 2479 nesqp->last_aeq, nesqp->hwqp.qp_id);
2479 nes_cm_disconn_true(nesqp); 2480 nes_cm_disconn_true(nesqp);
2481 nes_rem_ref(&nesqp->ibqp);
2480} 2482}
2481 2483
2482 2484