svn commit: r331315 - projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe
Navdeep Parhar
np at FreeBSD.org
Wed Mar 21 18:33:29 UTC 2018
Author: np
Date: Wed Mar 21 18:33:28 2018
New Revision: 331315
URL: https://svnweb.freebsd.org/changeset/base/331315
Log:
Back out r329017 and r329391, which were direct commits to stable/11.
Sponsored by: Chelsio communications.
Modified:
projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/cq.c
projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/qp.c
projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/t4.h
Modified: projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/cq.c
==============================================================================
--- projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/cq.c Wed Mar 21 18:02:56 2018 (r331314)
+++ projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/cq.c Wed Mar 21 18:33:28 2018 (r331315)
@@ -245,82 +245,137 @@ static void insert_sq_cqe(struct t4_wq *wq, struct t4_
t4_swcq_produce(cq);
}
-static void advance_oldest_read(struct t4_wq *wq);
-
-int c4iw_flush_sq(struct c4iw_qp *qhp)
+int c4iw_flush_sq(struct t4_wq *wq, struct t4_cq *cq, int count)
{
int flushed = 0;
- struct t4_wq *wq = &qhp->wq;
- struct c4iw_cq *chp = to_c4iw_cq(qhp->ibqp.send_cq);
- struct t4_cq *cq = &chp->cq;
- int idx;
- struct t4_swsqe *swsqe;
+ struct t4_swsqe *swsqe = &wq->sq.sw_sq[wq->sq.cidx + count];
+ int in_use = wq->sq.in_use - count;
- if (wq->sq.flush_cidx == -1)
- wq->sq.flush_cidx = wq->sq.cidx;
- idx = wq->sq.flush_cidx;
- BUG_ON(idx >= wq->sq.size);
- while (idx != wq->sq.pidx) {
- swsqe = &wq->sq.sw_sq[idx];
- BUG_ON(swsqe->flushed);
- swsqe->flushed = 1;
+ BUG_ON(in_use < 0);
+ while (in_use--) {
+ swsqe->signaled = 0;
insert_sq_cqe(wq, cq, swsqe);
- if (wq->sq.oldest_read == swsqe) {
- BUG_ON(swsqe->opcode != FW_RI_READ_REQ);
- advance_oldest_read(wq);
- }
+ swsqe++;
+ if (swsqe == (wq->sq.sw_sq + wq->sq.size))
+ swsqe = wq->sq.sw_sq;
flushed++;
- if (++idx == wq->sq.size)
- idx = 0;
}
- wq->sq.flush_cidx += flushed;
- if (wq->sq.flush_cidx >= wq->sq.size)
- wq->sq.flush_cidx -= wq->sq.size;
return flushed;
}
+/*
+ * Move all CQEs from the HWCQ into the SWCQ.
+ */
+void c4iw_flush_hw_cq(struct t4_cq *cq)
+{
+ struct t4_cqe *cqe = NULL, *swcqe;
+ int ret;
+
+ CTR3(KTR_IW_CXGBE, "%s cq %p cqid 0x%x", __func__, cq, cq->cqid);
+ ret = t4_next_hw_cqe(cq, &cqe);
+ while (!ret) {
+ CTR3(KTR_IW_CXGBE, "%s flushing hwcq cidx 0x%x swcq pidx 0x%x",
+ __func__, cq->cidx, cq->sw_pidx);
+ swcqe = &cq->sw_queue[cq->sw_pidx];
+ *swcqe = *cqe;
+ swcqe->header |= cpu_to_be32(V_CQE_SWCQE(1));
+ t4_swcq_produce(cq);
+ t4_hwcq_consume(cq);
+ ret = t4_next_hw_cqe(cq, &cqe);
+ }
+}
+
+static int cqe_completes_wr(struct t4_cqe *cqe, struct t4_wq *wq)
+{
+ if (CQE_OPCODE(cqe) == FW_RI_TERMINATE)
+ return 0;
+
+ if ((CQE_OPCODE(cqe) == FW_RI_RDMA_WRITE) && RQ_TYPE(cqe))
+ return 0;
+
+ if ((CQE_OPCODE(cqe) == FW_RI_READ_RESP) && SQ_TYPE(cqe))
+ return 0;
+
+ if (CQE_SEND_OPCODE(cqe) && RQ_TYPE(cqe) && t4_rq_empty(wq))
+ return 0;
+ return 1;
+}
+
+void c4iw_count_scqes(struct t4_cq *cq, struct t4_wq *wq, int *count)
+{
+ struct t4_cqe *cqe;
+ u32 ptr;
+
+ *count = 0;
+ ptr = cq->sw_cidx;
+ while (ptr != cq->sw_pidx) {
+ cqe = &cq->sw_queue[ptr];
+ if ((SQ_TYPE(cqe) || ((CQE_OPCODE(cqe) == FW_RI_READ_RESP) &&
+ wq->sq.oldest_read)) &&
+ (CQE_QPID(cqe) == wq->sq.qid))
+ (*count)++;
+ if (++ptr == cq->size)
+ ptr = 0;
+ }
+ CTR3(KTR_IW_CXGBE, "%s cq %p count %d", __func__, cq, *count);
+}
+
+void c4iw_count_rcqes(struct t4_cq *cq, struct t4_wq *wq, int *count)
+{
+ struct t4_cqe *cqe;
+ u32 ptr;
+
+ *count = 0;
+ CTR2(KTR_IW_CXGBE, "%s count zero %d", __func__, *count);
+ ptr = cq->sw_cidx;
+ while (ptr != cq->sw_pidx) {
+ cqe = &cq->sw_queue[ptr];
+ if (RQ_TYPE(cqe) && (CQE_OPCODE(cqe) != FW_RI_READ_RESP) &&
+ (CQE_QPID(cqe) == wq->sq.qid) && cqe_completes_wr(cqe, wq))
+ (*count)++;
+ if (++ptr == cq->size)
+ ptr = 0;
+ }
+ CTR3(KTR_IW_CXGBE, "%s cq %p count %d", __func__, cq, *count);
+}
+
static void flush_completed_wrs(struct t4_wq *wq, struct t4_cq *cq)
{
struct t4_swsqe *swsqe;
- int cidx;
+ u16 ptr = wq->sq.cidx;
+ int count = wq->sq.in_use;
+ int unsignaled = 0;
- if (wq->sq.flush_cidx == -1)
- wq->sq.flush_cidx = wq->sq.cidx;
- cidx = wq->sq.flush_cidx;
- BUG_ON(cidx > wq->sq.size);
-
- while (cidx != wq->sq.pidx) {
- swsqe = &wq->sq.sw_sq[cidx];
+ swsqe = &wq->sq.sw_sq[ptr];
+ while (count--)
if (!swsqe->signaled) {
- if (++cidx == wq->sq.size)
- cidx = 0;
+ if (++ptr == wq->sq.size)
+ ptr = 0;
+ swsqe = &wq->sq.sw_sq[ptr];
+ unsignaled++;
} else if (swsqe->complete) {
- BUG_ON(swsqe->flushed);
-
/*
* Insert this completed cqe into the swcq.
*/
CTR3(KTR_IW_CXGBE,
- "%s moving cqe into swcq sq idx %u cq idx %u\n",
- __func__, cidx, cq->sw_pidx);
+ "%s moving cqe into swcq sq idx %u cq idx %u",
+ __func__, ptr, cq->sw_pidx);
swsqe->cqe.header |= htonl(V_CQE_SWCQE(1));
cq->sw_queue[cq->sw_pidx] = swsqe->cqe;
t4_swcq_produce(cq);
- swsqe->flushed = 1;
- if (++cidx == wq->sq.size)
- cidx = 0;
- wq->sq.flush_cidx = cidx;
+ swsqe->signaled = 0;
+ wq->sq.in_use -= unsignaled;
+ break;
} else
break;
- }
}
static void create_read_req_cqe(struct t4_wq *wq, struct t4_cqe *hw_cqe,
struct t4_cqe *read_cqe)
{
read_cqe->u.scqe.cidx = wq->sq.oldest_read->idx;
- read_cqe->len = htonl(wq->sq.oldest_read->read_len);
+ read_cqe->len = cpu_to_be32(wq->sq.oldest_read->read_len);
read_cqe->header = htonl(V_CQE_QPID(CQE_QPID(hw_cqe)) |
V_CQE_SWCQE(SW_CQE(hw_cqe)) |
V_CQE_OPCODE(FW_RI_READ_REQ) |
@@ -328,6 +383,9 @@ static void create_read_req_cqe(struct t4_wq *wq, stru
read_cqe->bits_type_ts = hw_cqe->bits_type_ts;
}
+/*
+ * Return a ptr to the next read wr in the SWSQ or NULL.
+ */
static void advance_oldest_read(struct t4_wq *wq)
{
@@ -347,128 +405,6 @@ static void advance_oldest_read(struct t4_wq *wq)
}
/*
- * Move all CQEs from the HWCQ into the SWCQ.
- * Deal with out-of-order and/or completions that complete
- * prior unsignalled WRs.
- */
-void c4iw_flush_hw_cq(struct c4iw_cq *chp)
-{
- struct t4_cqe *hw_cqe, *swcqe, read_cqe;
- struct c4iw_qp *qhp;
- struct t4_swsqe *swsqe;
- int ret;
-
- CTR3(KTR_IW_CXGBE, "%s c4iw_cq %p cqid 0x%x", __func__, chp,
- chp->cq.cqid);
- ret = t4_next_hw_cqe(&chp->cq, &hw_cqe);
-
- /*
- * This logic is similar to poll_cq(), but not quite the same
- * unfortunately. Need to move pertinent HW CQEs to the SW CQ but
- * also do any translation magic that poll_cq() normally does.
- */
- while (!ret) {
- qhp = get_qhp(chp->rhp, CQE_QPID(hw_cqe));
-
- /*
- * drop CQEs with no associated QP
- */
- if (qhp == NULL)
- goto next_cqe;
-
- if (CQE_OPCODE(hw_cqe) == FW_RI_TERMINATE)
- goto next_cqe;
-
- if (CQE_OPCODE(hw_cqe) == FW_RI_READ_RESP) {
-
- /*
- * If we have reached here because of async
- * event or other error, and have egress error
- * then drop
- */
- if (CQE_TYPE(hw_cqe) == 1) {
- goto next_cqe;
- }
-
- /*
- * drop peer2peer RTR reads.
- */
- if (CQE_WRID_STAG(hw_cqe) == 1)
- goto next_cqe;
-
- /*
- * Eat completions for unsignaled read WRs.
- */
- if (!qhp->wq.sq.oldest_read->signaled) {
- advance_oldest_read(&qhp->wq);
- goto next_cqe;
- }
-
- /*
- * Don't write to the HWCQ, create a new read req CQE
- * in local memory and move it into the swcq.
- */
- create_read_req_cqe(&qhp->wq, hw_cqe, &read_cqe);
- hw_cqe = &read_cqe;
- advance_oldest_read(&qhp->wq);
- }
-
- /* if its a SQ completion, then do the magic to move all the
- * unsignaled and now in-order completions into the swcq.
- */
- if (SQ_TYPE(hw_cqe)) {
- swsqe = &qhp->wq.sq.sw_sq[CQE_WRID_SQ_IDX(hw_cqe)];
- swsqe->cqe = *hw_cqe;
- swsqe->complete = 1;
- flush_completed_wrs(&qhp->wq, &chp->cq);
- } else {
- swcqe = &chp->cq.sw_queue[chp->cq.sw_pidx];
- *swcqe = *hw_cqe;
- swcqe->header |= cpu_to_be32(V_CQE_SWCQE(1));
- t4_swcq_produce(&chp->cq);
- }
-next_cqe:
- t4_hwcq_consume(&chp->cq);
- ret = t4_next_hw_cqe(&chp->cq, &hw_cqe);
- }
-}
-
-static int cqe_completes_wr(struct t4_cqe *cqe, struct t4_wq *wq)
-{
- if (CQE_OPCODE(cqe) == FW_RI_TERMINATE)
- return 0;
-
- if ((CQE_OPCODE(cqe) == FW_RI_RDMA_WRITE) && RQ_TYPE(cqe))
- return 0;
-
- if ((CQE_OPCODE(cqe) == FW_RI_READ_RESP) && SQ_TYPE(cqe))
- return 0;
-
- if (CQE_SEND_OPCODE(cqe) && RQ_TYPE(cqe) && t4_rq_empty(wq))
- return 0;
- return 1;
-}
-
-void c4iw_count_rcqes(struct t4_cq *cq, struct t4_wq *wq, int *count)
-{
- struct t4_cqe *cqe;
- u32 ptr;
-
- *count = 0;
- CTR2(KTR_IW_CXGBE, "%s count zero %d", __func__, *count);
- ptr = cq->sw_cidx;
- while (ptr != cq->sw_pidx) {
- cqe = &cq->sw_queue[ptr];
- if (RQ_TYPE(cqe) && (CQE_OPCODE(cqe) != FW_RI_READ_RESP) &&
- (CQE_QPID(cqe) == wq->sq.qid) && cqe_completes_wr(cqe, wq))
- (*count)++;
- if (++ptr == cq->size)
- ptr = 0;
- }
- CTR3(KTR_IW_CXGBE, "%s cq %p count %d", __func__, cq, *count);
-}
-
-/*
* poll_cq
*
* Caller must:
@@ -514,22 +450,6 @@ static int poll_cq(struct t4_wq *wq, struct t4_cq *cq,
}
/*
- * skip hw cqe's if the wq is flushed.
- */
- if (wq->flushed && !SW_CQE(hw_cqe)) {
- ret = -EAGAIN;
- goto skip_cqe;
- }
-
- /*
- * skip TERMINATE cqes...
- */
- if (CQE_OPCODE(hw_cqe) == FW_RI_TERMINATE) {
- ret = -EAGAIN;
- goto skip_cqe;
- }
-
- /*
* Special cqe for drain WR completions...
*/
if (CQE_OPCODE(hw_cqe) == C4IW_DRAIN_OPCODE) {
@@ -547,22 +467,12 @@ static int poll_cq(struct t4_wq *wq, struct t4_cq *cq,
*/
if (RQ_TYPE(hw_cqe) && (CQE_OPCODE(hw_cqe) == FW_RI_READ_RESP)) {
- /* If we have reached here because of async
- * event or other error, and have egress error
- * then drop
- */
- if (CQE_TYPE(hw_cqe) == 1) {
- if (CQE_STATUS(hw_cqe))
- t4_set_wq_in_error(wq);
- ret = -EAGAIN;
- goto skip_cqe;
- }
-
- /* If this is an unsolicited read response, then the read
+ /*
+ * If this is an unsolicited read response, then the read
* was generated by the kernel driver as part of peer-2-peer
* connection setup. So ignore the completion.
*/
- if (CQE_WRID_STAG(hw_cqe) == 1) {
+ if (!wq->sq.oldest_read) {
if (CQE_STATUS(hw_cqe))
t4_set_wq_in_error(wq);
ret = -EAGAIN;
@@ -570,15 +480,6 @@ static int poll_cq(struct t4_wq *wq, struct t4_cq *cq,
}
/*
- * Eat completions for unsignaled read WRs.
- */
- if (!wq->sq.oldest_read->signaled) {
- advance_oldest_read(wq);
- ret = -EAGAIN;
- goto skip_cqe;
- }
-
- /*
* Don't write to the HWCQ, so create a new read req CQE
* in local memory.
*/
@@ -588,10 +489,16 @@ static int poll_cq(struct t4_wq *wq, struct t4_cq *cq,
}
if (CQE_STATUS(hw_cqe) || t4_wq_in_error(wq)) {
- *cqe_flushed = (CQE_STATUS(hw_cqe) == T4_ERR_SWFLUSH);
+ *cqe_flushed = t4_wq_in_error(wq);
t4_set_wq_in_error(wq);
+ goto proc_cqe;
}
+ if (CQE_OPCODE(hw_cqe) == FW_RI_TERMINATE) {
+ ret = -EAGAIN;
+ goto skip_cqe;
+ }
+
/*
* RECV completion.
*/
@@ -603,7 +510,12 @@ static int poll_cq(struct t4_wq *wq, struct t4_cq *cq,
* then we complete this with T4_ERR_MSN and mark the wq in
* error.
*/
- BUG_ON(t4_rq_empty(wq));
+
+ if (t4_rq_empty(wq)) {
+ t4_set_wq_in_error(wq);
+ ret = -EAGAIN;
+ goto skip_cqe;
+ }
if (unlikely((CQE_WRID_MSN(hw_cqe) != (wq->rq.msn)))) {
t4_set_wq_in_error(wq);
hw_cqe->header |= htonl(V_CQE_STATUS(T4_ERR_MSN));
@@ -644,26 +556,9 @@ proc_cqe:
* completion.
*/
if (SQ_TYPE(hw_cqe)) {
- int idx = CQE_WRID_SQ_IDX(hw_cqe);
- BUG_ON(idx >= wq->sq.size);
-
- /*
- * Account for any unsignaled completions completed by
- * this signaled completion. In this case, cidx points
- * to the first unsignaled one, and idx points to the
- * signaled one. So adjust in_use based on this delta.
- * if this is not completing any unsigned wrs, then the
- * delta will be 0. Handle wrapping also!
- */
- if (idx < wq->sq.cidx)
- wq->sq.in_use -= wq->sq.size + idx - wq->sq.cidx;
- else
- wq->sq.in_use -= idx - wq->sq.cidx;
- BUG_ON(wq->sq.in_use <= 0 || wq->sq.in_use >= wq->sq.size);
-
- wq->sq.cidx = (uint16_t)idx;
- CTR2(KTR_IW_CXGBE, "%s completing sq idx %u\n",
- __func__, wq->sq.cidx);
+ wq->sq.cidx = CQE_WRID_SQ_IDX(hw_cqe);
+ CTR2(KTR_IW_CXGBE, "%s completing sq idx %u",
+ __func__, wq->sq.cidx);
*cookie = wq->sq.sw_sq[wq->sq.cidx].wr_id;
t4_sq_consume(wq);
} else {
@@ -672,7 +567,6 @@ proc_cqe:
*cookie = wq->rq.sw_rq[wq->rq.cidx].wr_id;
BUG_ON(t4_rq_empty(wq));
t4_rq_consume(wq);
- goto skip_cqe;
}
flush_wq:
Modified: projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
==============================================================================
--- projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h Wed Mar 21 18:02:56 2018 (r331314)
+++ projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h Wed Mar 21 18:33:28 2018 (r331315)
@@ -926,11 +926,12 @@ void c4iw_rqtpool_free(struct c4iw_rdev *rdev, u32 add
u32 c4iw_pblpool_alloc(struct c4iw_rdev *rdev, int size);
void c4iw_pblpool_free(struct c4iw_rdev *rdev, u32 addr, int size);
int c4iw_ofld_send(struct c4iw_rdev *rdev, struct mbuf *m);
-void c4iw_flush_hw_cq(struct c4iw_cq *chp);
+void c4iw_flush_hw_cq(struct t4_cq *cq);
void c4iw_count_rcqes(struct t4_cq *cq, struct t4_wq *wq, int *count);
+void c4iw_count_scqes(struct t4_cq *cq, struct t4_wq *wq, int *count);
int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp);
int c4iw_flush_rq(struct t4_wq *wq, struct t4_cq *cq, int count);
-int c4iw_flush_sq(struct c4iw_qp *qhp);
+int c4iw_flush_sq(struct t4_wq *wq, struct t4_cq *cq, int count);
int c4iw_ev_handler(struct sge_iq *, const struct rsp_ctrl *);
u16 c4iw_rqes_posted(struct c4iw_qp *qhp);
int c4iw_post_terminate(struct c4iw_qp *qhp, struct t4_cqe *err_cqe);
Modified: projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/qp.c
==============================================================================
--- projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/qp.c Wed Mar 21 18:02:56 2018 (r331314)
+++ projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/qp.c Wed Mar 21 18:33:28 2018 (r331315)
@@ -734,7 +734,6 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_
swsqe->complete = 0;
swsqe->signaled = (wr->send_flags & IB_SEND_SIGNALED) ||
qhp->sq_sig_all;
- swsqe->flushed = 0;
swsqe->wr_id = wr->wr_id;
init_wr_hdr(wqe, qhp->wq.sq.pidx, fw_opcode, fw_flags, len16);
@@ -1011,18 +1010,10 @@ static void __flush_qp(struct c4iw_qp *qhp, struct c4i
CTR4(KTR_IW_CXGBE, "%s qhp %p rchp %p schp %p", __func__, qhp, rchp,
schp);
- /* locking heirarchy: cq lock first, then qp lock. */
+ /* locking hierarchy: cq lock first, then qp lock. */
spin_lock_irqsave(&rchp->lock, flag);
spin_lock(&qhp->lock);
-
- if (qhp->wq.flushed) {
- spin_unlock(&qhp->lock);
- spin_unlock_irqrestore(&rchp->lock, flag);
- return;
- }
- qhp->wq.flushed = 1;
-
- c4iw_flush_hw_cq(rchp);
+ c4iw_flush_hw_cq(&rchp->cq);
c4iw_count_rcqes(&rchp->cq, &qhp->wq, &count);
flushed = c4iw_flush_rq(&qhp->wq, &rchp->cq, count);
spin_unlock(&qhp->lock);
@@ -1033,12 +1024,12 @@ static void __flush_qp(struct c4iw_qp *qhp, struct c4i
spin_unlock_irqrestore(&rchp->comp_handler_lock, flag);
}
- /* locking heirarchy: cq lock first, then qp lock. */
+ /* locking hierarchy: cq lock first, then qp lock. */
spin_lock_irqsave(&schp->lock, flag);
spin_lock(&qhp->lock);
- if (schp != rchp)
- c4iw_flush_hw_cq(schp);
- flushed = c4iw_flush_sq(qhp);
+ c4iw_flush_hw_cq(&schp->cq);
+ c4iw_count_scqes(&schp->cq, &qhp->wq, &count);
+ flushed = c4iw_flush_sq(&qhp->wq, &schp->cq, count);
spin_unlock(&qhp->lock);
spin_unlock_irqrestore(&schp->lock, flag);
if (flushed && schp->ibcq.comp_handler) {
@@ -1056,8 +1047,8 @@ static void flush_qp(struct c4iw_qp *qhp)
rchp = get_chp(qhp->rhp, qhp->attr.rcq);
schp = get_chp(qhp->rhp, qhp->attr.scq);
- t4_set_wq_in_error(&qhp->wq);
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);
@@ -1348,7 +1339,6 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_q
switch (attrs->next_state) {
case C4IW_QP_STATE_CLOSING:
BUG_ON(atomic_read(&qhp->ep->com.kref.refcount) < 2);
- t4_set_wq_in_error(&qhp->wq);
set_state(qhp, C4IW_QP_STATE_CLOSING);
ep = qhp->ep;
if (!internal) {
@@ -1356,15 +1346,18 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_q
disconnect = 1;
c4iw_get_ep(&qhp->ep->com);
}
+ if (qhp->ibqp.uobject)
+ t4_set_wq_in_error(&qhp->wq);
ret = rdma_fini(rhp, qhp, ep);
if (ret)
goto err;
break;
case C4IW_QP_STATE_TERMINATE:
- t4_set_wq_in_error(&qhp->wq);
set_state(qhp, C4IW_QP_STATE_TERMINATE);
qhp->attr.layer_etype = attrs->layer_etype;
qhp->attr.ecode = attrs->ecode;
+ if (qhp->ibqp.uobject)
+ t4_set_wq_in_error(&qhp->wq);
ep = qhp->ep;
if (!internal)
terminate = 1;
@@ -1372,8 +1365,9 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_q
c4iw_get_ep(&qhp->ep->com);
break;
case C4IW_QP_STATE_ERROR:
- t4_set_wq_in_error(&qhp->wq);
set_state(qhp, C4IW_QP_STATE_ERROR);
+ if (qhp->ibqp.uobject)
+ t4_set_wq_in_error(&qhp->wq);
if (!internal) {
abort = 1;
disconnect = 1;
@@ -1564,7 +1558,6 @@ c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_att
qhp->wq.sq.size = sqsize;
qhp->wq.sq.memsize = (sqsize + spg_ndesc) * sizeof *qhp->wq.sq.queue +
16 * sizeof(__be64);
- qhp->wq.sq.flush_cidx = -1;
qhp->wq.rq.size = rqsize;
qhp->wq.rq.memsize = (rqsize + spg_ndesc) * sizeof *qhp->wq.rq.queue;
Modified: projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/t4.h
==============================================================================
--- projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/t4.h Wed Mar 21 18:02:56 2018 (r331314)
+++ projects/bsd_rdma_4_9_stable_11/sys/dev/cxgbe/iw_cxgbe/t4.h Wed Mar 21 18:33:28 2018 (r331315)
@@ -289,7 +289,6 @@ struct t4_swsqe {
int complete;
int signaled;
u16 idx;
- int flushed;
};
struct t4_sq {
@@ -308,7 +307,6 @@ struct t4_sq {
u16 pidx;
u16 wq_pidx;
u16 flags;
- short flush_cidx;
};
struct t4_swrqe {
@@ -339,7 +337,6 @@ struct t4_wq {
void __iomem *db;
void __iomem *gts;
struct c4iw_rdev *rdev;
- int flushed;
};
static inline int t4_rqes_posted(struct t4_wq *wq)
@@ -417,9 +414,6 @@ static inline void t4_sq_produce(struct t4_wq *wq, u8
static inline void t4_sq_consume(struct t4_wq *wq)
{
- BUG_ON(wq->sq.in_use < 1);
- if (wq->sq.cidx == wq->sq.flush_cidx)
- wq->sq.flush_cidx = -1;
wq->sq.in_use--;
if (++wq->sq.cidx == wq->sq.size)
wq->sq.cidx = 0;
@@ -498,14 +492,12 @@ static inline int t4_arm_cq(struct t4_cq *cq, int se)
static inline void t4_swcq_produce(struct t4_cq *cq)
{
cq->sw_in_use++;
- BUG_ON(cq->sw_in_use >= cq->size);
if (++cq->sw_pidx == cq->size)
cq->sw_pidx = 0;
}
static inline void t4_swcq_consume(struct t4_cq *cq)
{
- BUG_ON(cq->sw_in_use < 1);
cq->sw_in_use--;
if (++cq->sw_cidx == cq->size)
cq->sw_cidx = 0;
@@ -548,7 +540,6 @@ static inline int t4_next_hw_cqe(struct t4_cq *cq, str
cq->error = 1;
printk(KERN_ERR MOD "cq overflow cqid %u\n", cq->cqid);
} else if (t4_valid_cqe(cq, &cq->queue[cq->cidx])) {
- rmb();
*cqe = &cq->queue[cq->cidx];
ret = 0;
} else
More information about the svn-src-projects
mailing list