|
@@ -346,9 +346,8 @@ static void pvrdma_qp_event(struct pvrdma_dev *dev, u32 qpn, int type)
|
|
|
ibqp->event_handler(&e, ibqp->qp_context);
|
|
|
}
|
|
|
if (qp) {
|
|
|
- atomic_dec(&qp->refcnt);
|
|
|
- if (atomic_read(&qp->refcnt) == 0)
|
|
|
- wake_up(&qp->wait);
|
|
|
+ if (atomic_dec_and_test(&qp->refcnt))
|
|
|
+ complete(&qp->free);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -373,9 +372,8 @@ static void pvrdma_cq_event(struct pvrdma_dev *dev, u32 cqn, int type)
|
|
|
ibcq->event_handler(&e, ibcq->cq_context);
|
|
|
}
|
|
|
if (cq) {
|
|
|
- atomic_dec(&cq->refcnt);
|
|
|
- if (atomic_read(&cq->refcnt) == 0)
|
|
|
- wake_up(&cq->wait);
|
|
|
+ if (atomic_dec_and_test(&cq->refcnt))
|
|
|
+ complete(&cq->free);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -404,7 +402,7 @@ static void pvrdma_srq_event(struct pvrdma_dev *dev, u32 srqn, int type)
|
|
|
}
|
|
|
if (srq) {
|
|
|
if (refcount_dec_and_test(&srq->refcnt))
|
|
|
- wake_up(&srq->wait);
|
|
|
+ complete(&srq->free);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -539,9 +537,8 @@ static irqreturn_t pvrdma_intrx_handler(int irq, void *dev_id)
|
|
|
if (cq && cq->ibcq.comp_handler)
|
|
|
cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context);
|
|
|
if (cq) {
|
|
|
- atomic_dec(&cq->refcnt);
|
|
|
- if (atomic_read(&cq->refcnt))
|
|
|
- wake_up(&cq->wait);
|
|
|
+ if (atomic_dec_and_test(&cq->refcnt))
|
|
|
+ complete(&cq->free);
|
|
|
}
|
|
|
pvrdma_idx_ring_inc(&ring->cons_head, ring_slots);
|
|
|
}
|