ind = qp->sq.next_ind;
- if(ibqp->state == IBV_QPS_RESET)
- return -EBUSY;
+ if(ibqp->state == IBV_QPS_RESET) {
+ ret = -EBUSY;
+ *bad_wr = wr;
+ goto err_busy;
+ }
for (nreq = 0; wr; ++nreq, wr = wr->p_next) {
if (mthca_wq_overflow(&qp->sq, nreq, to_mcq(qp->ibv_qp.send_cq))) {
qp->sq.next_ind = ind;
qp->sq.head += nreq;
+err_busy:
cl_spinlock_release(&qp->sq.lock);
UVP_EXIT(UVP_DBG_QP);
/* XXX check that state is OK to post receive */
ind = qp->rq.next_ind;
- if(ibqp->state == IBV_QPS_RESET)
- return -EBUSY;
+ if(ibqp->state == IBV_QPS_RESET) {
+ ret = -EBUSY;
+ *bad_wr = wr;
+ goto err_busy;
+ }
+
for (nreq = 0; wr; ++nreq, wr = wr->p_next) {
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
nreq = 0;
qp->rq.next_ind = ind;
qp->rq.head += nreq;
+err_busy:
cl_spinlock_release(&qp->rq.lock);
UVP_EXIT(UVP_DBG_QP);
return ret;
/* XXX check that state is OK to post send */
ind = qp->sq.head & (qp->sq.max - 1);
- if(ibqp->state == IBV_QPS_RESET)
- return -EBUSY;
+ if(ibqp->state == IBV_QPS_RESET) {
+ ret = -EBUSY;
+ *bad_wr = wr;
+ goto err_busy;
+ }
for (nreq = 0; wr; ++nreq, wr = wr->p_next) {
if (unlikely(nreq == MTHCA_ARBEL_MAX_WQES_PER_SEND_DB)) {
nreq = 0;
mthca_write64(doorbell, to_mctx(ibqp->pd->context), MTHCA_SEND_DOORBELL);
}
+err_busy:
cl_spinlock_release(&qp->sq.lock);
UVP_EXIT(UVP_DBG_QP);
/* XXX check that state is OK to post receive */
ind = qp->rq.head & (qp->rq.max - 1);
- if(ibqp->state == IBV_QPS_RESET)
- return -EBUSY;
+ if(ibqp->state == IBV_QPS_RESET) {
+ ret = -EBUSY;
+ *bad_wr = wr;
+ goto err_busy;
+ }
for (nreq = 0; wr; ++nreq, wr = wr->p_next) {
if (mthca_wq_overflow(&qp->rq, nreq, to_mcq(qp->ibv_qp.recv_cq))) {//TODO sleybo: check the cq
UVP_PRINT(TRACE_LEVEL_ERROR ,UVP_DBG_QP ,("RQ %06x full (%u head, %u tail,"
*qp->rq.db = cl_hton32(qp->rq.head & 0xffff);
}
+err_busy:
cl_spinlock_release(&qp->rq.lock);
UVP_EXIT(UVP_DBG_QP);