Commit 6c98c867 authored by Junxian Huang's avatar Junxian Huang Committed by Leon Romanovsky
Browse files

RDMA/hns: Add trace for WQE dumping



Add trace for WQE dumping, including SQ, RQ and SRQ.

Output example:
$ cat /sys/kernel/debug/tracing/trace
  tracer: nop

  entries-in-buffer/entries-written: 2/2   #P:128

                                 _-----=> irqs-off/BH-disabled
                               / _----=> need-resched
                               | / _---=> hardirq/softirq
			       || / _--=> preempt-depth
                               ||| / _-=> migrate-disable
                               |||| /     delay
            TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
               | |         |   |||||     |         |
  roce_test_main-22730   [074] d..1. 16133.898282: hns_sq_wqe: SQ 0xc wqe
(0x0/0xffff0820a6076060): {0x180,0x639c,0x0,0x1000000,0x0,0x0,0x0,0x0,
0x639c,0x300,0xf7e38000,0x0,0x0,0x0,0x0,0x0}

Signed-off-by: default avatarJunxian Huang <huangjunxian6@hisilicon.com>
Link: https://patch.msgid.link/20250421132750.1363348-3-huangjunxian6@hisilicon.com


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent 02007e3d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1030,6 +1030,7 @@ struct hns_roce_dev {
enum hns_roce_trace_type {
	TRACE_SQ,
	TRACE_RQ,
	TRACE_SRQ,
};

static inline const char *trace_type_to_str(enum hns_roce_trace_type type)
@@ -1039,6 +1040,8 @@ static inline const char *trace_type_to_str(enum hns_roce_trace_type type)
		return "SQ";
	case TRACE_RQ:
		return "RQ";
	case TRACE_SRQ:
		return "SRQ";
	default:
		return "UNKNOWN";
	}
+8 −0
Original line number Diff line number Diff line
@@ -741,6 +741,8 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp,
		else
			ret = set_ud_wqe(qp, wr, wqe, &sge_idx, owner_bit);

		trace_hns_sq_wqe(qp->qpn, wqe_idx, wqe, 1 << qp->sq.wqe_shift,
				 wr->wr_id, TRACE_SQ);
		if (unlikely(ret)) {
			*bad_wr = wr;
			goto out;
@@ -810,6 +812,9 @@ static void fill_rq_wqe(struct hns_roce_qp *hr_qp, const struct ib_recv_wr *wr,

	wqe = hns_roce_get_recv_wqe(hr_qp, wqe_idx);
	fill_recv_sge_to_wqe(wr, wqe, max_sge, hr_qp->rq.rsv_sge);

	trace_hns_rq_wqe(hr_qp->qpn, wqe_idx, wqe, 1 << hr_qp->rq.wqe_shift,
			 wr->wr_id, TRACE_RQ);
}

static int hns_roce_v2_post_recv(struct ib_qp *ibqp,
@@ -987,6 +992,9 @@ static int hns_roce_v2_post_srq_recv(struct ib_srq *ibsrq,
		fill_recv_sge_to_wqe(wr, wqe, max_sge, srq->rsv_sge);
		fill_wqe_idx(srq, wqe_idx);
		srq->wrid[wqe_idx] = wr->wr_id;

		trace_hns_srq_wqe(srq->srqn, wqe_idx, wqe, 1 << srq->wqe_shift,
				  wr->wr_id, TRACE_SRQ);
	}

	if (likely(nreq)) {
+44 −0
Original line number Diff line number Diff line
@@ -41,6 +41,50 @@ DEFINE_EVENT(flush_head_template, hns_rq_flush_cqe,
		      enum hns_roce_trace_type type),
	     TP_ARGS(qpn, pi, type));

#define MAX_SGE_PER_WQE 64
#define MAX_WQE_SIZE (MAX_SGE_PER_WQE * HNS_ROCE_SGE_SIZE)
DECLARE_EVENT_CLASS(wqe_template,
		    TP_PROTO(unsigned long qpn, u32 idx, void *wqe, u32 len,
			     u64 id, enum hns_roce_trace_type type),
		    TP_ARGS(qpn, idx, wqe, len, id, type),

		    TP_STRUCT__entry(__field(unsigned long, qpn)
				     __field(u32, idx)
				     __array(__le32, wqe,
					     MAX_WQE_SIZE / sizeof(__le32))
				     __field(u32, len)
				     __field(u64, id)
				     __field(enum hns_roce_trace_type, type)
				     ),

		    TP_fast_assign(__entry->qpn = qpn;
				   __entry->idx = idx;
				   __entry->id = id;
				   memcpy(__entry->wqe, wqe, len);
				   __entry->len = len / sizeof(__le32);
				   __entry->type = type;
				   ),

		    TP_printk("%s 0x%lx wqe(0x%x/0x%llx): %s",
			      trace_type_to_str(__entry->type),
			      __entry->qpn, __entry->idx, __entry->id,
			      __print_array(__entry->wqe, __entry->len,
					    sizeof(__le32)))
);

DEFINE_EVENT(wqe_template, hns_sq_wqe,
	     TP_PROTO(unsigned long qpn, u32 idx, void *wqe, u32 len, u64 id,
		      enum hns_roce_trace_type type),
	     TP_ARGS(qpn, idx, wqe, len, id, type));
DEFINE_EVENT(wqe_template, hns_rq_wqe,
	     TP_PROTO(unsigned long qpn, u32 idx, void *wqe, u32 len, u64 id,
		      enum hns_roce_trace_type type),
	     TP_ARGS(qpn, idx, wqe, len, id, type));
DEFINE_EVENT(wqe_template, hns_srq_wqe,
	     TP_PROTO(unsigned long qpn, u32 idx, void *wqe, u32 len, u64 id,
		      enum hns_roce_trace_type type),
	     TP_ARGS(qpn, idx, wqe, len, id, type));

#endif /* __HNS_ROCE_TRACE_H */

#undef TRACE_INCLUDE_FILE