]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/hns: Add trace for CMDQ dumping
authorJunxian Huang <huangjunxian6@hisilicon.com>
Mon, 21 Apr 2025 13:27:50 +0000 (21:27 +0800)
committerLeon Romanovsky <leon@kernel.org>
Mon, 21 Apr 2025 18:20:27 +0000 (14:20 -0400)
Add trace for CMDQ dumping.

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
               | |         |   |||||     |         |
  kworker/u512:1-14003   [089] b..1. 50737.238304: hns_cmdq_req: 0000:bd:00.0 cmdq opcode:0x8500, flag:0x1, retval:0x0, data:{0x2,0x0,0x0,0xffff0000,0x32323232,0x0}

  kworker/u512:1-14003   [089] b..1. 50737.238316: hns_cmdq_resp: 0000:bd:00.0 cmdq opcode:0x8500, flag:0x2, retval:0x0, data:{0x2,0x0,0x0,0xffff0000,0x32323232,0x0}

Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
Link: https://patch.msgid.link/20250421132750.1363348-7-huangjunxian6@hisilicon.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
drivers/infiniband/hw/hns/hns_roce_trace.h

index 9cb9fe6a0a9880bab2c2b40c302808e57f217fff..fa8747656f25fe638dc3b74c36c7b808b8652710 100644 (file)
@@ -1321,6 +1321,8 @@ static int __hns_roce_cmq_send_one(struct hns_roce_dev *hr_dev,
        tail = csq->head;
 
        for (i = 0; i < num; i++) {
+               trace_hns_cmdq_req(hr_dev, &desc[i]);
+
                csq->desc[csq->head++] = desc[i];
                if (csq->head == csq->desc_num)
                        csq->head = 0;
@@ -1335,6 +1337,8 @@ static int __hns_roce_cmq_send_one(struct hns_roce_dev *hr_dev,
        if (hns_roce_cmq_csq_done(hr_dev)) {
                ret = 0;
                for (i = 0; i < num; i++) {
+                       trace_hns_cmdq_resp(hr_dev, &csq->desc[tail]);
+
                        /* check the result of hardware write back */
                        desc_ret = le16_to_cpu(csq->desc[tail++].retval);
                        if (tail == csq->desc_num)
index b0bc22b9cc28586e0fbed98786daf9f74e5bb56a..23cbdbaeffaa41562eaa47e9875c09cb062a69c3 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/tracepoint.h>
 #include <linux/string_choices.h>
 #include "hns_roce_device.h"
+#include "hns_roce_hw_v2.h"
 
 DECLARE_EVENT_CLASS(flush_head_template,
                    TP_PROTO(unsigned long qpn, u32 pi,
@@ -169,6 +170,40 @@ TRACE_EVENT(hns_buf_attr,
                      __entry->region2_size, __entry->region2_hopnum)
 );
 
+DECLARE_EVENT_CLASS(cmdq,
+                   TP_PROTO(struct hns_roce_dev *hr_dev,
+                            struct hns_roce_cmq_desc *desc),
+                   TP_ARGS(hr_dev, desc),
+
+                   TP_STRUCT__entry(__string(dev_name, dev_name(hr_dev->dev))
+                                    __field(u16, opcode)
+                                    __field(u16, flag)
+                                    __field(u16, retval)
+                                    __array(__le32, data, 6)
+                   ),
+
+                   TP_fast_assign(__assign_str(dev_name);
+                                  __entry->opcode = le16_to_cpu(desc->opcode);
+                                  __entry->flag = le16_to_cpu(desc->flag);
+                                  __entry->retval = le16_to_cpu(desc->retval);
+                                  memcpy(__entry->data, desc->data, 6 * sizeof(__le32));
+                   ),
+
+                   TP_printk("%s cmdq opcode:0x%x, flag:0x%x, retval:0x%x, data:%s\n",
+                             __get_str(dev_name), __entry->opcode,
+                             __entry->flag, __entry->retval,
+                             __print_array(__entry->data, 6, sizeof(__le32)))
+);
+
+DEFINE_EVENT(cmdq, hns_cmdq_req,
+            TP_PROTO(struct hns_roce_dev *hr_dev,
+                     struct hns_roce_cmq_desc *desc),
+            TP_ARGS(hr_dev, desc));
+DEFINE_EVENT(cmdq, hns_cmdq_resp,
+            TP_PROTO(struct hns_roce_dev *hr_dev,
+                     struct hns_roce_cmq_desc *desc),
+            TP_ARGS(hr_dev, desc));
+
 #endif /* __HNS_ROCE_TRACE_H */
 
 #undef TRACE_INCLUDE_FILE