Skip to content

Commit b46494b

Browse files
Chengchang Tangrleon
authored andcommitted
RDMA/hns: Fix deadlock on SRQ async events.
xa_lock for SRQ table may be required in AEQ. Use xa_store_irq()/ xa_erase_irq() to avoid deadlock. Fixes: 81fce62 ("RDMA/hns: Add SRQ asynchronous event support") Signed-off-by: Chengchang Tang <tangchengchang@huawei.com> Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com> Link: https://lore.kernel.org/r/20240412091616.370789-5-huangjunxian6@hisilicon.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent 2ce3843 commit b46494b

2 files changed

Lines changed: 4 additions & 3 deletions

File tree

drivers/infiniband/hw/hns/hns_roce_main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <rdma/ib_smi.h>
3838
#include <rdma/ib_user_verbs.h>
3939
#include <rdma/ib_cache.h>
40+
#include "hnae3.h"
4041
#include "hns_roce_common.h"
4142
#include "hns_roce_device.h"
4243
#include "hns_roce_hem.h"

drivers/infiniband/hw/hns/hns_roce_srq.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ static int alloc_srqc(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
123123
return ret;
124124
}
125125

126-
ret = xa_err(xa_store(&srq_table->xa, srq->srqn, srq, GFP_KERNEL));
126+
ret = xa_err(xa_store_irq(&srq_table->xa, srq->srqn, srq, GFP_KERNEL));
127127
if (ret) {
128128
ibdev_err(ibdev, "failed to store SRQC, ret = %d.\n", ret);
129129
goto err_put;
@@ -136,7 +136,7 @@ static int alloc_srqc(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
136136
return 0;
137137

138138
err_xa:
139-
xa_erase(&srq_table->xa, srq->srqn);
139+
xa_erase_irq(&srq_table->xa, srq->srqn);
140140
err_put:
141141
hns_roce_table_put(hr_dev, &srq_table->table, srq->srqn);
142142

@@ -154,7 +154,7 @@ static void free_srqc(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
154154
dev_err(hr_dev->dev, "DESTROY_SRQ failed (%d) for SRQN %06lx\n",
155155
ret, srq->srqn);
156156

157-
xa_erase(&srq_table->xa, srq->srqn);
157+
xa_erase_irq(&srq_table->xa, srq->srqn);
158158

159159
if (refcount_dec_and_test(&srq->refcount))
160160
complete(&srq->free);

0 commit comments

Comments
 (0)