xref: /openbmc/linux/drivers/nvme/host/trace.h (revision b80a55e2)
1 /*
2  * NVM Express device driver tracepoints
3  * Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  */
14 
15 #undef TRACE_SYSTEM
16 #define TRACE_SYSTEM nvme
17 
18 #if !defined(_TRACE_NVME_H) || defined(TRACE_HEADER_MULTI_READ)
19 #define _TRACE_NVME_H
20 
21 #include <linux/nvme.h>
22 #include <linux/tracepoint.h>
23 #include <linux/trace_seq.h>
24 
25 #include "nvme.h"
26 
27 #define nvme_admin_opcode_name(opcode)	{ opcode, #opcode }
28 #define show_admin_opcode_name(val)					\
29 	__print_symbolic(val,						\
30 		nvme_admin_opcode_name(nvme_admin_delete_sq),		\
31 		nvme_admin_opcode_name(nvme_admin_create_sq),		\
32 		nvme_admin_opcode_name(nvme_admin_get_log_page),	\
33 		nvme_admin_opcode_name(nvme_admin_delete_cq),		\
34 		nvme_admin_opcode_name(nvme_admin_create_cq),		\
35 		nvme_admin_opcode_name(nvme_admin_identify),		\
36 		nvme_admin_opcode_name(nvme_admin_abort_cmd),		\
37 		nvme_admin_opcode_name(nvme_admin_set_features),	\
38 		nvme_admin_opcode_name(nvme_admin_get_features),	\
39 		nvme_admin_opcode_name(nvme_admin_async_event),		\
40 		nvme_admin_opcode_name(nvme_admin_ns_mgmt),		\
41 		nvme_admin_opcode_name(nvme_admin_activate_fw),		\
42 		nvme_admin_opcode_name(nvme_admin_download_fw),		\
43 		nvme_admin_opcode_name(nvme_admin_ns_attach),		\
44 		nvme_admin_opcode_name(nvme_admin_keep_alive),		\
45 		nvme_admin_opcode_name(nvme_admin_directive_send),	\
46 		nvme_admin_opcode_name(nvme_admin_directive_recv),	\
47 		nvme_admin_opcode_name(nvme_admin_dbbuf),		\
48 		nvme_admin_opcode_name(nvme_admin_format_nvm),		\
49 		nvme_admin_opcode_name(nvme_admin_security_send),	\
50 		nvme_admin_opcode_name(nvme_admin_security_recv),	\
51 		nvme_admin_opcode_name(nvme_admin_sanitize_nvm))
52 
53 #define nvme_opcode_name(opcode)	{ opcode, #opcode }
54 #define show_nvm_opcode_name(val)				\
55 	__print_symbolic(val,					\
56 		nvme_opcode_name(nvme_cmd_flush),		\
57 		nvme_opcode_name(nvme_cmd_write),		\
58 		nvme_opcode_name(nvme_cmd_read),		\
59 		nvme_opcode_name(nvme_cmd_write_uncor),		\
60 		nvme_opcode_name(nvme_cmd_compare),		\
61 		nvme_opcode_name(nvme_cmd_write_zeroes),	\
62 		nvme_opcode_name(nvme_cmd_dsm),			\
63 		nvme_opcode_name(nvme_cmd_resv_register),	\
64 		nvme_opcode_name(nvme_cmd_resv_report),		\
65 		nvme_opcode_name(nvme_cmd_resv_acquire),	\
66 		nvme_opcode_name(nvme_cmd_resv_release))
67 
68 #define show_opcode_name(qid, opcode)					\
69 	(qid ? show_nvm_opcode_name(opcode) : show_admin_opcode_name(opcode))
70 
71 const char *nvme_trace_parse_admin_cmd(struct trace_seq *p, u8 opcode,
72 		u8 *cdw10);
73 const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p, u8 opcode,
74 		u8 *cdw10);
75 
76 #define parse_nvme_cmd(qid, opcode, cdw10) 			\
77 	(qid ?							\
78 	 nvme_trace_parse_nvm_cmd(p, opcode, cdw10) : 		\
79 	 nvme_trace_parse_admin_cmd(p, opcode, cdw10))
80 
81 TRACE_EVENT(nvme_setup_cmd,
82 	    TP_PROTO(struct request *req, struct nvme_command *cmd),
83 	    TP_ARGS(req, cmd),
84 	    TP_STRUCT__entry(
85 		__field(int, ctrl_id)
86 		__field(int, qid)
87 		__field(u8, opcode)
88 		__field(u8, flags)
89 		__field(u16, cid)
90 		__field(u32, nsid)
91 		__field(u64, metadata)
92 		__array(u8, cdw10, 24)
93 	    ),
94 	    TP_fast_assign(
95 		__entry->ctrl_id = nvme_req(req)->ctrl->instance;
96 		__entry->qid = nvme_req_qid(req);
97 		__entry->opcode = cmd->common.opcode;
98 		__entry->flags = cmd->common.flags;
99 		__entry->cid = cmd->common.command_id;
100 		__entry->nsid = le32_to_cpu(cmd->common.nsid);
101 		__entry->metadata = le64_to_cpu(cmd->common.metadata);
102 		memcpy(__entry->cdw10, cmd->common.cdw10,
103 		       sizeof(__entry->cdw10));
104 	    ),
105 	    TP_printk("nvme%d: qid=%d, cmdid=%u, nsid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
106 		      __entry->ctrl_id, __entry->qid, __entry->cid,
107 		      __entry->nsid, __entry->flags, __entry->metadata,
108 		      show_opcode_name(__entry->qid, __entry->opcode),
109 		      parse_nvme_cmd(__entry->qid, __entry->opcode, __entry->cdw10))
110 );
111 
112 TRACE_EVENT(nvme_complete_rq,
113 	    TP_PROTO(struct request *req),
114 	    TP_ARGS(req),
115 	    TP_STRUCT__entry(
116 		__field(int, ctrl_id)
117 		__field(int, qid)
118 		__field(int, cid)
119 		__field(u64, result)
120 		__field(u8, retries)
121 		__field(u8, flags)
122 		__field(u16, status)
123 	    ),
124 	    TP_fast_assign(
125 		__entry->ctrl_id = nvme_req(req)->ctrl->instance;
126 		__entry->qid = nvme_req_qid(req);
127 		__entry->cid = req->tag;
128 		__entry->result = le64_to_cpu(nvme_req(req)->result.u64);
129 		__entry->retries = nvme_req(req)->retries;
130 		__entry->flags = nvme_req(req)->flags;
131 		__entry->status = nvme_req(req)->status;
132 	    ),
133 	    TP_printk("nvme%d: qid=%d, cmdid=%u, res=%llu, retries=%u, flags=0x%x, status=%u",
134 		      __entry->ctrl_id,  __entry->qid, __entry->cid,
135 		      __entry->result, __entry->retries, __entry->flags,
136 		      __entry->status)
137 
138 );
139 
140 #endif /* _TRACE_NVME_H */
141 
142 #undef TRACE_INCLUDE_PATH
143 #define TRACE_INCLUDE_PATH .
144 #undef TRACE_INCLUDE_FILE
145 #define TRACE_INCLUDE_FILE trace
146 
147 /* This part must be outside protection */
148 #include <trace/define_trace.h>
149