xref: /spdk/lib/ftl/ftl_trace.c (revision d4d015a572e1af7b2818e44218c1e661a61545ec)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2018 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk/trace.h"
7 #include "spdk_internal/trace_defs.h"
8 
9 #include "ftl_core.h"
10 #include "ftl_trace.h"
11 #include "ftl_io.h"
12 #include "ftl_band.h"
13 
14 #if defined(DEBUG)
15 
16 enum ftl_trace_source {
17 	FTL_TRACE_SOURCE_INTERNAL,
18 	FTL_TRACE_SOURCE_USER,
19 	FTL_TRACE_SOURCE_MAX,
20 };
21 
22 #define FTL_TPOINT_ID(id, src) SPDK_TPOINT_ID(TRACE_GROUP_FTL, (((id) << 1) | (!!(src))))
23 
24 #define FTL_TRACE_BAND_RELOC(src)		FTL_TPOINT_ID(0, src)
25 #define FTL_TRACE_BAND_WRITE(src)		FTL_TPOINT_ID(1, src)
26 #define FTL_TRACE_LIMITS(src)			FTL_TPOINT_ID(2, src)
27 #define FTL_TRACE_WBUF_POP(src)			FTL_TPOINT_ID(3, src)
28 
29 #define FTL_TRACE_READ_SCHEDULE(src)		FTL_TPOINT_ID(4, src)
30 #define FTL_TRACE_READ_SUBMISSION(src)		FTL_TPOINT_ID(5, src)
31 #define FTL_TRACE_READ_COMPLETION_INVALID(src)	FTL_TPOINT_ID(6, src)
32 #define FTL_TRACE_READ_COMPLETION_CACHE(src)	FTL_TPOINT_ID(7, src)
33 #define FTL_TRACE_READ_COMPLETION_DISK(src)	FTL_TPOINT_ID(8, src)
34 
35 #define FTL_TRACE_MD_READ_SCHEDULE(src)		FTL_TPOINT_ID(9,  src)
36 #define FTL_TRACE_MD_READ_SUBMISSION(src)	FTL_TPOINT_ID(10, src)
37 #define FTL_TRACE_MD_READ_COMPLETION(src)	FTL_TPOINT_ID(11, src)
38 
39 #define FTL_TRACE_WRITE_SCHEDULE(src)		FTL_TPOINT_ID(12, src)
40 #define FTL_TRACE_WRITE_WBUF_FILL(src)		FTL_TPOINT_ID(13, src)
41 #define FTL_TRACE_WRITE_SUBMISSION(src)		FTL_TPOINT_ID(14, src)
42 #define FTL_TRACE_WRITE_COMPLETION(src)		FTL_TPOINT_ID(15, src)
43 
44 #define FTL_TRACE_MD_WRITE_SCHEDULE(src)	FTL_TPOINT_ID(16, src)
45 #define FTL_TRACE_MD_WRITE_SUBMISSION(src)	FTL_TPOINT_ID(17, src)
46 #define FTL_TRACE_MD_WRITE_COMPLETION(src)	FTL_TPOINT_ID(18, src)
47 
48 #define FTL_TRACE_TRIM_SCHEDULE(src)		FTL_TPOINT_ID(19, src)
49 #define FTL_TRACE_TRIM_SUBMISSION(src)		FTL_TPOINT_ID(20, src)
50 #define FTL_TRACE_TRIM_COMPLETION(src)		FTL_TPOINT_ID(21, src)
51 
52 static void
53 ftl_trace(void)
54 {
55 	const char source[] = { 'i', 'u' };
56 	char descbuf[128];
57 	int i;
58 
59 	spdk_trace_register_owner_type(OWNER_TYPE_FTL, 'f');
60 
61 	for (i = 0; i < FTL_TRACE_SOURCE_MAX; ++i) {
62 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "band_reloc");
63 		spdk_trace_register_description(descbuf, FTL_TRACE_BAND_RELOC(i), OWNER_TYPE_FTL, OBJECT_NONE, 0, 0,
64 						"band: ");
65 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "band_write");
66 		spdk_trace_register_description(descbuf, FTL_TRACE_BAND_WRITE(i), OWNER_TYPE_FTL, OBJECT_NONE, 0, 0,
67 						"band: ");
68 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "limits");
69 		spdk_trace_register_description(descbuf, FTL_TRACE_LIMITS(i), OWNER_TYPE_FTL, OBJECT_NONE, 0, 0,
70 						"limits: ");
71 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "rwb_pop");
72 		spdk_trace_register_description(descbuf, FTL_TRACE_WBUF_POP(i), OWNER_TYPE_FTL, OBJECT_NONE, 0, 0,
73 						"lba: ");
74 
75 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "md_read_sched");
76 		spdk_trace_register_description(descbuf, FTL_TRACE_MD_READ_SCHEDULE(i), OWNER_TYPE_FTL,
77 						OBJECT_NONE, 0, 0, "addr: ");
78 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "md_read_submit");
79 		spdk_trace_register_description(descbuf, FTL_TRACE_MD_READ_SUBMISSION(i), OWNER_TYPE_FTL,
80 						OBJECT_NONE, 0, 0, "addr: ");
81 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "md_read_cmpl");
82 		spdk_trace_register_description(descbuf, FTL_TRACE_MD_READ_COMPLETION(i), OWNER_TYPE_FTL,
83 						OBJECT_NONE, 0, 0, "lba: ");
84 
85 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "md_write_sched");
86 		spdk_trace_register_description(descbuf, FTL_TRACE_MD_WRITE_SCHEDULE(i), OWNER_TYPE_FTL,
87 						OBJECT_NONE, 0, 0, "addr: ");
88 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "md_write_submit");
89 		spdk_trace_register_description(descbuf, FTL_TRACE_MD_WRITE_SUBMISSION(i), OWNER_TYPE_FTL,
90 						OBJECT_NONE, 0, 0, "addr: ");
91 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "md_write_cmpl");
92 		spdk_trace_register_description(descbuf, FTL_TRACE_MD_WRITE_COMPLETION(i), OWNER_TYPE_FTL,
93 						OBJECT_NONE, 0, 0, "lba: ");
94 
95 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "read_sched");
96 		spdk_trace_register_description(descbuf, FTL_TRACE_READ_SCHEDULE(i), OWNER_TYPE_FTL,
97 						OBJECT_NONE, 0, 0, "lba: ");
98 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "read_submit");
99 		spdk_trace_register_description(descbuf, FTL_TRACE_READ_SUBMISSION(i), OWNER_TYPE_FTL,
100 						OBJECT_NONE, 0, 0, "addr: ");
101 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "read_cmpl_invld");
102 		spdk_trace_register_description(descbuf, FTL_TRACE_READ_COMPLETION_INVALID(i), OWNER_TYPE_FTL,
103 						OBJECT_NONE, 0, 0, "lba: ");
104 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "read_cmpl_cache");
105 		spdk_trace_register_description(descbuf, FTL_TRACE_READ_COMPLETION_CACHE(i), OWNER_TYPE_FTL,
106 						OBJECT_NONE, 0, 0, "lba: ");
107 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "read_cmpl_ssd");
108 		spdk_trace_register_description(descbuf, FTL_TRACE_READ_COMPLETION_DISK(i), OWNER_TYPE_FTL,
109 						OBJECT_NONE, 0, 0, "lba: ");
110 
111 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "write_sched");
112 		spdk_trace_register_description(descbuf, FTL_TRACE_WRITE_SCHEDULE(i), OWNER_TYPE_FTL,
113 						OBJECT_NONE, 0, 0, "lba: ");
114 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "rwb_fill");
115 		spdk_trace_register_description(descbuf, FTL_TRACE_WRITE_WBUF_FILL(i), OWNER_TYPE_FTL,
116 						OBJECT_NONE, 0, 0, "lba: ");
117 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "write_submit");
118 		spdk_trace_register_description(descbuf, FTL_TRACE_WRITE_SUBMISSION(i), OWNER_TYPE_FTL,
119 						OBJECT_NONE, 0, 0, "addr: ");
120 		snprintf(descbuf, sizeof(descbuf), "%c %s", source[i], "write_cmpl");
121 		spdk_trace_register_description(descbuf, FTL_TRACE_WRITE_COMPLETION(i), OWNER_TYPE_FTL,
122 						OBJECT_NONE, 0, 0, "lba: ");
123 	}
124 }
125 SPDK_TRACE_REGISTER_FN(ftl_trace, "ftl", TRACE_GROUP_FTL)
126 
127 static uint64_t
128 ftl_trace_next_id(struct ftl_trace *trace)
129 {
130 	assert(trace->id != FTL_TRACE_INVALID_ID);
131 	return __atomic_fetch_add(&trace->id, 1, __ATOMIC_SEQ_CST);
132 }
133 
134 void
135 ftl_trace_reloc_band(struct spdk_ftl_dev *dev, const struct ftl_band *band)
136 {
137 	struct ftl_trace *trace = &dev->trace;
138 
139 	spdk_trace_record(FTL_TRACE_BAND_RELOC(FTL_TRACE_SOURCE_INTERNAL), ftl_trace_next_id(trace), 0,
140 			  band->p2l_map.num_valid, band->id);
141 }
142 
143 void
144 ftl_trace_write_band(struct spdk_ftl_dev *dev, const struct ftl_band *band)
145 {
146 	struct ftl_trace *trace = &dev->trace;
147 
148 	spdk_trace_record(FTL_TRACE_BAND_WRITE(FTL_TRACE_SOURCE_INTERNAL), ftl_trace_next_id(trace), 0, 0,
149 			  band->id);
150 }
151 
152 void
153 ftl_trace_lba_io_init(struct spdk_ftl_dev *dev, const struct ftl_io *io)
154 {
155 	uint16_t tpoint_id = 0, source;
156 
157 	assert(io->trace != FTL_TRACE_INVALID_ID);
158 	source = FTL_TRACE_SOURCE_USER;
159 
160 	switch (io->type) {
161 	case FTL_IO_READ:
162 		tpoint_id = FTL_TRACE_READ_SCHEDULE(source);
163 		break;
164 	case FTL_IO_WRITE:
165 		tpoint_id = FTL_TRACE_WRITE_SCHEDULE(source);
166 		break;
167 	case FTL_IO_TRIM:
168 		tpoint_id = FTL_TRACE_TRIM_SCHEDULE(source);
169 		break;
170 	default:
171 		assert(0);
172 	}
173 
174 	spdk_trace_record(tpoint_id, io->trace, io->num_blocks, 0, ftl_io_get_lba(io, 0));
175 }
176 
177 void
178 ftl_trace_completion(struct spdk_ftl_dev *dev, const struct ftl_io *io,
179 		     enum ftl_trace_completion completion)
180 {
181 	uint16_t tpoint_id = 0, source;
182 
183 	assert(io->trace != FTL_TRACE_INVALID_ID);
184 	source = FTL_TRACE_SOURCE_USER;
185 
186 	switch (io->type) {
187 	case FTL_IO_READ:
188 		switch (completion) {
189 		case FTL_TRACE_COMPLETION_INVALID:
190 			tpoint_id = FTL_TRACE_READ_COMPLETION_INVALID(source);
191 			break;
192 		case FTL_TRACE_COMPLETION_CACHE:
193 			tpoint_id = FTL_TRACE_READ_COMPLETION_CACHE(source);
194 			break;
195 		case FTL_TRACE_COMPLETION_DISK:
196 			tpoint_id = FTL_TRACE_READ_COMPLETION_DISK(source);
197 			break;
198 		}
199 		break;
200 	case FTL_IO_WRITE:
201 		tpoint_id = FTL_TRACE_WRITE_COMPLETION(source);
202 		break;
203 	case FTL_IO_TRIM:
204 		tpoint_id = FTL_TRACE_TRIM_COMPLETION(source);
205 		break;
206 	default:
207 		assert(0);
208 	}
209 
210 	spdk_trace_record(tpoint_id, io->trace, 0, 0, ftl_io_get_lba(io, io->pos - 1));
211 }
212 
213 void
214 ftl_trace_submission(struct spdk_ftl_dev *dev, const struct ftl_io *io, ftl_addr addr,
215 		     size_t addr_cnt)
216 {
217 	uint16_t tpoint_id = 0, source;
218 
219 	assert(io->trace != FTL_TRACE_INVALID_ID);
220 	source = FTL_TRACE_SOURCE_USER;
221 
222 	switch (io->type) {
223 	case FTL_IO_READ:
224 		tpoint_id = FTL_TRACE_READ_SUBMISSION(source);
225 		break;
226 	case FTL_IO_WRITE:
227 		tpoint_id = FTL_TRACE_WRITE_SUBMISSION(source);
228 		break;
229 	case FTL_IO_TRIM:
230 		tpoint_id = FTL_TRACE_TRIM_SUBMISSION(source);
231 		break;
232 	default:
233 		assert(0);
234 	}
235 
236 	spdk_trace_record(tpoint_id, io->trace, addr_cnt, 0, addr);
237 }
238 
239 void
240 ftl_trace_limits(struct spdk_ftl_dev *dev, int limit, size_t num_free)
241 {
242 	struct ftl_trace *trace = &dev->trace;
243 
244 	spdk_trace_record(FTL_TRACE_LIMITS(FTL_TRACE_SOURCE_INTERNAL), ftl_trace_next_id(trace), num_free,
245 			  limit, 0);
246 }
247 
248 uint64_t
249 ftl_trace_alloc_id(struct spdk_ftl_dev *dev)
250 {
251 	struct ftl_trace *trace = &dev->trace;
252 
253 	return ftl_trace_next_id(trace);
254 }
255 
256 #endif /* defined(DEBUG) */
257