1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or https://opensource.org/licenses/CDDL-1.0. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 #if defined(_KERNEL) 23 #if defined(HAVE_DECLARE_EVENT_CLASS) 24 25 #undef TRACE_SYSTEM 26 #define TRACE_SYSTEM zfs 27 28 #undef TRACE_SYSTEM_VAR 29 #define TRACE_SYSTEM_VAR zfs_zil 30 31 #if !defined(_TRACE_ZIL_H) || defined(TRACE_HEADER_MULTI_READ) 32 #define _TRACE_ZIL_H 33 34 #include <linux/tracepoint.h> 35 #include <sys/types.h> 36 37 #define ZILOG_TP_STRUCT_ENTRY \ 38 __field(uint64_t, zl_lr_seq) \ 39 __field(uint64_t, zl_commit_lr_seq) \ 40 __field(uint64_t, zl_destroy_txg) \ 41 __field(uint64_t, zl_replaying_seq) \ 42 __field(uint32_t, zl_suspend) \ 43 __field(uint8_t, zl_suspending) \ 44 __field(uint8_t, zl_keep_first) \ 45 __field(uint8_t, zl_replay) \ 46 __field(uint8_t, zl_stop_sync) \ 47 __field(uint8_t, zl_logbias) \ 48 __field(uint8_t, zl_sync) \ 49 __field(int, zl_parse_error) \ 50 __field(uint64_t, zl_parse_blk_seq) \ 51 __field(uint64_t, zl_parse_lr_seq) \ 52 __field(uint64_t, zl_parse_blk_count) \ 53 __field(uint64_t, zl_parse_lr_count) \ 54 __field(uint64_t, zl_cur_used) \ 55 __field(clock_t, zl_replay_time) \ 56 __field(uint64_t, zl_replay_blks) 57 58 #define ZILOG_TP_FAST_ASSIGN \ 59 __entry->zl_lr_seq = zilog->zl_lr_seq; \ 60 __entry->zl_commit_lr_seq = zilog->zl_commit_lr_seq; \ 61 __entry->zl_destroy_txg = zilog->zl_destroy_txg; \ 62 __entry->zl_replaying_seq = zilog->zl_replaying_seq; \ 63 __entry->zl_suspend = zilog->zl_suspend; \ 64 __entry->zl_suspending = zilog->zl_suspending; \ 65 __entry->zl_keep_first = zilog->zl_keep_first; \ 66 __entry->zl_replay = zilog->zl_replay; \ 67 __entry->zl_stop_sync = zilog->zl_stop_sync; \ 68 __entry->zl_logbias = zilog->zl_logbias; \ 69 __entry->zl_sync = zilog->zl_sync; \ 70 __entry->zl_parse_error = zilog->zl_parse_error; \ 71 __entry->zl_parse_blk_seq = zilog->zl_parse_blk_seq; \ 72 __entry->zl_parse_lr_seq = zilog->zl_parse_lr_seq; \ 73 __entry->zl_parse_blk_count = zilog->zl_parse_blk_count;\ 74 __entry->zl_parse_lr_count = zilog->zl_parse_lr_count; \ 75 __entry->zl_cur_used = zilog->zl_cur_used; \ 76 __entry->zl_replay_time = zilog->zl_replay_time; \ 77 __entry->zl_replay_blks = zilog->zl_replay_blks; 78 79 #define ZILOG_TP_PRINTK_FMT \ 80 "zl { lr_seq %llu commit_lr_seq %llu destroy_txg %llu " \ 81 "replaying_seq %llu suspend %u suspending %u keep_first %u " \ 82 "replay %u stop_sync %u logbias %u sync %u " \ 83 "parse_error %u parse_blk_seq %llu parse_lr_seq %llu " \ 84 "parse_blk_count %llu parse_lr_count %llu " \ 85 "cur_used %llu replay_time %lu replay_blks %llu }" 86 87 #define ZILOG_TP_PRINTK_ARGS \ 88 __entry->zl_lr_seq, __entry->zl_commit_lr_seq, \ 89 __entry->zl_destroy_txg, __entry->zl_replaying_seq, \ 90 __entry->zl_suspend, __entry->zl_suspending, \ 91 __entry->zl_keep_first, __entry->zl_replay, \ 92 __entry->zl_stop_sync, __entry->zl_logbias, __entry->zl_sync, \ 93 __entry->zl_parse_error, __entry->zl_parse_blk_seq, \ 94 __entry->zl_parse_lr_seq, __entry->zl_parse_blk_count, \ 95 __entry->zl_parse_lr_count, __entry->zl_cur_used, \ 96 __entry->zl_replay_time, __entry->zl_replay_blks 97 98 #define ITX_TP_STRUCT_ENTRY \ 99 __field(itx_wr_state_t, itx_wr_state) \ 100 __field(uint8_t, itx_sync) \ 101 __field(zil_callback_t, itx_callback) \ 102 __field(void *, itx_callback_data) \ 103 __field(uint64_t, itx_oid) \ 104 \ 105 __field(uint64_t, lrc_txtype) \ 106 __field(uint64_t, lrc_reclen) \ 107 __field(uint64_t, lrc_txg) \ 108 __field(uint64_t, lrc_seq) 109 110 #define ITX_TP_FAST_ASSIGN \ 111 __entry->itx_wr_state = itx->itx_wr_state; \ 112 __entry->itx_sync = itx->itx_sync; \ 113 __entry->itx_callback = itx->itx_callback; \ 114 __entry->itx_callback_data = itx->itx_callback_data; \ 115 __entry->itx_oid = itx->itx_oid; \ 116 \ 117 __entry->lrc_txtype = itx->itx_lr.lrc_txtype; \ 118 __entry->lrc_reclen = itx->itx_lr.lrc_reclen; \ 119 __entry->lrc_txg = itx->itx_lr.lrc_txg; \ 120 __entry->lrc_seq = itx->itx_lr.lrc_seq; 121 122 #define ITX_TP_PRINTK_FMT \ 123 "itx { wr_state %u sync %u callback %p callback_data %p oid %llu" \ 124 " { txtype %llu reclen %llu txg %llu seq %llu } }" 125 126 #define ITX_TP_PRINTK_ARGS \ 127 __entry->itx_wr_state, __entry->itx_sync, __entry->itx_callback,\ 128 __entry->itx_callback_data, __entry->itx_oid, \ 129 __entry->lrc_txtype, __entry->lrc_reclen, __entry->lrc_txg, \ 130 __entry->lrc_seq 131 132 #define ZCW_TP_STRUCT_ENTRY \ 133 __field(lwb_t *, zcw_lwb) \ 134 __field(boolean_t, zcw_done) \ 135 __field(int, zcw_zio_error) \ 136 137 #define ZCW_TP_FAST_ASSIGN \ 138 __entry->zcw_lwb = zcw->zcw_lwb; \ 139 __entry->zcw_done = zcw->zcw_done; \ 140 __entry->zcw_zio_error = zcw->zcw_zio_error; 141 142 #define ZCW_TP_PRINTK_FMT \ 143 "zcw { lwb %p done %u error %u }" 144 145 #define ZCW_TP_PRINTK_ARGS \ 146 __entry->zcw_lwb, __entry->zcw_done, __entry->zcw_zio_error 147 148 /* 149 * Generic support for two argument tracepoints of the form: 150 * 151 * DTRACE_PROBE2(..., 152 * zilog_t *, ..., 153 * itx_t *, ...); 154 */ 155 156 #if defined(__clang__) 157 #pragma clang diagnostic push 158 #pragma clang diagnostic ignored "-Wordered-compare-function-pointers" 159 #endif 160 /* BEGIN CSTYLED */ 161 DECLARE_EVENT_CLASS(zfs_zil_process_itx_class, 162 TP_PROTO(zilog_t *zilog, itx_t *itx), 163 TP_ARGS(zilog, itx), 164 TP_STRUCT__entry( 165 ZILOG_TP_STRUCT_ENTRY 166 ITX_TP_STRUCT_ENTRY 167 ), 168 TP_fast_assign( 169 ZILOG_TP_FAST_ASSIGN 170 ITX_TP_FAST_ASSIGN 171 ), 172 TP_printk( 173 ZILOG_TP_PRINTK_FMT " " ITX_TP_PRINTK_FMT, 174 ZILOG_TP_PRINTK_ARGS, ITX_TP_PRINTK_ARGS) 175 ); 176 /* END CSTYLED */ 177 #if defined(__clang__) 178 #pragma clang diagnostic pop 179 #endif 180 181 #define DEFINE_ZIL_PROCESS_ITX_EVENT(name) \ 182 DEFINE_EVENT(zfs_zil_process_itx_class, name, \ 183 TP_PROTO(zilog_t *zilog, itx_t *itx), \ 184 TP_ARGS(zilog, itx)) 185 DEFINE_ZIL_PROCESS_ITX_EVENT(zfs_zil__process__commit__itx); 186 DEFINE_ZIL_PROCESS_ITX_EVENT(zfs_zil__process__normal__itx); 187 188 /* 189 * Generic support for two argument tracepoints of the form: 190 * 191 * DTRACE_PROBE2(..., 192 * zilog_t *, ..., 193 * zil_commit_waiter_t *, ...); 194 */ 195 /* BEGIN CSTYLED */ 196 DECLARE_EVENT_CLASS(zfs_zil_commit_io_error_class, 197 TP_PROTO(zilog_t *zilog, zil_commit_waiter_t *zcw), 198 TP_ARGS(zilog, zcw), 199 TP_STRUCT__entry( 200 ZILOG_TP_STRUCT_ENTRY 201 ZCW_TP_STRUCT_ENTRY 202 ), 203 TP_fast_assign( 204 ZILOG_TP_FAST_ASSIGN 205 ZCW_TP_FAST_ASSIGN 206 ), 207 TP_printk( 208 ZILOG_TP_PRINTK_FMT " " ZCW_TP_PRINTK_FMT, 209 ZILOG_TP_PRINTK_ARGS, ZCW_TP_PRINTK_ARGS) 210 ); 211 212 #define DEFINE_ZIL_COMMIT_IO_ERROR_EVENT(name) \ 213 DEFINE_EVENT(zfs_zil_commit_io_error_class, name, \ 214 TP_PROTO(zilog_t *zilog, zil_commit_waiter_t *zcw), \ 215 TP_ARGS(zilog, zcw)) 216 DEFINE_ZIL_COMMIT_IO_ERROR_EVENT(zfs_zil__commit__io__error); 217 218 /* 219 * Generic support for three argument tracepoints of the form: 220 * 221 * DTRACE_PROBE3(..., 222 * zilog_t *, ..., 223 * uint64_t, ..., 224 * uint64_t, ...); 225 */ 226 /* BEGIN CSTYLED */ 227 DECLARE_EVENT_CLASS(zfs_zil_block_size_class, 228 TP_PROTO(zilog_t *zilog, uint64_t res, uint64_t s1), 229 TP_ARGS(zilog, res, s1), 230 TP_STRUCT__entry( 231 ZILOG_TP_STRUCT_ENTRY 232 __field(uint64_t, res) 233 __field(uint64_t, s1) 234 ), 235 TP_fast_assign( 236 ZILOG_TP_FAST_ASSIGN 237 __entry->res = res; 238 __entry->s1 = s1; 239 ), 240 TP_printk( 241 ZILOG_TP_PRINTK_FMT " res %llu s1 %llu", 242 ZILOG_TP_PRINTK_ARGS, __entry->res, __entry->s1) 243 ); 244 245 #define DEFINE_ZIL_BLOCK_SIZE_EVENT(name) \ 246 DEFINE_EVENT(zfs_zil_block_size_class, name, \ 247 TP_PROTO(zilog_t *zilog, uint64_t res, uint64_t s1), \ 248 TP_ARGS(zilog, res, s1)) 249 DEFINE_ZIL_BLOCK_SIZE_EVENT(zfs_zil__block__size); 250 251 #endif /* _TRACE_ZIL_H */ 252 253 #undef TRACE_INCLUDE_PATH 254 #undef TRACE_INCLUDE_FILE 255 #define TRACE_INCLUDE_PATH sys 256 #define TRACE_INCLUDE_FILE trace_zil 257 #include <trace/define_trace.h> 258 259 #else 260 261 DEFINE_DTRACE_PROBE2(zil__process__commit__itx); 262 DEFINE_DTRACE_PROBE2(zil__process__normal__itx); 263 DEFINE_DTRACE_PROBE2(zil__commit__io__error); 264 DEFINE_DTRACE_PROBE3(zil__block__size); 265 266 #endif /* HAVE_DECLARE_EVENT_CLASS */ 267 #endif /* _KERNEL */ 268