xref: /openbmc/linux/drivers/nvme/host/trace.h (revision 604c01d5)
13d030e41SJohannes Thumshirn /*
23d030e41SJohannes Thumshirn  * NVM Express device driver tracepoints
33d030e41SJohannes Thumshirn  * Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
43d030e41SJohannes Thumshirn  *
53d030e41SJohannes Thumshirn  * This program is free software; you can redistribute it and/or modify it
63d030e41SJohannes Thumshirn  * under the terms and conditions of the GNU General Public License,
73d030e41SJohannes Thumshirn  * version 2, as published by the Free Software Foundation.
83d030e41SJohannes Thumshirn  *
93d030e41SJohannes Thumshirn  * This program is distributed in the hope it will be useful, but WITHOUT
103d030e41SJohannes Thumshirn  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
113d030e41SJohannes Thumshirn  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
123d030e41SJohannes Thumshirn  * more details.
133d030e41SJohannes Thumshirn  */
143d030e41SJohannes Thumshirn 
153d030e41SJohannes Thumshirn #undef TRACE_SYSTEM
163d030e41SJohannes Thumshirn #define TRACE_SYSTEM nvme
173d030e41SJohannes Thumshirn 
183d030e41SJohannes Thumshirn #if !defined(_TRACE_NVME_H) || defined(TRACE_HEADER_MULTI_READ)
193d030e41SJohannes Thumshirn #define _TRACE_NVME_H
203d030e41SJohannes Thumshirn 
213d030e41SJohannes Thumshirn #include <linux/nvme.h>
223d030e41SJohannes Thumshirn #include <linux/tracepoint.h>
233d030e41SJohannes Thumshirn #include <linux/trace_seq.h>
243d030e41SJohannes Thumshirn 
253d030e41SJohannes Thumshirn #include "nvme.h"
263d030e41SJohannes Thumshirn 
273d030e41SJohannes Thumshirn #define nvme_admin_opcode_name(opcode)	{ opcode, #opcode }
283d030e41SJohannes Thumshirn #define show_admin_opcode_name(val)					\
293d030e41SJohannes Thumshirn 	__print_symbolic(val,						\
303d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_delete_sq),		\
313d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_create_sq),		\
323d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_get_log_page),	\
333d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_delete_cq),		\
343d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_create_cq),		\
353d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_identify),		\
363d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_abort_cmd),		\
373d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_set_features),	\
383d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_get_features),	\
393d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_async_event),		\
403d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_ns_mgmt),		\
413d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_activate_fw),		\
423d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_download_fw),		\
433d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_ns_attach),		\
443d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_keep_alive),		\
453d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_directive_send),	\
463d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_directive_recv),	\
473d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_dbbuf),		\
483d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_format_nvm),		\
493d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_security_send),	\
503d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_security_recv),	\
513d030e41SJohannes Thumshirn 		nvme_admin_opcode_name(nvme_admin_sanitize_nvm))
523d030e41SJohannes Thumshirn 
533d030e41SJohannes Thumshirn #define nvme_opcode_name(opcode)	{ opcode, #opcode }
545d87eb94SKeith Busch #define show_nvm_opcode_name(val)				\
553d030e41SJohannes Thumshirn 	__print_symbolic(val,					\
563d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_flush),		\
573d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_write),		\
583d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_read),		\
593d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_write_uncor),		\
603d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_compare),		\
613d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_write_zeroes),	\
623d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_dsm),			\
633d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_resv_register),	\
643d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_resv_report),		\
653d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_resv_acquire),	\
663d030e41SJohannes Thumshirn 		nvme_opcode_name(nvme_cmd_resv_release))
673d030e41SJohannes Thumshirn 
685d87eb94SKeith Busch #define show_opcode_name(qid, opcode)					\
695d87eb94SKeith Busch 	(qid ? show_nvm_opcode_name(opcode) : show_admin_opcode_name(opcode))
705d87eb94SKeith Busch 
715d87eb94SKeith Busch const char *nvme_trace_parse_admin_cmd(struct trace_seq *p, u8 opcode,
725d87eb94SKeith Busch 		u8 *cdw10);
733d030e41SJohannes Thumshirn const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p, u8 opcode,
743d030e41SJohannes Thumshirn 		u8 *cdw10);
753d030e41SJohannes Thumshirn 
765d87eb94SKeith Busch #define parse_nvme_cmd(qid, opcode, cdw10) 			\
775d87eb94SKeith Busch 	(qid ?							\
785d87eb94SKeith Busch 	 nvme_trace_parse_nvm_cmd(p, opcode, cdw10) : 		\
795d87eb94SKeith Busch 	 nvme_trace_parse_admin_cmd(p, opcode, cdw10))
803d030e41SJohannes Thumshirn 
816268953eSKeith Busch const char *nvme_trace_disk_name(struct trace_seq *p, char *name);
826268953eSKeith Busch #define __print_disk_name(name)				\
836268953eSKeith Busch 	nvme_trace_disk_name(p, name)
846268953eSKeith Busch 
856268953eSKeith Busch #ifndef TRACE_HEADER_MULTI_READ
866268953eSKeith Busch static inline void __assign_disk_name(char *name, struct gendisk *disk)
876268953eSKeith Busch {
886268953eSKeith Busch 	if (disk)
896268953eSKeith Busch 		memcpy(name, disk->disk_name, DISK_NAME_LEN);
906268953eSKeith Busch 	else
916268953eSKeith Busch 		memset(name, 0, DISK_NAME_LEN);
926268953eSKeith Busch }
936268953eSKeith Busch #endif
946268953eSKeith Busch 
955d87eb94SKeith Busch TRACE_EVENT(nvme_setup_cmd,
965d87eb94SKeith Busch 	    TP_PROTO(struct request *req, struct nvme_command *cmd),
975d87eb94SKeith Busch 	    TP_ARGS(req, cmd),
983d030e41SJohannes Thumshirn 	    TP_STRUCT__entry(
996268953eSKeith Busch 		__array(char, disk, DISK_NAME_LEN)
100b80a55e2SKeith Busch 		__field(int, ctrl_id)
1013d030e41SJohannes Thumshirn 		__field(int, qid)
1023d030e41SJohannes Thumshirn 		__field(u8, opcode)
1033d030e41SJohannes Thumshirn 		__field(u8, flags)
1043d030e41SJohannes Thumshirn 		__field(u16, cid)
1053d030e41SJohannes Thumshirn 		__field(u32, nsid)
1063d030e41SJohannes Thumshirn 		__field(u64, metadata)
1073d030e41SJohannes Thumshirn 		__array(u8, cdw10, 24)
1083d030e41SJohannes Thumshirn 	    ),
1093d030e41SJohannes Thumshirn 	    TP_fast_assign(
110b80a55e2SKeith Busch 		__entry->ctrl_id = nvme_req(req)->ctrl->instance;
1115d87eb94SKeith Busch 		__entry->qid = nvme_req_qid(req);
1123d030e41SJohannes Thumshirn 		__entry->opcode = cmd->common.opcode;
1133d030e41SJohannes Thumshirn 		__entry->flags = cmd->common.flags;
1143d030e41SJohannes Thumshirn 		__entry->cid = cmd->common.command_id;
1153d030e41SJohannes Thumshirn 		__entry->nsid = le32_to_cpu(cmd->common.nsid);
1163d030e41SJohannes Thumshirn 		__entry->metadata = le64_to_cpu(cmd->common.metadata);
1176268953eSKeith Busch 		__assign_disk_name(__entry->disk, req->rq_disk);
118b7c8f366SChaitanya Kulkarni 		memcpy(__entry->cdw10, &cmd->common.cdw10,
119b7c8f366SChaitanya Kulkarni 			6 * sizeof(__entry->cdw10));
1203d030e41SJohannes Thumshirn 	    ),
1216268953eSKeith Busch 	    TP_printk("nvme%d: %sqid=%d, cmdid=%u, nsid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
1226268953eSKeith Busch 		      __entry->ctrl_id, __print_disk_name(__entry->disk),
1236268953eSKeith Busch 		      __entry->qid, __entry->cid, __entry->nsid,
1246268953eSKeith Busch 		      __entry->flags, __entry->metadata,
1255d87eb94SKeith Busch 		      show_opcode_name(__entry->qid, __entry->opcode),
1265d87eb94SKeith Busch 		      parse_nvme_cmd(__entry->qid, __entry->opcode, __entry->cdw10))
1273d030e41SJohannes Thumshirn );
1283d030e41SJohannes Thumshirn 
129ca5554a6SJohannes Thumshirn TRACE_EVENT(nvme_complete_rq,
130ca5554a6SJohannes Thumshirn 	    TP_PROTO(struct request *req),
131ca5554a6SJohannes Thumshirn 	    TP_ARGS(req),
132ca5554a6SJohannes Thumshirn 	    TP_STRUCT__entry(
1336268953eSKeith Busch 		__array(char, disk, DISK_NAME_LEN)
134b80a55e2SKeith Busch 		__field(int, ctrl_id)
135ca5554a6SJohannes Thumshirn 		__field(int, qid)
136ca5554a6SJohannes Thumshirn 		__field(int, cid)
137ca5554a6SJohannes Thumshirn 		__field(u64, result)
138ca5554a6SJohannes Thumshirn 		__field(u8, retries)
139ca5554a6SJohannes Thumshirn 		__field(u8, flags)
140ca5554a6SJohannes Thumshirn 		__field(u16, status)
141ca5554a6SJohannes Thumshirn 	    ),
142ca5554a6SJohannes Thumshirn 	    TP_fast_assign(
143b80a55e2SKeith Busch 		__entry->ctrl_id = nvme_req(req)->ctrl->instance;
1445d87eb94SKeith Busch 		__entry->qid = nvme_req_qid(req);
145ca5554a6SJohannes Thumshirn 		__entry->cid = req->tag;
146ca5554a6SJohannes Thumshirn 		__entry->result = le64_to_cpu(nvme_req(req)->result.u64);
147ca5554a6SJohannes Thumshirn 		__entry->retries = nvme_req(req)->retries;
148ca5554a6SJohannes Thumshirn 		__entry->flags = nvme_req(req)->flags;
149ca5554a6SJohannes Thumshirn 		__entry->status = nvme_req(req)->status;
1506268953eSKeith Busch 		__assign_disk_name(__entry->disk, req->rq_disk);
151ca5554a6SJohannes Thumshirn 	    ),
1526268953eSKeith Busch 	    TP_printk("nvme%d: %sqid=%d, cmdid=%u, res=%llu, retries=%u, flags=0x%x, status=%u",
1536268953eSKeith Busch 		      __entry->ctrl_id, __print_disk_name(__entry->disk),
1546268953eSKeith Busch 		      __entry->qid, __entry->cid, __entry->result,
1556268953eSKeith Busch 		      __entry->retries, __entry->flags, __entry->status)
156ca5554a6SJohannes Thumshirn 
157ca5554a6SJohannes Thumshirn );
158ca5554a6SJohannes Thumshirn 
15909bd1ff4SChaitanya Kulkarni #define aer_name(aer) { aer, #aer }
16009bd1ff4SChaitanya Kulkarni 
16109bd1ff4SChaitanya Kulkarni TRACE_EVENT(nvme_async_event,
16209bd1ff4SChaitanya Kulkarni 	TP_PROTO(struct nvme_ctrl *ctrl, u32 result),
16309bd1ff4SChaitanya Kulkarni 	TP_ARGS(ctrl, result),
16409bd1ff4SChaitanya Kulkarni 	TP_STRUCT__entry(
16509bd1ff4SChaitanya Kulkarni 		__field(int, ctrl_id)
16609bd1ff4SChaitanya Kulkarni 		__field(u32, result)
16709bd1ff4SChaitanya Kulkarni 	),
16809bd1ff4SChaitanya Kulkarni 	TP_fast_assign(
16909bd1ff4SChaitanya Kulkarni 		__entry->ctrl_id = ctrl->instance;
17009bd1ff4SChaitanya Kulkarni 		__entry->result = result;
17109bd1ff4SChaitanya Kulkarni 	),
17209bd1ff4SChaitanya Kulkarni 	TP_printk("nvme%d: NVME_AEN=%#08x [%s]",
17309bd1ff4SChaitanya Kulkarni 		__entry->ctrl_id, __entry->result,
17409bd1ff4SChaitanya Kulkarni 		__print_symbolic(__entry->result,
17509bd1ff4SChaitanya Kulkarni 		aer_name(NVME_AER_NOTICE_NS_CHANGED),
17609bd1ff4SChaitanya Kulkarni 		aer_name(NVME_AER_NOTICE_ANA),
17709bd1ff4SChaitanya Kulkarni 		aer_name(NVME_AER_NOTICE_FW_ACT_STARTING),
17809bd1ff4SChaitanya Kulkarni 		aer_name(NVME_AER_ERROR),
17909bd1ff4SChaitanya Kulkarni 		aer_name(NVME_AER_SMART),
18009bd1ff4SChaitanya Kulkarni 		aer_name(NVME_AER_CSS),
18109bd1ff4SChaitanya Kulkarni 		aer_name(NVME_AER_VS))
18209bd1ff4SChaitanya Kulkarni 	)
18309bd1ff4SChaitanya Kulkarni );
18409bd1ff4SChaitanya Kulkarni 
18509bd1ff4SChaitanya Kulkarni #undef aer_name
18609bd1ff4SChaitanya Kulkarni 
187604c01d5Syupeng TRACE_EVENT(nvme_sq,
188604c01d5Syupeng 	TP_PROTO(struct request *req, __le16 sq_head, int sq_tail),
189604c01d5Syupeng 	TP_ARGS(req, sq_head, sq_tail),
190604c01d5Syupeng 	TP_STRUCT__entry(
191604c01d5Syupeng 		__field(int, ctrl_id)
192604c01d5Syupeng 		__array(char, disk, DISK_NAME_LEN)
193604c01d5Syupeng 		__field(int, qid)
194604c01d5Syupeng 		__field(u16, sq_head)
195604c01d5Syupeng 		__field(u16, sq_tail)
196604c01d5Syupeng 	),
197604c01d5Syupeng 	TP_fast_assign(
198604c01d5Syupeng 		__entry->ctrl_id = nvme_req(req)->ctrl->instance;
199604c01d5Syupeng 		__assign_disk_name(__entry->disk, req->rq_disk);
200604c01d5Syupeng 		__entry->qid = nvme_req_qid(req);
201604c01d5Syupeng 		__entry->sq_head = le16_to_cpu(sq_head);
202604c01d5Syupeng 		__entry->sq_tail = sq_tail;
203604c01d5Syupeng 	),
204604c01d5Syupeng 	TP_printk("nvme%d: %sqid=%d, head=%u, tail=%u",
205604c01d5Syupeng 		__entry->ctrl_id, __print_disk_name(__entry->disk),
206604c01d5Syupeng 		__entry->qid, __entry->sq_head, __entry->sq_tail
207604c01d5Syupeng 	)
208604c01d5Syupeng );
209604c01d5Syupeng 
2103d030e41SJohannes Thumshirn #endif /* _TRACE_NVME_H */
2113d030e41SJohannes Thumshirn 
2123d030e41SJohannes Thumshirn #undef TRACE_INCLUDE_PATH
2133d030e41SJohannes Thumshirn #define TRACE_INCLUDE_PATH .
2143d030e41SJohannes Thumshirn #undef TRACE_INCLUDE_FILE
2153d030e41SJohannes Thumshirn #define TRACE_INCLUDE_FILE trace
2163d030e41SJohannes Thumshirn 
2173d030e41SJohannes Thumshirn /* This part must be outside protection */
2183d030e41SJohannes Thumshirn #include <trace/define_trace.h>
219