|
@@ -503,57 +503,40 @@ static inline enum comp_state complete_wqe(struct rxe_qp *qp,
|
|
|
return COMPST_GET_WQE;
|
|
|
}
|
|
|
|
|
|
-int rxe_completer(void *arg)
|
|
|
+static void rxe_drain_resp_pkts(struct rxe_qp *qp, bool notify)
|
|
|
{
|
|
|
- struct rxe_qp *qp = (struct rxe_qp *)arg;
|
|
|
- struct rxe_send_wqe *wqe = wqe;
|
|
|
- struct sk_buff *skb = NULL;
|
|
|
- struct rxe_pkt_info *pkt = NULL;
|
|
|
- enum comp_state state;
|
|
|
-
|
|
|
- rxe_add_ref(qp);
|
|
|
-
|
|
|
- if (!qp->valid) {
|
|
|
- while ((skb = skb_dequeue(&qp->resp_pkts))) {
|
|
|
- rxe_drop_ref(qp);
|
|
|
- kfree_skb(skb);
|
|
|
- }
|
|
|
- skb = NULL;
|
|
|
- pkt = NULL;
|
|
|
-
|
|
|
- while (queue_head(qp->sq.queue))
|
|
|
- advance_consumer(qp->sq.queue);
|
|
|
+ struct sk_buff *skb;
|
|
|
+ struct rxe_send_wqe *wqe;
|
|
|
|
|
|
- goto exit;
|
|
|
+ while ((skb = skb_dequeue(&qp->resp_pkts))) {
|
|
|
+ rxe_drop_ref(qp);
|
|
|
+ kfree_skb(skb);
|
|
|
}
|
|
|
|
|
|
- if (qp->req.state == QP_STATE_ERROR) {
|
|
|
- while ((skb = skb_dequeue(&qp->resp_pkts))) {
|
|
|
- rxe_drop_ref(qp);
|
|
|
- kfree_skb(skb);
|
|
|
- }
|
|
|
- skb = NULL;
|
|
|
- pkt = NULL;
|
|
|
-
|
|
|
- while ((wqe = queue_head(qp->sq.queue))) {
|
|
|
+ while ((wqe = queue_head(qp->sq.queue))) {
|
|
|
+ if (notify) {
|
|
|
wqe->status = IB_WC_WR_FLUSH_ERR;
|
|
|
do_complete(qp, wqe);
|
|
|
+ } else {
|
|
|
+ advance_consumer(qp->sq.queue);
|
|
|
}
|
|
|
-
|
|
|
- goto exit;
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- if (qp->req.state == QP_STATE_RESET) {
|
|
|
- while ((skb = skb_dequeue(&qp->resp_pkts))) {
|
|
|
- rxe_drop_ref(qp);
|
|
|
- kfree_skb(skb);
|
|
|
- }
|
|
|
- skb = NULL;
|
|
|
- pkt = NULL;
|
|
|
+int rxe_completer(void *arg)
|
|
|
+{
|
|
|
+ struct rxe_qp *qp = (struct rxe_qp *)arg;
|
|
|
+ struct rxe_send_wqe *wqe = wqe;
|
|
|
+ struct sk_buff *skb = NULL;
|
|
|
+ struct rxe_pkt_info *pkt = NULL;
|
|
|
+ enum comp_state state;
|
|
|
|
|
|
- while (queue_head(qp->sq.queue))
|
|
|
- advance_consumer(qp->sq.queue);
|
|
|
+ rxe_add_ref(qp);
|
|
|
|
|
|
+ if (!qp->valid || qp->req.state == QP_STATE_ERROR ||
|
|
|
+ qp->req.state == QP_STATE_RESET) {
|
|
|
+ rxe_drain_resp_pkts(qp, qp->valid &&
|
|
|
+ qp->req.state == QP_STATE_ERROR);
|
|
|
goto exit;
|
|
|
}
|
|
|
|