16 Star 4 Fork 52

src-openEuler/rdma-core

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0047-libzrdma-Fix-wqe-polarity-set-error.patch 8.78 KB
一键复制 编辑 原始数据 按行查看 历史
李富艳 提交于 2025-03-24 11:42 +08:00 . fix some libzrdma bugs and add some optimization
From 232ae986da9c9995be0ae39bdf5b2145250c22c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=AF=8C=E8=89=B3?= <li.fuyan@zte.com.cn>
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: 李富艳 <li.fuyan@zte.com.cn>
---
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 <endian.h>
#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
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/src-openeuler/rdma-core.git
git@gitee.com:src-openeuler/rdma-core.git
src-openeuler
rdma-core
rdma-core
master

搜索帮助