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