hc
2024-05-10 61598093bbdd283a7edc367d900f223070ead8d2
kernel/drivers/nvme/host/trace.c
....@@ -1,19 +1,22 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * NVM Express device driver tracepoints
34 * 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.
135 */
146
157 #include <asm/unaligned.h>
168 #include "trace.h"
9
+
10
+static const char *nvme_trace_delete_sq(struct trace_seq *p, u8 *cdw10)
11
+{
12
+ const char *ret = trace_seq_buffer_ptr(p);
13
+ u16 sqid = get_unaligned_le16(cdw10);
14
+
15
+ trace_seq_printf(p, "sqid=%u", sqid);
16
+ trace_seq_putc(p, 0);
17
+
18
+ return ret;
19
+}
1720
1821 static const char *nvme_trace_create_sq(struct trace_seq *p, u8 *cdw10)
1922 {
....@@ -26,6 +29,17 @@
2629
2730 trace_seq_printf(p, "sqid=%u, qsize=%u, sq_flags=0x%x, cqid=%u",
2831 sqid, qsize, sq_flags, cqid);
32
+ trace_seq_putc(p, 0);
33
+
34
+ return ret;
35
+}
36
+
37
+static const char *nvme_trace_delete_cq(struct trace_seq *p, u8 *cdw10)
38
+{
39
+ const char *ret = trace_seq_buffer_ptr(p);
40
+ u16 cqid = get_unaligned_le16(cdw10);
41
+
42
+ trace_seq_printf(p, "cqid=%u", cqid);
2943 trace_seq_putc(p, 0);
3044
3145 return ret;
....@@ -58,7 +72,35 @@
5872 return ret;
5973 }
6074
75
+static const char *nvme_trace_admin_get_features(struct trace_seq *p,
76
+ u8 *cdw10)
77
+{
78
+ const char *ret = trace_seq_buffer_ptr(p);
79
+ u8 fid = cdw10[0];
80
+ u8 sel = cdw10[1] & 0x7;
81
+ u32 cdw11 = get_unaligned_le32(cdw10 + 4);
6182
83
+ trace_seq_printf(p, "fid=0x%x sel=0x%x cdw11=0x%x", fid, sel, cdw11);
84
+ trace_seq_putc(p, 0);
85
+
86
+ return ret;
87
+}
88
+
89
+static const char *nvme_trace_get_lba_status(struct trace_seq *p,
90
+ u8 *cdw10)
91
+{
92
+ const char *ret = trace_seq_buffer_ptr(p);
93
+ u64 slba = get_unaligned_le64(cdw10);
94
+ u32 mndw = get_unaligned_le32(cdw10 + 8);
95
+ u16 rl = get_unaligned_le16(cdw10 + 12);
96
+ u8 atype = cdw10[15];
97
+
98
+ trace_seq_printf(p, "slba=0x%llx, mndw=0x%x, rl=0x%x, atype=%u",
99
+ slba, mndw, rl, atype);
100
+ trace_seq_putc(p, 0);
101
+
102
+ return ret;
103
+}
62104
63105 static const char *nvme_trace_read_write(struct trace_seq *p, u8 *cdw10)
64106 {
....@@ -103,12 +145,20 @@
103145 u8 opcode, u8 *cdw10)
104146 {
105147 switch (opcode) {
148
+ case nvme_admin_delete_sq:
149
+ return nvme_trace_delete_sq(p, cdw10);
106150 case nvme_admin_create_sq:
107151 return nvme_trace_create_sq(p, cdw10);
152
+ case nvme_admin_delete_cq:
153
+ return nvme_trace_delete_cq(p, cdw10);
108154 case nvme_admin_create_cq:
109155 return nvme_trace_create_cq(p, cdw10);
110156 case nvme_admin_identify:
111157 return nvme_trace_admin_identify(p, cdw10);
158
+ case nvme_admin_get_features:
159
+ return nvme_trace_admin_get_features(p, cdw10);
160
+ case nvme_admin_get_lba_status:
161
+ return nvme_trace_get_lba_status(p, cdw10);
112162 default:
113163 return nvme_trace_common(p, cdw10);
114164 }
....@@ -129,6 +179,69 @@
129179 }
130180 }
131181
182
+static const char *nvme_trace_fabrics_property_set(struct trace_seq *p, u8 *spc)
183
+{
184
+ const char *ret = trace_seq_buffer_ptr(p);
185
+ u8 attrib = spc[0];
186
+ u32 ofst = get_unaligned_le32(spc + 4);
187
+ u64 value = get_unaligned_le64(spc + 8);
188
+
189
+ trace_seq_printf(p, "attrib=%u, ofst=0x%x, value=0x%llx",
190
+ attrib, ofst, value);
191
+ trace_seq_putc(p, 0);
192
+ return ret;
193
+}
194
+
195
+static const char *nvme_trace_fabrics_connect(struct trace_seq *p, u8 *spc)
196
+{
197
+ const char *ret = trace_seq_buffer_ptr(p);
198
+ u16 recfmt = get_unaligned_le16(spc);
199
+ u16 qid = get_unaligned_le16(spc + 2);
200
+ u16 sqsize = get_unaligned_le16(spc + 4);
201
+ u8 cattr = spc[6];
202
+ u32 kato = get_unaligned_le32(spc + 8);
203
+
204
+ trace_seq_printf(p, "recfmt=%u, qid=%u, sqsize=%u, cattr=%u, kato=%u",
205
+ recfmt, qid, sqsize, cattr, kato);
206
+ trace_seq_putc(p, 0);
207
+ return ret;
208
+}
209
+
210
+static const char *nvme_trace_fabrics_property_get(struct trace_seq *p, u8 *spc)
211
+{
212
+ const char *ret = trace_seq_buffer_ptr(p);
213
+ u8 attrib = spc[0];
214
+ u32 ofst = get_unaligned_le32(spc + 4);
215
+
216
+ trace_seq_printf(p, "attrib=%u, ofst=0x%x", attrib, ofst);
217
+ trace_seq_putc(p, 0);
218
+ return ret;
219
+}
220
+
221
+static const char *nvme_trace_fabrics_common(struct trace_seq *p, u8 *spc)
222
+{
223
+ const char *ret = trace_seq_buffer_ptr(p);
224
+
225
+ trace_seq_printf(p, "specific=%*ph", 24, spc);
226
+ trace_seq_putc(p, 0);
227
+ return ret;
228
+}
229
+
230
+const char *nvme_trace_parse_fabrics_cmd(struct trace_seq *p,
231
+ u8 fctype, u8 *spc)
232
+{
233
+ switch (fctype) {
234
+ case nvme_fabrics_type_property_set:
235
+ return nvme_trace_fabrics_property_set(p, spc);
236
+ case nvme_fabrics_type_connect:
237
+ return nvme_trace_fabrics_connect(p, spc);
238
+ case nvme_fabrics_type_property_get:
239
+ return nvme_trace_fabrics_property_get(p, spc);
240
+ default:
241
+ return nvme_trace_fabrics_common(p, spc);
242
+ }
243
+}
244
+
132245 const char *nvme_trace_disk_name(struct trace_seq *p, char *name)
133246 {
134247 const char *ret = trace_seq_buffer_ptr(p);
....@@ -139,3 +252,5 @@
139252
140253 return ret;
141254 }
255
+
256
+EXPORT_TRACEPOINT_SYMBOL_GPL(nvme_sq);