Support SRQ record doorbell

driver inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8A08Z

Compared with normal doorbell, using record doorbell can shorten the
process of ringing the doorbell and reduce the latency.

Signed-off-by: Yangyang Li <liyangyang20@huawei.com>
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
Signed-off-by: Ran Zhou <zhouran10@h-partners.com>
(cherry picked from commit 23f6e3ca5e9fa66b41e3d33a9c4a88429cfc61ab)
This commit is contained in:
Ran Zhou 2023-10-25 11:10:36 +08:00 committed by openeuler-sync-bot
parent 086a7ec710
commit ed62e6ed00
3 changed files with 205 additions and 1 deletions

View File

@ -0,0 +1,46 @@
From 73a5a85a9fd75e2dd461bfd129d263fde44aa5ea Mon Sep 17 00:00:00 2001
From: Junxian Huang <huangjunxian6@hisilicon.com>
Date: Mon, 16 Oct 2023 16:10:05 +0800
Subject: [PATCH 1/2] Update kernel headers
To commit: c9813b0b9992 ("RDMA/hns: Support SRQ record doorbell").
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
---
kernel-headers/rdma/hns-abi.h | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/kernel-headers/rdma/hns-abi.h b/kernel-headers/rdma/hns-abi.h
index 157dc9d..6b94a89 100644
--- a/kernel-headers/rdma/hns-abi.h
+++ b/kernel-headers/rdma/hns-abi.h
@@ -52,15 +52,25 @@ struct hns_roce_ib_create_cq_resp {
__aligned_u64 cap_flags;
};
+enum hns_roce_srq_cap_flags {
+ HNS_ROCE_SRQ_CAP_RECORD_DB = 1 << 0,
+};
+
+enum hns_roce_srq_cap_flags_resp {
+ HNS_ROCE_RSP_SRQ_CAP_RECORD_DB = 1 << 0,
+};
+
struct hns_roce_ib_create_srq {
__aligned_u64 buf_addr;
__aligned_u64 db_addr;
__aligned_u64 que_addr;
+ __u32 req_cap_flags; /* Use enum hns_roce_srq_cap_flags */
+ __u32 reserved;
};
struct hns_roce_ib_create_srq_resp {
__u32 srqn;
- __u32 reserved;
+ __u32 cap_flags; /* Use enum hns_roce_srq_cap_flags */
};
enum hns_roce_create_qp_comp_mask {
--
2.25.1

View File

@ -0,0 +1,150 @@
From 2880d64c8d73375978d2767c5dd7803b444f9016 Mon Sep 17 00:00:00 2001
From: Yangyang Li <liyangyang20@huawei.com>
Date: Mon, 16 Oct 2023 16:10:06 +0800
Subject: [PATCH] libhns: Support SRQ record doorbell
Compared with normal doorbell, using record doorbell can shorten the
process of ringing the doorbell and reduce the latency.
During SRQ creation, the kernel driver will allocate doorbell buffer
and notify userspace whether the SRQ record doorbell is enabled with
the flag HNS_ROCE_RSP_SRQ_CAP_RECORD_DB. The userspace driver will decide
whether to use record doorbell or normal doorbell based on this flag
in post SRQ recv process.
This patch relies on the corresponding kernel patch:
RDMA/hns: Support SRQ record doorbell
Signed-off-by: Yangyang Li <liyangyang20@huawei.com>
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
---
providers/hns/hns_roce_u.h | 4 +++-
providers/hns/hns_roce_u_db.c | 1 +
providers/hns/hns_roce_u_hw_v2.c | 14 +++++++++-----
providers/hns/hns_roce_u_verbs.c | 12 +++++++-----
4 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/providers/hns/hns_roce_u.h b/providers/hns/hns_roce_u.h
index ae9ae51..197bde9 100644
--- a/providers/hns/hns_roce_u.h
+++ b/providers/hns/hns_roce_u.h
@@ -187,6 +187,7 @@ struct hns_roce_buf {
enum hns_roce_db_type {
HNS_ROCE_QP_TYPE_DB,
HNS_ROCE_CQ_TYPE_DB,
+ HNS_ROCE_SRQ_TYPE_DB,
HNS_ROCE_DB_TYPE_NUM
};
@@ -351,7 +352,8 @@ struct hns_roce_srq {
unsigned int max_gs;
unsigned int rsv_sge;
unsigned int wqe_shift;
- unsigned int *db;
+ unsigned int *rdb;
+ unsigned int cap_flags;
unsigned short counter;
struct list_node xrc_srcq_node;
};
diff --git a/providers/hns/hns_roce_u_db.c b/providers/hns/hns_roce_u_db.c
index 73a71de..bbef988 100644
--- a/providers/hns/hns_roce_u_db.c
+++ b/providers/hns/hns_roce_u_db.c
@@ -41,6 +41,7 @@
static const unsigned int db_size[] = {
[HNS_ROCE_QP_TYPE_DB] = 4,
[HNS_ROCE_CQ_TYPE_DB] = 4,
+ [HNS_ROCE_SRQ_TYPE_DB] = 4,
};
static struct hns_roce_db_page *hns_roce_add_db_page(
diff --git a/providers/hns/hns_roce_u_hw_v2.c b/providers/hns/hns_roce_u_hw_v2.c
index ac40d5d..714a34e 100644
--- a/providers/hns/hns_roce_u_hw_v2.c
+++ b/providers/hns/hns_roce_u_hw_v2.c
@@ -2109,11 +2109,15 @@ static void fill_wqe_idx(struct hns_roce_srq *srq, unsigned int wqe_idx)
idx_que->head++;
}
-static void update_srq_db(struct hns_roce_db *db, struct hns_roce_srq *srq)
+static void update_srq_db(struct hns_roce_context *ctx, struct hns_roce_db *db,
+ struct hns_roce_srq *srq)
{
hr_reg_write(db, DB_TAG, srq->srqn);
hr_reg_write(db, DB_CMD, HNS_ROCE_V2_SRQ_DB);
hr_reg_write(db, DB_PI, srq->idx_que.head);
+
+ hns_roce_write64(ctx, ctx->uar + ROCEE_VF_DB_CFG0_OFFSET,
+ (__le32 *)db);
}
static int check_srq_recv(struct hns_roce_context *ctx)
@@ -2176,10 +2180,10 @@ static int hns_roce_u_v2_post_srq_recv(struct ibv_srq *ib_srq,
*/
udma_to_device_barrier();
- update_srq_db(&srq_db, srq);
-
- hns_roce_write64(ctx, ctx->uar + ROCEE_VF_DB_CFG0_OFFSET,
- (__le32 *)&srq_db);
+ if (srq->cap_flags & HNS_ROCE_RSP_SRQ_CAP_RECORD_DB)
+ *srq->rdb = srq->idx_que.head & 0xffff;
+ else
+ update_srq_db(ctx, &srq_db, srq);
}
hns_roce_spin_unlock(&srq->hr_lock);
diff --git a/providers/hns/hns_roce_u_verbs.c b/providers/hns/hns_roce_u_verbs.c
index f76341c..1c2d94d 100644
--- a/providers/hns/hns_roce_u_verbs.c
+++ b/providers/hns/hns_roce_u_verbs.c
@@ -866,7 +866,8 @@ static int exec_srq_create_cmd(struct ibv_context *context,
cmd_ex.buf_addr = (uintptr_t)srq->wqe_buf.buf;
cmd_ex.que_addr = (uintptr_t)srq->idx_que.buf.buf;
- cmd_ex.db_addr = (uintptr_t)srq->db;
+ cmd_ex.db_addr = (uintptr_t)srq->rdb;
+ cmd_ex.req_cap_flags |= HNS_ROCE_SRQ_CAP_RECORD_DB;
ret = ibv_cmd_create_srq_ex(context, &srq->verbs_srq, init_attr,
&cmd_ex.ibv_cmd, sizeof(cmd_ex),
@@ -875,6 +876,7 @@ static int exec_srq_create_cmd(struct ibv_context *context,
return ret;
srq->srqn = resp_ex.srqn;
+ srq->cap_flags = resp_ex.cap_flags;
return 0;
}
@@ -932,8 +934,8 @@ static struct ibv_srq *create_srq(struct ibv_context *context,
if (alloc_srq_buf(srq))
goto err_free_srq;
- srq->db = hns_roce_alloc_db(hr_ctx, HNS_ROCE_QP_TYPE_DB);
- if (!srq->db)
+ srq->rdb = hns_roce_alloc_db(hr_ctx, HNS_ROCE_SRQ_TYPE_DB);
+ if (!srq->rdb)
goto err_srq_buf;
ret = exec_srq_create_cmd(context, srq, init_attr);
@@ -956,7 +958,7 @@ err_destroy_srq:
ibv_cmd_destroy_srq(&srq->verbs_srq.srq);
err_srq_db:
- hns_roce_free_db(hr_ctx, srq->db, HNS_ROCE_QP_TYPE_DB);
+ hns_roce_free_db(hr_ctx, srq->rdb, HNS_ROCE_SRQ_TYPE_DB);
err_srq_buf:
free_srq_buf(srq);
@@ -1048,7 +1050,7 @@ int hns_roce_u_destroy_srq(struct ibv_srq *ibv_srq)
hns_roce_clear_srq(ctx, srq->srqn);
- hns_roce_free_db(ctx, srq->db, HNS_ROCE_QP_TYPE_DB);
+ hns_roce_free_db(ctx, srq->rdb, HNS_ROCE_SRQ_TYPE_DB);
free_srq_buf(srq);
free(srq);
--
2.25.1

View File

@ -1,6 +1,6 @@
Name: rdma-core Name: rdma-core
Version: 41.0 Version: 41.0
Release: 16 Release: 17
Summary: RDMA core userspace libraries and daemons Summary: RDMA core userspace libraries and daemons
License: GPLv2 or BSD License: GPLv2 or BSD
Url: https://github.com/linux-rdma/rdma-core Url: https://github.com/linux-rdma/rdma-core
@ -64,6 +64,8 @@ Patch54: 0055-libhns-separate-the-initialization-steps-of-lock.patch
Patch55: 0056-libhns-assign-doorbell-to-zero-when-allocate-it.patch Patch55: 0056-libhns-assign-doorbell-to-zero-when-allocate-it.patch
patch56: 0057-libhns-Fix-missing-reset-notification.patch patch56: 0057-libhns-Fix-missing-reset-notification.patch
patch57: 0058-libhns-Support-flexible-WQE-buffer-page-size.patch patch57: 0058-libhns-Support-flexible-WQE-buffer-page-size.patch
patch58: 0059-Update-kernel-headers.patch
patch59: 0060-libhns-Support-SRQ-record-doorbell.patch
BuildRequires: binutils cmake >= 2.8.11 gcc libudev-devel pkgconfig pkgconfig(libnl-3.0) BuildRequires: binutils cmake >= 2.8.11 gcc libudev-devel pkgconfig pkgconfig(libnl-3.0)
BuildRequires: pkgconfig(libnl-route-3.0) valgrind-devel systemd systemd-devel BuildRequires: pkgconfig(libnl-route-3.0) valgrind-devel systemd systemd-devel
@ -311,6 +313,12 @@ fi
%{_mandir}/* %{_mandir}/*
%changelog %changelog
* Wed Oct 25 2023 Ran Zhou <zhouran10@h-partners.com> - 41.0-17
- Type: requirement
- ID: NA
- SUG: NA
- DESC: Support SRQ record doorbell
* Tue Oct 24 2023 Ran Zhou <zhouran10@h-partners.com> - 41.0-16 * Tue Oct 24 2023 Ran Zhou <zhouran10@h-partners.com> - 41.0-16
- Type: requirement - Type: requirement
- ID: NA - ID: NA