aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDon Wood <donald.e.wood@intel.com>2009-09-05 20:36:36 -0700
committerRoland Dreier <rolandd@cisco.com>2009-09-05 20:36:36 -0700
commitc4c3f279cd8e9cc1d3e2f364a27beadb2e69cda8 (patch)
tree30324ca5c323132e2e7d3beecdef84ee8ac4b610
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>
-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 114b802771a..fe08eb57c99 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)
if (nesqp->disconn_pending == 0) {
nesqp->disconn_pending++;
spin_unlock_irqrestore(&nesqp->lock, flags);
+ nes_add_ref(&nesqp->ibqp);
/* init our disconnect work element, to */
INIT_WORK(&nesqp->disconn_work, nes_disconnect_worker);
@@ -2477,6 +2478,7 @@ static void nes_disconnect_worker(struct work_struct *work)
nes_debug(NES_DBG_CM, "processing AEQE id 0x%04X for QP%u.\n",
nesqp->last_aeq, nesqp->hwqp.qp_id);
nes_cm_disconn_true(nesqp);
+ nes_rem_ref(&nesqp->ibqp);
}