Merge tag 'for-linus' of git://github.com/openrisc/linux
[sfrench/cifs-2.6.git] / drivers / nvme / host / trace.h
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 const char *nvme_trace_parse_admin_cmd(struct trace_seq *p, u8 opcode,
54                                        u8 *cdw10);
55 #define __parse_nvme_admin_cmd(opcode, cdw10) \
56         nvme_trace_parse_admin_cmd(p, opcode, cdw10)
57
58 #define nvme_opcode_name(opcode)        { opcode, #opcode }
59 #define show_opcode_name(val)                                   \
60         __print_symbolic(val,                                   \
61                 nvme_opcode_name(nvme_cmd_flush),               \
62                 nvme_opcode_name(nvme_cmd_write),               \
63                 nvme_opcode_name(nvme_cmd_read),                \
64                 nvme_opcode_name(nvme_cmd_write_uncor),         \
65                 nvme_opcode_name(nvme_cmd_compare),             \
66                 nvme_opcode_name(nvme_cmd_write_zeroes),        \
67                 nvme_opcode_name(nvme_cmd_dsm),                 \
68                 nvme_opcode_name(nvme_cmd_resv_register),       \
69                 nvme_opcode_name(nvme_cmd_resv_report),         \
70                 nvme_opcode_name(nvme_cmd_resv_acquire),        \
71                 nvme_opcode_name(nvme_cmd_resv_release))
72
73 const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p, u8 opcode,
74                                      u8 *cdw10);
75 #define __parse_nvme_cmd(opcode, cdw10) \
76         nvme_trace_parse_nvm_cmd(p, opcode, cdw10)
77
78 TRACE_EVENT(nvme_setup_admin_cmd,
79             TP_PROTO(struct nvme_command *cmd),
80             TP_ARGS(cmd),
81             TP_STRUCT__entry(
82                     __field(u8, opcode)
83                     __field(u8, flags)
84                     __field(u16, cid)
85                     __field(u64, metadata)
86                     __array(u8, cdw10, 24)
87             ),
88             TP_fast_assign(
89                     __entry->opcode = cmd->common.opcode;
90                     __entry->flags = cmd->common.flags;
91                     __entry->cid = cmd->common.command_id;
92                     __entry->metadata = le64_to_cpu(cmd->common.metadata);
93                     memcpy(__entry->cdw10, cmd->common.cdw10,
94                            sizeof(__entry->cdw10));
95             ),
96             TP_printk(" cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
97                       __entry->cid, __entry->flags, __entry->metadata,
98                       show_admin_opcode_name(__entry->opcode),
99                       __parse_nvme_admin_cmd(__entry->opcode, __entry->cdw10))
100 );
101
102
103 TRACE_EVENT(nvme_setup_nvm_cmd,
104             TP_PROTO(int qid, struct nvme_command *cmd),
105             TP_ARGS(qid, cmd),
106             TP_STRUCT__entry(
107                     __field(int, qid)
108                     __field(u8, opcode)
109                     __field(u8, flags)
110                     __field(u16, cid)
111                     __field(u32, nsid)
112                     __field(u64, metadata)
113                     __array(u8, cdw10, 24)
114             ),
115             TP_fast_assign(
116                     __entry->qid = qid;
117                     __entry->opcode = cmd->common.opcode;
118                     __entry->flags = cmd->common.flags;
119                     __entry->cid = cmd->common.command_id;
120                     __entry->nsid = le32_to_cpu(cmd->common.nsid);
121                     __entry->metadata = le64_to_cpu(cmd->common.metadata);
122                     memcpy(__entry->cdw10, cmd->common.cdw10,
123                            sizeof(__entry->cdw10));
124             ),
125             TP_printk("qid=%d, nsid=%u, cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
126                       __entry->qid, __entry->nsid, __entry->cid,
127                       __entry->flags, __entry->metadata,
128                       show_opcode_name(__entry->opcode),
129                       __parse_nvme_cmd(__entry->opcode, __entry->cdw10))
130 );
131
132 TRACE_EVENT(nvme_complete_rq,
133             TP_PROTO(struct request *req),
134             TP_ARGS(req),
135             TP_STRUCT__entry(
136                     __field(int, qid)
137                     __field(int, cid)
138                     __field(u64, result)
139                     __field(u8, retries)
140                     __field(u8, flags)
141                     __field(u16, status)
142             ),
143             TP_fast_assign(
144                     __entry->qid = req->q->id;
145                     __entry->cid = req->tag;
146                     __entry->result = le64_to_cpu(nvme_req(req)->result.u64);
147                     __entry->retries = nvme_req(req)->retries;
148                     __entry->flags = nvme_req(req)->flags;
149                     __entry->status = nvme_req(req)->status;
150             ),
151             TP_printk("cmdid=%u, qid=%d, res=%llu, retries=%u, flags=0x%x, status=%u",
152                       __entry->cid, __entry->qid, __entry->result,
153                       __entry->retries, __entry->flags, __entry->status)
154
155 );
156
157 #endif /* _TRACE_NVME_H */
158
159 #undef TRACE_INCLUDE_PATH
160 #define TRACE_INCLUDE_PATH .
161 #undef TRACE_INCLUDE_FILE
162 #define TRACE_INCLUDE_FILE trace
163
164 /* This part must be outside protection */
165 #include <trace/define_trace.h>