The last commit was found when I created a XRC SRQ in lock-free mode but failed to destroy it because of the refcnt check added in the previous commit. The failure was because the PAD was acquired through ibv_srq->pd in destroy_srq(), while ibv_srq->pd wasn't assigned when the SRQ was created by ibv_create_srq_ex(). So let's assign ibv_srq->pd in the common ibv_icmd_create_srq() , so that drivers can get the correct pd no matter which api the SRQ is created by. Signed-off-by: Xinghai Cen <cenxinghai@h-partners.com> (cherry picked from commit 3ac30fc125c7cff122f21ff8593294060c92429f)
59 lines
1.7 KiB
Diff
59 lines
1.7 KiB
Diff
From 478e5fd1d8e1a0b04fe6638c163951a0892eab44 Mon Sep 17 00:00:00 2001
|
|
From: Junxian Huang <huangjunxian6@hisilicon.com>
|
|
Date: Wed, 23 Apr 2025 16:55:14 +0800
|
|
Subject: [PATCH 59/62] libhns: Fix ret not assigned in create srq()
|
|
|
|
mainline inclusion
|
|
from mainline-v56.0-65
|
|
commit 2034b1860c5a8b0cc3879315259462c04e53a98d
|
|
category: bugfix
|
|
bugzilla: https://gitee.com/src-openeuler/rdma-core/issues/IC3X57
|
|
CVE: NA
|
|
|
|
Reference:
|
|
https://github.com/linux-rdma/rdma-core/pull/1599/commits/2034b1860c5a8b0cc3...
|
|
|
|
---------------------------------------------------------------------
|
|
|
|
Fix the problem that ret may not be assigned in the error flow
|
|
of create_srq().
|
|
|
|
Fixes: aa7bcf7f7e44 ("libhns: Add support for lock-free SRQ")
|
|
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
|
|
Signed-off-by: Xinghai Cen <cenxinghai@h-partners.com>
|
|
---
|
|
providers/hns/hns_roce_u_verbs.c | 10 +++++++---
|
|
1 file changed, 7 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/providers/hns/hns_roce_u_verbs.c b/providers/hns/hns_roce_u_verbs.c
|
|
index 3efc2f4..e0bafe3 100644
|
|
--- a/providers/hns/hns_roce_u_verbs.c
|
|
+++ b/providers/hns/hns_roce_u_verbs.c
|
|
@@ -933,16 +933,20 @@ static struct ibv_srq *create_srq(struct ibv_context *context,
|
|
if (pad)
|
|
atomic_fetch_add(&pad->pd.refcount, 1);
|
|
|
|
- if (hns_roce_srq_spinlock_init(context, srq, init_attr))
|
|
+ ret = hns_roce_srq_spinlock_init(context, srq, init_attr);
|
|
+ if (ret)
|
|
goto err_free_srq;
|
|
|
|
set_srq_param(context, srq, init_attr);
|
|
- if (alloc_srq_buf(srq))
|
|
+ ret = alloc_srq_buf(srq);
|
|
+ if (ret)
|
|
goto err_destroy_lock;
|
|
|
|
srq->rdb = hns_roce_alloc_db(hr_ctx, HNS_ROCE_SRQ_TYPE_DB);
|
|
- if (!srq->rdb)
|
|
+ if (!srq->rdb) {
|
|
+ ret = ENOMEM;
|
|
goto err_srq_buf;
|
|
+ }
|
|
|
|
ret = exec_srq_create_cmd(context, srq, init_attr);
|
|
if (ret)
|
|
--
|
|
2.25.1
|
|
|