From 232ae986da9c9995be0ae39bdf5b2145250c22c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=8C=E8=89=B3?= Date: Fri, 28 Mar 2025 11:04:33 +0800 Subject: [PATCH] Fix: wqe polarity set error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李富艳 --- providers/zrdma/zxdh_defs.h | 3 -- providers/zrdma/zxdh_hw.c | 62 +++++++----------------------------- providers/zrdma/zxdh_verbs.h | 1 - 3 files changed, 11 insertions(+), 55 deletions(-) diff --git a/providers/zrdma/zxdh_defs.h b/providers/zrdma/zxdh_defs.h index eaf73ca..3863fb9 100644 --- a/providers/zrdma/zxdh_defs.h +++ b/providers/zrdma/zxdh_defs.h @@ -313,9 +313,6 @@ #define ZXDH_RING_FREE_QUANTA(_ring) \ (((_ring).size - ZXDH_RING_USED_QUANTA(_ring) - 1)) -#define ZXDH_SQ_RING_FREE_QUANTA(_ring) \ - (((_ring).size - ZXDH_RING_USED_QUANTA(_ring) - 257)) - #define ZXDH_ATOMIC_RING_MOVE_HEAD(_ring, index, _retcode) \ { \ index = ZXDH_RING_CURRENT_HEAD(_ring); \ diff --git a/providers/zrdma/zxdh_hw.c b/providers/zrdma/zxdh_hw.c index ed577a9..073b198 100644 --- a/providers/zrdma/zxdh_hw.c +++ b/providers/zrdma/zxdh_hw.c @@ -20,13 +20,14 @@ #include #define ERROR_CODE_VALUE 65 -static void qp_tx_psn_add(__u32 *x, __u32 y, __u16 mtu) +static inline void qp_tx_psn_add(__u32 *x, __u32 y, __u16 mtu) { if (y == 0) { *x = (*x + 1) & 0xffffff; return; } - *x = (*x + ((y % mtu) ? (y / mtu + 1) : y / mtu)) & 0xffffff; + __u32 chunks = (y + mtu - 1) / mtu; + *x = (*x + chunks) & 0xffffff; } int zxdh_get_write_imm_split_switch(void) @@ -95,26 +96,6 @@ static enum zxdh_status_code zxdh_nop_1(struct zxdh_qp *qp) return 0; } -/** - * zxdh_clr_wqes - clear next 128 sq entries - * @qp: hw qp ptr - * @qp_wqe_idx: wqe_idx - */ -void zxdh_clr_wqes(struct zxdh_qp *qp, __u32 qp_wqe_idx) -{ - __le64 *wqe; - __u32 wqe_idx; - - if (!(qp_wqe_idx & 0x7F)) { - wqe_idx = (qp_wqe_idx + 128) % qp->sq_ring.size; - wqe = qp->sq_base[wqe_idx].elem; - if (wqe_idx) - memset(wqe, qp->swqe_polarity ? 0 : 0xFF, 0x1000); - else - memset(wqe, qp->swqe_polarity ? 0xFF : 0, 0x1000); - } -} - /** * zxdh_qp_post_wr - ring doorbell * @qp: hw qp ptr @@ -197,14 +178,13 @@ __le64 *zxdh_qp_get_next_send_wqe(struct zxdh_qp *qp, __u32 *wqe_idx, avail_quanta = ZXDH_MAX_SQ_WQES_PER_PAGE - (ZXDH_RING_CURRENT_HEAD(qp->sq_ring) % ZXDH_MAX_SQ_WQES_PER_PAGE); - if (quanta <= avail_quanta) { + if (likely(quanta <= avail_quanta)) { /* WR fits in current chunk */ - if (quanta > ZXDH_SQ_RING_FREE_QUANTA(qp->sq_ring)) + if (unlikely(quanta > ZXDH_RING_FREE_QUANTA(qp->sq_ring))) return NULL; } else { /* Need to pad with NOP */ - if (quanta + avail_quanta > - ZXDH_SQ_RING_FREE_QUANTA(qp->sq_ring)) + if (quanta + avail_quanta > ZXDH_RING_FREE_QUANTA(qp->sq_ring)) return NULL; for (i = 0; i < avail_quanta; i++) { @@ -287,8 +267,6 @@ zxdh_post_rdma_write(struct zxdh_qp *qp, struct zxdh_post_sq_info *info, if (!wqe) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; - zxdh_clr_wqes(qp, wqe_idx); - if (op_info->num_lo_sges) { set_64bit_val( wqe, 16, @@ -635,8 +613,6 @@ static enum zxdh_status_code zxdh_post_rdma_read(struct zxdh_qp *qp, if (!wqe) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; - zxdh_clr_wqes(qp, wqe_idx); - addl_frag_cnt = op_info->num_lo_sges > 1 ? (op_info->num_lo_sges - 1) : 0; local_fence |= info->local_fence; @@ -817,8 +793,6 @@ enum zxdh_status_code zxdh_rc_send(struct zxdh_qp *qp, if (!wqe) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; - zxdh_clr_wqes(qp, wqe_idx); - read_fence |= info->read_fence; addl_frag_cnt = op_info->num_sges > 1 ? (op_info->num_sges - 1) : 0; if (op_info->num_sges) { @@ -975,7 +949,7 @@ enum zxdh_status_code zxdh_ud_send(struct zxdh_qp *qp, if (ret_code) return ret_code; - if (quanta > ZXDH_SQ_RING_FREE_QUANTA(qp->sq_ring)) + if (quanta > ZXDH_RING_FREE_QUANTA(qp->sq_ring)) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; wqe_idx = ZXDH_RING_CURRENT_HEAD(qp->sq_ring); @@ -989,8 +963,6 @@ enum zxdh_status_code zxdh_ud_send(struct zxdh_qp *qp, qp->sq_wrtrk_array[wqe_idx].wr_len = total_size; qp->sq_wrtrk_array[wqe_idx].quanta = quanta; - zxdh_clr_wqes(qp, wqe_idx); - read_fence |= info->read_fence; addl_frag_cnt = op_info->num_sges > 1 ? (op_info->num_sges - 1) : 0; hdr = FIELD_PREP(ZXDHQPSQ_VALID, qp->swqe_polarity) | @@ -1281,8 +1253,6 @@ enum zxdh_status_code zxdh_inline_rdma_write(struct zxdh_qp *qp, if (!wqe) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; - zxdh_clr_wqes(qp, wqe_idx); - read_fence |= info->read_fence; hdr = FIELD_PREP(ZXDHQPSQ_VALID, qp->swqe_polarity) | FIELD_PREP(ZXDHQPSQ_OPCODE, info->op_type) | @@ -1293,7 +1263,7 @@ enum zxdh_status_code zxdh_inline_rdma_write(struct zxdh_qp *qp, FIELD_PREP(ZXDHQPSQ_IMMDATAFLAG, imm_data_flag) | FIELD_PREP(ZXDHQPSQ_WRITE_INLINEDATAFLAG, 1) | FIELD_PREP(ZXDHQPSQ_WRITE_INLINEDATALEN, op_info->len) | - FIELD_PREP(ZXDHQPSQ_ADDFRAGCNT, quanta - 1) | + FIELD_PREP(ZXDHQPSQ_ADDFRAGCNT, (__u16)(quanta - 1)) | FIELD_PREP(ZXDHQPSQ_REMSTAG, op_info->rem_addr.stag); set_64bit_val(wqe, 24, FIELD_PREP(ZXDHQPSQ_FRAG_TO, op_info->rem_addr.tag_off)); @@ -1355,8 +1325,6 @@ enum zxdh_status_code zxdh_rc_inline_send(struct zxdh_qp *qp, if (!wqe) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; - zxdh_clr_wqes(qp, wqe_idx); - read_fence |= info->read_fence; hdr = FIELD_PREP(ZXDHQPSQ_VALID, qp->swqe_polarity) | FIELD_PREP(ZXDHQPSQ_OPCODE, info->op_type) | @@ -1364,7 +1332,7 @@ enum zxdh_status_code zxdh_rc_inline_send(struct zxdh_qp *qp, FIELD_PREP(ZXDHQPSQ_LOCALFENCE, info->local_fence) | FIELD_PREP(ZXDHQPSQ_READFENCE, read_fence) | FIELD_PREP(ZXDHQPSQ_SOLICITED, info->solicited) | - FIELD_PREP(ZXDHQPSQ_ADDFRAGCNT, quanta - 1) | + FIELD_PREP(ZXDHQPSQ_ADDFRAGCNT, (__u16)(quanta - 1)) | FIELD_PREP(ZXDHQPSQ_IMMDATAFLAG, imm_data_flag) | FIELD_PREP(ZXDHQPSQ_REMSTAG, info->stag_to_inv); set_64bit_val(wqe, 24, @@ -1430,7 +1398,7 @@ enum zxdh_status_code zxdh_ud_inline_send(struct zxdh_qp *qp, quanta = qp->wqe_ops.iw_inline_data_size_to_quanta(op_info->len, imm_data_flag); - if (quanta > ZXDH_SQ_RING_FREE_QUANTA(qp->sq_ring)) + if (quanta > ZXDH_RING_FREE_QUANTA(qp->sq_ring)) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; wqe_idx = ZXDH_RING_CURRENT_HEAD(qp->sq_ring); @@ -1444,8 +1412,6 @@ enum zxdh_status_code zxdh_ud_inline_send(struct zxdh_qp *qp, qp->sq_wrtrk_array[wqe_idx].wr_len = op_info->len; qp->sq_wrtrk_array[wqe_idx].quanta = quanta; - zxdh_clr_wqes(qp, wqe_idx); - read_fence |= info->read_fence; hdr = FIELD_PREP(ZXDHQPSQ_VALID, qp->swqe_polarity) | FIELD_PREP(ZXDHQPSQ_OPCODE, info->op_type) | @@ -1454,7 +1420,7 @@ enum zxdh_status_code zxdh_ud_inline_send(struct zxdh_qp *qp, FIELD_PREP(ZXDHQPSQ_IMMDATAFLAG, imm_data_flag) | FIELD_PREP(ZXDHQPSQ_UD_INLINEDATAFLAG, 1) | FIELD_PREP(ZXDHQPSQ_UD_INLINEDATALEN, op_info->len) | - FIELD_PREP(ZXDHQPSQ_UD_ADDFRAGCNT, quanta - 1) | + FIELD_PREP(ZXDHQPSQ_UD_ADDFRAGCNT, (__u16)(quanta - 1)) | FIELD_PREP(ZXDHQPSQ_AHID, op_info->ah_id); set_64bit_val(wqe_base, 24, FIELD_PREP(ZXDHQPSQ_DESTQPN, op_info->dest_qp) | @@ -1572,8 +1538,6 @@ enum zxdh_status_code zxdh_stag_local_invalidate(struct zxdh_qp *qp, if (!wqe) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; - zxdh_clr_wqes(qp, wqe_idx); - set_64bit_val(wqe, 16, 0); hdr = FIELD_PREP(ZXDHQPSQ_VALID, qp->swqe_polarity) | @@ -1618,8 +1582,6 @@ enum zxdh_status_code zxdh_mw_bind(struct zxdh_qp *qp, if (!wqe) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; - zxdh_clr_wqes(qp, wqe_idx); - if (op_info->ena_writes) { access = (op_info->ena_reads << 2) | (op_info->ena_writes << 3) | (1 << 1) | access; @@ -2391,8 +2353,6 @@ enum zxdh_status_code zxdh_nop(struct zxdh_qp *qp, __u64 wr_id, bool signaled, if (!wqe) return ZXDH_ERR_QP_TOOMANY_WRS_POSTED; - zxdh_clr_wqes(qp, wqe_idx); - set_64bit_val(wqe, 0, 0); set_64bit_val(wqe, 8, 0); set_64bit_val(wqe, 16, 0); diff --git a/providers/zrdma/zxdh_verbs.h b/providers/zrdma/zxdh_verbs.h index 69a98cc..40aa7bb 100644 --- a/providers/zrdma/zxdh_verbs.h +++ b/providers/zrdma/zxdh_verbs.h @@ -596,7 +596,6 @@ int zxdh_qp_round_up(__u32 wqdepth); int zxdh_cq_round_up(__u32 wqdepth); void zxdh_qp_push_wqe(struct zxdh_qp *qp, __le64 *wqe, __u16 quanta, __u32 wqe_idx, bool post_sq); -void zxdh_clr_wqes(struct zxdh_qp *qp, __u32 qp_wqe_idx); void zxdh_get_srq_wqe_shift(struct zxdh_dev_attrs *dev_attrs, __u32 sge, __u8 *shift); -- 2.27.0