]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/hns: Add trace for WQE dumping
authorJunxian Huang <huangjunxian6@hisilicon.com>
Mon, 21 Apr 2025 13:27:46 +0000 (21:27 +0800)
committerLeon Romanovsky <leon@kernel.org>
Mon, 21 Apr 2025 18:20:27 +0000 (14:20 -0400)
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: Junxian Huang <huangjunxian6@hisilicon.com>
Link: https://patch.msgid.link/20250421132750.1363348-3-huangjunxian6@hisilicon.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
drivers/infiniband/hw/hns/hns_roce_trace.h

index 080bd049b0f8d4f68e0109a4850ad50a58247cac..1dcc9cbb4678b11cba7af255163351875699e097 100644 (file)
@@ -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";
        }
index e1c27c9556fd205f979b5fcb52d9cb2db39e7fcd..ecc1e0b1df4e73ab7f7dfe7b9d176bd41533c245 100644 (file)
@@ -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)) {
index 3deace357fb7b60e817f0a65ccace55179a369ea..56e152387db48f1e211b563dceb7752a234113d8 100644 (file)
@@ -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