|
@@ -154,6 +154,8 @@ void rxe_comp_queue_pkt(struct rxe_dev *rxe, struct rxe_qp *qp,
|
|
skb_queue_tail(&qp->resp_pkts, skb);
|
|
skb_queue_tail(&qp->resp_pkts, skb);
|
|
|
|
|
|
must_sched = skb_queue_len(&qp->resp_pkts) > 1;
|
|
must_sched = skb_queue_len(&qp->resp_pkts) > 1;
|
|
|
|
+ if (must_sched != 0)
|
|
|
|
+ rxe_counter_inc(rxe, RXE_CNT_COMPLETER_SCHED);
|
|
rxe_run_task(&qp->comp.task, must_sched);
|
|
rxe_run_task(&qp->comp.task, must_sched);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -236,6 +238,7 @@ static inline enum comp_state check_ack(struct rxe_qp *qp,
|
|
{
|
|
{
|
|
unsigned int mask = pkt->mask;
|
|
unsigned int mask = pkt->mask;
|
|
u8 syn;
|
|
u8 syn;
|
|
|
|
+ struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
|
|
|
|
|
|
/* Check the sequence only */
|
|
/* Check the sequence only */
|
|
switch (qp->comp.opcode) {
|
|
switch (qp->comp.opcode) {
|
|
@@ -298,6 +301,7 @@ static inline enum comp_state check_ack(struct rxe_qp *qp,
|
|
return COMPST_WRITE_SEND;
|
|
return COMPST_WRITE_SEND;
|
|
|
|
|
|
case AETH_RNR_NAK:
|
|
case AETH_RNR_NAK:
|
|
|
|
+ rxe_counter_inc(rxe, RXE_CNT_RCV_RNR);
|
|
return COMPST_RNR_RETRY;
|
|
return COMPST_RNR_RETRY;
|
|
|
|
|
|
case AETH_NAK:
|
|
case AETH_NAK:
|
|
@@ -307,6 +311,8 @@ static inline enum comp_state check_ack(struct rxe_qp *qp,
|
|
* before
|
|
* before
|
|
*/
|
|
*/
|
|
if (psn_compare(pkt->psn, qp->comp.psn) > 0) {
|
|
if (psn_compare(pkt->psn, qp->comp.psn) > 0) {
|
|
|
|
+ rxe_counter_inc(rxe,
|
|
|
|
+ RXE_CNT_RCV_SEQ_ERR);
|
|
qp->comp.psn = pkt->psn;
|
|
qp->comp.psn = pkt->psn;
|
|
if (qp->req.wait_psn) {
|
|
if (qp->req.wait_psn) {
|
|
qp->req.wait_psn = 0;
|
|
qp->req.wait_psn = 0;
|
|
@@ -534,6 +540,7 @@ static void rxe_drain_resp_pkts(struct rxe_qp *qp, bool notify)
|
|
int rxe_completer(void *arg)
|
|
int rxe_completer(void *arg)
|
|
{
|
|
{
|
|
struct rxe_qp *qp = (struct rxe_qp *)arg;
|
|
struct rxe_qp *qp = (struct rxe_qp *)arg;
|
|
|
|
+ struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
|
|
struct rxe_send_wqe *wqe = wqe;
|
|
struct rxe_send_wqe *wqe = wqe;
|
|
struct sk_buff *skb = NULL;
|
|
struct sk_buff *skb = NULL;
|
|
struct rxe_pkt_info *pkt = NULL;
|
|
struct rxe_pkt_info *pkt = NULL;
|
|
@@ -683,8 +690,10 @@ int rxe_completer(void *arg)
|
|
if (psn_compare(qp->req.psn,
|
|
if (psn_compare(qp->req.psn,
|
|
qp->comp.psn) > 0) {
|
|
qp->comp.psn) > 0) {
|
|
/* tell the requester to retry the
|
|
/* tell the requester to retry the
|
|
- * send send queue next time around
|
|
|
|
|
|
+ * send queue next time around
|
|
*/
|
|
*/
|
|
|
|
+ rxe_counter_inc(rxe,
|
|
|
|
+ RXE_CNT_COMP_RETRY);
|
|
qp->req.need_retry = 1;
|
|
qp->req.need_retry = 1;
|
|
rxe_run_task(&qp->req.task, 1);
|
|
rxe_run_task(&qp->req.task, 1);
|
|
}
|
|
}
|
|
@@ -699,6 +708,7 @@ int rxe_completer(void *arg)
|
|
goto exit;
|
|
goto exit;
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
+ rxe_counter_inc(rxe, RXE_CNT_RETRY_EXCEEDED);
|
|
wqe->status = IB_WC_RETRY_EXC_ERR;
|
|
wqe->status = IB_WC_RETRY_EXC_ERR;
|
|
state = COMPST_ERROR;
|
|
state = COMPST_ERROR;
|
|
}
|
|
}
|
|
@@ -720,6 +730,8 @@ int rxe_completer(void *arg)
|
|
skb = NULL;
|
|
skb = NULL;
|
|
goto exit;
|
|
goto exit;
|
|
} else {
|
|
} else {
|
|
|
|
+ rxe_counter_inc(rxe,
|
|
|
|
+ RXE_CNT_RNR_RETRY_EXCEEDED);
|
|
wqe->status = IB_WC_RNR_RETRY_EXC_ERR;
|
|
wqe->status = IB_WC_RNR_RETRY_EXC_ERR;
|
|
state = COMPST_ERROR;
|
|
state = COMPST_ERROR;
|
|
}
|
|
}
|