Skip to content

Commit 324c42e

Browse files
authored
Merge pull request #1587 from hginjgerx/trace
libhns: Add support for LTTng tracing
2 parents 03cb390 + 19cb51c commit 324c42e

File tree

4 files changed

+305
-0
lines changed

4 files changed

+305
-0
lines changed

providers/hns/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
if (ENABLE_LTTNG AND LTTNGUST_FOUND)
2+
set(TRACE_FILE hns_roce_u_trace.c)
3+
endif()
4+
15
rdma_shared_provider(hns libhns.map
26
1 1.0.${PACKAGE_VERSION}
7+
${TRACE_FILE}
38
hns_roce_u.c
49
hns_roce_u_buf.c
510
hns_roce_u_db.c
@@ -12,3 +17,8 @@ publish_headers(infiniband
1217
)
1318

1419
rdma_pkg_config("hns" "libibverbs" "${CMAKE_THREAD_LIBS_INIT}")
20+
21+
if (ENABLE_LTTNG AND LTTNGUST_FOUND)
22+
target_include_directories(hns PUBLIC ".")
23+
target_link_libraries(hns LINK_PRIVATE LTTng::UST)
24+
endif()

providers/hns/hns_roce_u_hw_v2.c

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "hns_roce_u.h"
3939
#include "hns_roce_u_db.h"
4040
#include "hns_roce_u_hw_v2.h"
41+
#include "hns_roce_u_trace.h"
4142

4243
#define HR_IBV_OPC_MAP(ib_key, hr_key) \
4344
[IBV_WR_ ## ib_key] = HNS_ROCE_WQE_OP_ ## hr_key
@@ -680,6 +681,80 @@ static int parse_cqe_for_cq(struct hns_roce_context *ctx, struct hns_roce_cq *cq
680681
return 0;
681682
}
682683

684+
#ifdef LTTNG_ENABLED
685+
static uint8_t read_wc_sl(struct hns_roce_qp *hr_qp,
686+
struct hns_roce_v2_cqe *cqe,
687+
struct ibv_wc *wc)
688+
{
689+
return hr_qp->verbs_qp.qp.qp_type == IBV_QPT_UD &&
690+
hr_reg_read(cqe, CQE_S_R) == CQE_FOR_RQ ?
691+
wc->sl : UINT8_MAX;
692+
}
693+
694+
static uint32_t read_wc_rqpn(struct hns_roce_qp *hr_qp,
695+
struct hns_roce_v2_cqe *cqe,
696+
struct ibv_wc *wc)
697+
{
698+
return hr_qp->verbs_qp.qp.qp_type == IBV_QPT_UD &&
699+
hr_reg_read(cqe, CQE_S_R) == CQE_FOR_RQ ?
700+
wc->src_qp : UINT32_MAX;
701+
}
702+
703+
static uint32_t read_wc_byte_len(struct hns_roce_v2_cqe *cqe,
704+
struct ibv_wc *wc)
705+
{
706+
if (hr_reg_read(cqe, CQE_S_R) == CQE_FOR_RQ)
707+
return wc->byte_len;
708+
709+
switch (hr_reg_read(cqe, CQE_OPCODE)) {
710+
case HNS_ROCE_SQ_OP_RDMA_READ:
711+
case HNS_ROCE_SQ_OP_ATOMIC_COMP_AND_SWAP:
712+
case HNS_ROCE_SQ_OP_ATOMIC_FETCH_AND_ADD:
713+
case HNS_ROCE_SQ_OP_ATOMIC_MASK_COMP_AND_SWAP:
714+
case HNS_ROCE_SQ_OP_ATOMIC_MASK_FETCH_AND_ADD:
715+
return wc->byte_len;
716+
default:
717+
return UINT32_MAX;
718+
}
719+
}
720+
721+
static uint8_t trace_wc_read_sl(struct ibv_cq_ex *cq_ex)
722+
{
723+
return cq_ex->read_sl ? cq_ex->read_sl(cq_ex) : UINT8_MAX;
724+
}
725+
726+
static uint32_t trace_wc_read_qp_num(struct ibv_cq_ex *cq_ex)
727+
{
728+
return cq_ex->read_qp_num ?
729+
cq_ex->read_qp_num(cq_ex) : UINT32_MAX;
730+
}
731+
732+
static uint32_t trace_wc_read_src_qp(struct ibv_cq_ex *cq_ex)
733+
{
734+
return cq_ex->read_src_qp ?
735+
cq_ex->read_src_qp(cq_ex) : UINT32_MAX;
736+
}
737+
738+
static uint32_t trace_wc_read_byte_len(struct ibv_cq_ex *cq_ex)
739+
{
740+
return cq_ex->read_byte_len ?
741+
cq_ex->read_byte_len(cq_ex) : UINT32_MAX;
742+
}
743+
744+
static uint32_t get_send_wr_rqpn(struct ibv_send_wr *wr,
745+
uint8_t qp_type)
746+
{
747+
return qp_type == IBV_QPT_UD ? wr->wr.ud.remote_qpn : UINT32_MAX;
748+
}
749+
750+
static uint8_t get_send_wr_tclass(struct ibv_send_wr *wr,
751+
uint8_t qp_type)
752+
{
753+
return qp_type == IBV_QPT_UD ?
754+
to_hr_ah(wr->wr.ud.ah)->av.tclass : UINT8_MAX;
755+
}
756+
#endif
757+
683758
static int hns_roce_poll_one(struct hns_roce_context *ctx,
684759
struct hns_roce_qp **cur_qp, struct hns_roce_cq *cq,
685760
struct ibv_wc *wc)
@@ -716,8 +791,27 @@ static int hns_roce_poll_one(struct hns_roce_context *ctx,
716791
wc->status = wc_status;
717792
wc->vendor_err = hr_reg_read(cqe, CQE_SUB_STATUS);
718793
wc->qp_num = qpn;
794+
795+
rdma_tracepoint(rdma_core_hns, poll_cq,
796+
cq->verbs_cq.cq.context->device->name,
797+
wc->wr_id, wc_status, wc->opcode,
798+
wc->wc_flags, wc->vendor_err,
799+
read_wc_sl(*cur_qp, cqe, wc),
800+
wc->qp_num, read_wc_rqpn(*cur_qp, cqe, wc),
801+
read_wc_byte_len(cqe, wc));
719802
} else {
720803
cq->verbs_cq.cq_ex.status = wc_status;
804+
805+
rdma_tracepoint(rdma_core_hns, poll_cq,
806+
cq->verbs_cq.cq.context->device->name,
807+
cq->verbs_cq.cq_ex.wr_id, wc_status,
808+
ibv_wc_read_opcode(&cq->verbs_cq.cq_ex),
809+
ibv_wc_read_wc_flags(&cq->verbs_cq.cq_ex),
810+
ibv_wc_read_vendor_err(&cq->verbs_cq.cq_ex),
811+
trace_wc_read_sl(&cq->verbs_cq.cq_ex),
812+
trace_wc_read_qp_num(&cq->verbs_cq.cq_ex),
813+
trace_wc_read_src_qp(&cq->verbs_cq.cq_ex),
814+
trace_wc_read_byte_len(&cq->verbs_cq.cq_ex));
721815
}
722816

723817
if (status == HNS_ROCE_V2_CQE_SUCCESS ||
@@ -1328,6 +1422,14 @@ int hns_roce_u_v2_post_send(struct ibv_qp *ibvqp, struct ibv_send_wr *wr,
13281422
*bad_wr = wr;
13291423
goto out;
13301424
}
1425+
1426+
rdma_tracepoint(rdma_core_hns, post_send,
1427+
ibvqp->context->device->name, wr->wr_id,
1428+
sge_info.valid_num, ibvqp->qp_num,
1429+
get_send_wr_rqpn(wr, ibvqp->qp_type),
1430+
wr->send_flags, sge_info.total_len,
1431+
wr->opcode, qp->sl,
1432+
get_send_wr_tclass(wr, ibvqp->qp_type));
13311433
}
13321434

13331435
out:
@@ -1457,6 +1559,10 @@ static int hns_roce_u_v2_post_recv(struct ibv_qp *ibvqp, struct ibv_recv_wr *wr,
14571559
wqe_idx = (qp->rq.head + nreq) & (qp->rq.wqe_cnt - 1);
14581560
fill_rq_wqe(qp, wr, wqe_idx, max_sge);
14591561
qp->rq.wrid[wqe_idx] = wr->wr_id;
1562+
1563+
rdma_tracepoint(rdma_core_hns, post_recv,
1564+
ibvqp->context->device->name, wr->wr_id,
1565+
wr->num_sge, ibvqp->qp_num, 0);
14601566
}
14611567

14621568
out:
@@ -1794,6 +1900,10 @@ static int hns_roce_u_v2_post_srq_recv(struct ibv_srq *ib_srq,
17941900
fill_wqe_idx(srq, wqe_idx);
17951901

17961902
srq->wrid[wqe_idx] = wr->wr_id;
1903+
1904+
rdma_tracepoint(rdma_core_hns, post_recv,
1905+
ib_srq->context->device->name, wr->wr_id,
1906+
wr->num_sge, srq->srqn, 1);
17971907
}
17981908

17991909
if (nreq) {
@@ -2062,6 +2172,12 @@ static void wr_set_sge_rc(struct ibv_qp_ex *ibv_qp, uint32_t lkey,
20622172
wqe->msg_len = htole32(length);
20632173
hr_reg_write(wqe, RCWQE_LEN0, length);
20642174
hr_reg_write(wqe, RCWQE_SGE_NUM, !!length);
2175+
2176+
rdma_tracepoint(rdma_core_hns, post_send,
2177+
ibv_qp->qp_base.context->device->name, ibv_qp->wr_id,
2178+
!!length, ibv_qp->qp_base.qp_num, UINT32_MAX,
2179+
ibv_qp->wr_flags, length,
2180+
hr_reg_read(wqe, RCWQE_OPCODE), qp->sl, UINT8_MAX);
20652181
}
20662182

20672183
static void set_sgl_rc(struct hns_roce_v2_wqe_data_seg *dseg,
@@ -2126,6 +2242,12 @@ static void wr_set_sge_list_rc(struct ibv_qp_ex *ibv_qp, size_t num_sge,
21262242

21272243
wqe->msg_len = htole32(qp->sge_info.total_len);
21282244
hr_reg_write(wqe, RCWQE_SGE_NUM, qp->sge_info.valid_num);
2245+
2246+
rdma_tracepoint(rdma_core_hns, post_send,
2247+
ibv_qp->qp_base.context->device->name, ibv_qp->wr_id,
2248+
qp->sge_info.valid_num, ibv_qp->qp_base.qp_num,
2249+
UINT32_MAX, ibv_qp->wr_flags, qp->sge_info.total_len,
2250+
opcode, qp->sl, UINT8_MAX);
21292251
}
21302252

21312253
static void wr_send_rc(struct ibv_qp_ex *ibv_qp)
@@ -2300,6 +2422,14 @@ static void set_inline_data_list_rc(struct hns_roce_qp *qp,
23002422

23012423
hr_reg_write(wqe, RCWQE_SGE_NUM, qp->sge_info.valid_num);
23022424
}
2425+
2426+
rdma_tracepoint(rdma_core_hns, post_send,
2427+
qp->verbs_qp.qp.context->device->name,
2428+
qp->verbs_qp.qp_ex.wr_id,
2429+
hr_reg_read(wqe, RCWQE_SGE_NUM),
2430+
qp->verbs_qp.qp.qp_num, UINT32_MAX,
2431+
qp->verbs_qp.qp_ex.wr_flags, msg_len,
2432+
hr_reg_read(wqe, RCWQE_OPCODE), qp->sl, UINT8_MAX);
23032433
}
23042434

23052435
static void wr_set_inline_data_rc(struct ibv_qp_ex *ibv_qp, void *addr,
@@ -2432,6 +2562,13 @@ static void wr_set_sge_ud(struct ibv_qp_ex *ibv_qp, uint32_t lkey,
24322562
dseg->len = htole32(length);
24332563

24342564
qp->sge_info.start_idx++;
2565+
2566+
rdma_tracepoint(rdma_core_hns, post_send,
2567+
ibv_qp->qp_base.context->device->name, ibv_qp->wr_id,
2568+
1, ibv_qp->qp_base.qp_num,
2569+
hr_reg_read(wqe, UDWQE_DQPN), ibv_qp->wr_flags,
2570+
length, hr_reg_read(wqe, UDWQE_OPCODE),
2571+
qp->sl, hr_reg_read(wqe, UDWQE_TCLASS));
24352572
}
24362573

24372574
static void wr_set_sge_list_ud(struct ibv_qp_ex *ibv_qp, size_t num_sge,
@@ -2470,6 +2607,13 @@ static void wr_set_sge_list_ud(struct ibv_qp_ex *ibv_qp, size_t num_sge,
24702607
hr_reg_write(wqe, UDWQE_SGE_NUM, cnt);
24712608

24722609
qp->sge_info.start_idx += cnt;
2610+
2611+
rdma_tracepoint(rdma_core_hns, post_send,
2612+
ibv_qp->qp_base.context->device->name, ibv_qp->wr_id,
2613+
cnt, ibv_qp->qp_base.qp_num,
2614+
hr_reg_read(wqe, UDWQE_DQPN), ibv_qp->wr_flags,
2615+
msg_len, hr_reg_read(wqe, UDWQE_OPCODE),
2616+
qp->sl, hr_reg_read(wqe, UDWQE_TCLASS));
24732617
}
24742618

24752619
static void set_inline_data_list_ud(struct hns_roce_qp *qp,
@@ -2518,6 +2662,15 @@ static void set_inline_data_list_ud(struct hns_roce_qp *qp,
25182662

25192663
hr_reg_write(wqe, UDWQE_SGE_NUM, qp->sge_info.valid_num);
25202664
}
2665+
2666+
rdma_tracepoint(rdma_core_hns, post_send,
2667+
qp->verbs_qp.qp.context->device->name,
2668+
qp->verbs_qp.qp_ex.wr_id,
2669+
hr_reg_read(wqe, UDWQE_SGE_NUM),
2670+
qp->verbs_qp.qp.qp_num, hr_reg_read(wqe, UDWQE_DQPN),
2671+
qp->verbs_qp.qp_ex.wr_flags, msg_len,
2672+
hr_reg_read(wqe, UDWQE_OPCODE), qp->sl,
2673+
hr_reg_read(wqe, UDWQE_TCLASS));
25212674
}
25222675

25232676
static void wr_set_inline_data_ud(struct ibv_qp_ex *ibv_qp, void *addr,

providers/hns/hns_roce_u_trace.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
2+
/*
3+
* Copyright (c) 2025 Hisilicon Limited.
4+
*/
5+
6+
#define LTTNG_UST_TRACEPOINT_CREATE_PROBES
7+
#define LTTNG_UST_TRACEPOINT_DEFINE
8+
9+
#include "hns_roce_u_trace.h"

0 commit comments

Comments
 (0)