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 http://www.opensolaris.org/os/licensing. 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 /* BEGIN CSTYLED */ 156 DECLARE_EVENT_CLASS(zfs_zil_process_itx_class, 157 TP_PROTO(zilog_t *zilog, itx_t *itx), 158 TP_ARGS(zilog, itx), 159 TP_STRUCT__entry( 160 ZILOG_TP_STRUCT_ENTRY 161 ITX_TP_STRUCT_ENTRY 162 ), 163 TP_fast_assign( 164 ZILOG_TP_FAST_ASSIGN 165 ITX_TP_FAST_ASSIGN 166 ), 167 TP_printk( 168 ZILOG_TP_PRINTK_FMT " " ITX_TP_PRINTK_FMT, 169 ZILOG_TP_PRINTK_ARGS, ITX_TP_PRINTK_ARGS) 170 ); 171 /* END CSTYLED */ 172 173 /* BEGIN CSTYLED */ 174 #define DEFINE_ZIL_PROCESS_ITX_EVENT(name) \ 175 DEFINE_EVENT(zfs_zil_process_itx_class, name, \ 176 TP_PROTO(zilog_t *zilog, itx_t *itx), \ 177 TP_ARGS(zilog, itx)) 178 DEFINE_ZIL_PROCESS_ITX_EVENT(zfs_zil__process__commit__itx); 179 DEFINE_ZIL_PROCESS_ITX_EVENT(zfs_zil__process__normal__itx); 180 /* END CSTYLED */ 181 182 /* 183 * Generic support for two argument tracepoints of the form: 184 * 185 * DTRACE_PROBE2(..., 186 * zilog_t *, ..., 187 * zil_commit_waiter_t *, ...); 188 */ 189 /* BEGIN CSTYLED */ 190 DECLARE_EVENT_CLASS(zfs_zil_commit_io_error_class, 191 TP_PROTO(zilog_t *zilog, zil_commit_waiter_t *zcw), 192 TP_ARGS(zilog, zcw), 193 TP_STRUCT__entry( 194 ZILOG_TP_STRUCT_ENTRY 195 ZCW_TP_STRUCT_ENTRY 196 ), 197 TP_fast_assign( 198 ZILOG_TP_FAST_ASSIGN 199 ZCW_TP_FAST_ASSIGN 200 ), 201 TP_printk( 202 ZILOG_TP_PRINTK_FMT " " ZCW_TP_PRINTK_FMT, 203 ZILOG_TP_PRINTK_ARGS, ZCW_TP_PRINTK_ARGS) 204 ); 205 206 /* BEGIN CSTYLED */ 207 #define DEFINE_ZIL_COMMIT_IO_ERROR_EVENT(name) \ 208 DEFINE_EVENT(zfs_zil_commit_io_error_class, name, \ 209 TP_PROTO(zilog_t *zilog, zil_commit_waiter_t *zcw), \ 210 TP_ARGS(zilog, zcw)) 211 DEFINE_ZIL_COMMIT_IO_ERROR_EVENT(zfs_zil__commit__io__error); 212 /* END CSTYLED */ 213 214 #endif /* _TRACE_ZIL_H */ 215 216 #undef TRACE_INCLUDE_PATH 217 #undef TRACE_INCLUDE_FILE 218 #define TRACE_INCLUDE_PATH sys 219 #define TRACE_INCLUDE_FILE trace_zil 220 #include <trace/define_trace.h> 221 222 #else 223 224 DEFINE_DTRACE_PROBE2(zil__process__commit__itx); 225 DEFINE_DTRACE_PROBE2(zil__process__normal__itx); 226 DEFINE_DTRACE_PROBE2(zil__commit__io__error); 227 228 #endif /* HAVE_DECLARE_EVENT_CLASS */ 229 #endif /* _KERNEL */ 230