|
@@ -941,8 +941,11 @@ static void __flush_qp(struct c4iw_qp *qhp, struct c4iw_cq *rchp,
|
|
|
flushed = c4iw_flush_rq(&qhp->wq, &rchp->cq, count);
|
|
|
spin_unlock(&qhp->lock);
|
|
|
spin_unlock_irqrestore(&rchp->lock, flag);
|
|
|
- if (flushed)
|
|
|
+ if (flushed) {
|
|
|
+ spin_lock_irqsave(&rchp->comp_handler_lock, flag);
|
|
|
(*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context);
|
|
|
+ spin_unlock_irqrestore(&rchp->comp_handler_lock, flag);
|
|
|
+ }
|
|
|
|
|
|
/* locking hierarchy: cq lock first, then qp lock. */
|
|
|
spin_lock_irqsave(&schp->lock, flag);
|
|
@@ -952,13 +955,17 @@ static void __flush_qp(struct c4iw_qp *qhp, struct c4iw_cq *rchp,
|
|
|
flushed = c4iw_flush_sq(&qhp->wq, &schp->cq, count);
|
|
|
spin_unlock(&qhp->lock);
|
|
|
spin_unlock_irqrestore(&schp->lock, flag);
|
|
|
- if (flushed)
|
|
|
+ if (flushed) {
|
|
|
+ spin_lock_irqsave(&schp->comp_handler_lock, flag);
|
|
|
(*schp->ibcq.comp_handler)(&schp->ibcq, schp->ibcq.cq_context);
|
|
|
+ spin_unlock_irqrestore(&schp->comp_handler_lock, flag);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void flush_qp(struct c4iw_qp *qhp)
|
|
|
{
|
|
|
struct c4iw_cq *rchp, *schp;
|
|
|
+ unsigned long flag;
|
|
|
|
|
|
rchp = get_chp(qhp->rhp, qhp->attr.rcq);
|
|
|
schp = get_chp(qhp->rhp, qhp->attr.scq);
|
|
@@ -966,11 +973,15 @@ static void flush_qp(struct c4iw_qp *qhp)
|
|
|
if (qhp->ibqp.uobject) {
|
|
|
t4_set_wq_in_error(&qhp->wq);
|
|
|
t4_set_cq_in_error(&rchp->cq);
|
|
|
+ spin_lock_irqsave(&rchp->comp_handler_lock, flag);
|
|
|
(*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context);
|
|
|
+ spin_unlock_irqrestore(&rchp->comp_handler_lock, flag);
|
|
|
if (schp != rchp) {
|
|
|
t4_set_cq_in_error(&schp->cq);
|
|
|
+ spin_lock_irqsave(&schp->comp_handler_lock, flag);
|
|
|
(*schp->ibcq.comp_handler)(&schp->ibcq,
|
|
|
schp->ibcq.cq_context);
|
|
|
+ spin_unlock_irqrestore(&schp->comp_handler_lock, flag);
|
|
|
}
|
|
|
return;
|
|
|
}
|