iw_cxgb4: reflect the original WR opcode in drain cqes
Subsystems (2)
PATCH 2/3 iw_cxgb4: reflect the original WR opcode in drain cqes
The flush/drain logic was not retaining the original wr opcode in its completion. This can cause problems if the application uses the completion opcode to make decisions.
Use bit 10 of the CQE header word to indicate the CQE is a special drain completion, and save the original WR opcode in the cqe header opcode field.
Fixes 4fe7c2962e11 ("iw_cxgb4: refactor sq/rq drain logic")
Signed-off-by Steve Wise <[email protected]>
--- drivers/infiniband/hw/cxgb4/cq.c | 7 ++---- drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 2 -- drivers/infiniband/hw/cxgb4/qp.c | 46 +++++++++++++++++++++++++++++++--- drivers/infiniband/hw/cxgb4/t4.h | 6 +++++ 4 files changed, 50 insertions(+), 11 deletions(-)
drivers/infiniband/hw/cxgb4/cq.c +2 -5
@@ -395,7 +395,7 @@ void c4iw_flush_hw_cq(struct c4iw_cq *chp)static int cqe_completes_wr (struct t4_cqe *cqe,struct t4_wq *wq) { -if (CQE_OPCODE (cqe) ==C4IW_DRAIN_OPCODE ) { +if (DRAIN_CQE (cqe)) {WARN_ONCE (1 ,"Unexpected DRAIN CQE qp id %u!\n" , wq->sq.qid);return 0 ; }
@@ -494,7 +494,7 @@ static int poll_cq(struct t4_wq *wq, struct t4_cq *cq, struct t4_cqe *cqe,/* * Special cqe for drain WR completions... */ -if (CQE_OPCODE (hw_cqe) ==C4IW_DRAIN_OPCODE ) { +if (DRAIN_CQE (hw_cqe)) { *cookie =CQE_DRAIN_COOKIE (hw_cqe); *cqe = *hw_cqe; goto skip_cqe;
@@ -748,9 +748,6 @@ static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)c4iw_invalidate_mr (qhp->rhp,CQE_WRID_FR_STAG (&cqe));break ; -case C4IW_DRAIN_OPCODE : - wc->opcode =IB_WC_SEND ; -break ;default :pr_err ("Unexpected opcode %d in the CQE received for QPID=0x%0x\n" ,CQE_OPCODE (&cqe),CQE_QPID (&cqe));
drivers/infiniband/hw/cxgb4/iw_cxgb4.h +0 -2
@@ -693,8 +693,6 @@ static inline int to_ib_qp_state(int c4iw_qp_state)return IB_QPS_ERR ; } -#define C4IW_DRAIN_OPCODE FW_RI_SGE_EC_CR_RETURN -static inline u32 c4iw_ib_to_tpt_access (int a) { return (a & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) |
drivers/infiniband/hw/cxgb4/qp.c +42 -4
85 lines not on this page · raw message
drivers/infiniband/hw/cxgb4/t4.h +6 -0
@@ -197,6 +197,11 @@ struct t4_cqe {#define CQE_SWCQE_G (x) ((((x) >> CQE_SWCQE_S)) & CQE_SWCQE_M)#define CQE_SWCQE_V (x) ((x)<<CQE_SWCQE_S) +#define CQE_DRAIN_S 10 +#define CQE_DRAIN_M 0x1 +#define CQE_DRAIN_G (x) ((((x) >> CQE_DRAIN_S)) & CQE_DRAIN_M) +#define CQE_DRAIN_V (x) ((x)<<CQE_DRAIN_S) +#define CQE_STATUS_S 5#define CQE_STATUS_M 0x1F#define CQE_STATUS_G (x) ((((x) >> CQE_STATUS_S)) & CQE_STATUS_M)
@@ -213,6 +218,7 @@ struct t4_cqe {#define CQE_OPCODE_V (x) ((x)<<CQE_OPCODE_S)#define SW_CQE (x) (CQE_SWCQE_G(be32_to_cpu((x)->header))) +#define DRAIN_CQE (x) (CQE_DRAIN_G(be32_to_cpu((x)->header)))#define CQE_QPID (x) (CQE_QPID_G(be32_to_cpu((x)->header)))#define CQE_TYPE (x) (CQE_TYPE_G(be32_to_cpu((x)->header)))#define SQ_TYPE (x) (CQE_TYPE((x)))
Signature · 6 lines
1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html