mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-22 19:22:28 +07:00
RDMA/hns: Add SRQ asynchronous event support
This patch implements the process flow of SRQ asynchronous event. Signed-off-by: Lijun Ou <oulijun@huawei.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
c7bcb13442
commit
81fce6291d
@ -646,6 +646,12 @@ struct hns_roce_aeqe {
|
||||
u32 rsv1;
|
||||
} qp_event;
|
||||
|
||||
struct {
|
||||
__le32 srq;
|
||||
u32 rsv0;
|
||||
u32 rsv1;
|
||||
} srq_event;
|
||||
|
||||
struct {
|
||||
__le32 cq;
|
||||
u32 rsv0;
|
||||
@ -1135,6 +1141,7 @@ void hns_roce_free_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db);
|
||||
void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn);
|
||||
void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type);
|
||||
void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type);
|
||||
void hns_roce_srq_event(struct hns_roce_dev *hr_dev, u32 srqn, int event_type);
|
||||
int hns_get_gid_index(struct hns_roce_dev *hr_dev, u8 port, int gid_index);
|
||||
int hns_roce_init(struct hns_roce_dev *hr_dev);
|
||||
void hns_roce_exit(struct hns_roce_dev *hr_dev);
|
||||
|
@ -4459,6 +4459,7 @@ static int hns_roce_v2_aeq_int(struct hns_roce_dev *hr_dev,
|
||||
int aeqe_found = 0;
|
||||
int event_type;
|
||||
int sub_type;
|
||||
u32 srqn;
|
||||
u32 qpn;
|
||||
u32 cqn;
|
||||
|
||||
@ -4481,6 +4482,9 @@ static int hns_roce_v2_aeq_int(struct hns_roce_dev *hr_dev,
|
||||
cqn = roce_get_field(aeqe->event.cq_event.cq,
|
||||
HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_M,
|
||||
HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_S);
|
||||
srqn = roce_get_field(aeqe->event.srq_event.srq,
|
||||
HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_M,
|
||||
HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_S);
|
||||
|
||||
switch (event_type) {
|
||||
case HNS_ROCE_EVENT_TYPE_PATH_MIG:
|
||||
@ -4488,13 +4492,14 @@ static int hns_roce_v2_aeq_int(struct hns_roce_dev *hr_dev,
|
||||
case HNS_ROCE_EVENT_TYPE_COMM_EST:
|
||||
case HNS_ROCE_EVENT_TYPE_SQ_DRAINED:
|
||||
case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR:
|
||||
case HNS_ROCE_EVENT_TYPE_SRQ_LAST_WQE_REACH:
|
||||
case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR:
|
||||
case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR:
|
||||
hns_roce_qp_event(hr_dev, qpn, event_type);
|
||||
break;
|
||||
case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH:
|
||||
case HNS_ROCE_EVENT_TYPE_SRQ_LAST_WQE_REACH:
|
||||
case HNS_ROCE_EVENT_TYPE_SRQ_CATAS_ERROR:
|
||||
hns_roce_srq_event(hr_dev, srqn, event_type);
|
||||
break;
|
||||
case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR:
|
||||
case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW:
|
||||
|
@ -9,6 +9,29 @@
|
||||
#include "hns_roce_cmd.h"
|
||||
#include "hns_roce_hem.h"
|
||||
|
||||
void hns_roce_srq_event(struct hns_roce_dev *hr_dev, u32 srqn, int event_type)
|
||||
{
|
||||
struct hns_roce_srq_table *srq_table = &hr_dev->srq_table;
|
||||
struct hns_roce_srq *srq;
|
||||
|
||||
xa_lock(&srq_table->xa);
|
||||
srq = xa_load(&srq_table->xa, srqn & (hr_dev->caps.num_srqs - 1));
|
||||
if (srq)
|
||||
atomic_inc(&srq->refcount);
|
||||
xa_unlock(&srq_table->xa);
|
||||
|
||||
if (!srq) {
|
||||
dev_warn(hr_dev->dev, "Async event for bogus SRQ %08x\n", srqn);
|
||||
return;
|
||||
}
|
||||
|
||||
srq->event(srq, event_type);
|
||||
|
||||
if (atomic_dec_and_test(&srq->refcount))
|
||||
complete(&srq->free);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hns_roce_srq_event);
|
||||
|
||||
static void hns_roce_ib_srq_event(struct hns_roce_srq *srq,
|
||||
enum hns_roce_event event_type)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user