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 #include <sys/list.h> 23 24 #if defined(_KERNEL) 25 #if defined(HAVE_DECLARE_EVENT_CLASS) 26 27 #undef TRACE_SYSTEM 28 #define TRACE_SYSTEM zfs 29 30 #undef TRACE_SYSTEM_VAR 31 #define TRACE_SYSTEM_VAR zfs_arc 32 33 #if !defined(_TRACE_ARC_H) || defined(TRACE_HEADER_MULTI_READ) 34 #define _TRACE_ARC_H 35 36 #include <linux/tracepoint.h> 37 #include <sys/types.h> 38 #include <sys/trace_common.h> /* For ZIO macros */ 39 40 /* 41 * Generic support for one argument tracepoints of the form: 42 * 43 * DTRACE_PROBE1(..., 44 * arc_buf_hdr_t *, ...); 45 */ 46 /* BEGIN CSTYLED */ 47 DECLARE_EVENT_CLASS(zfs_arc_buf_hdr_class, 48 TP_PROTO(arc_buf_hdr_t *ab), 49 TP_ARGS(ab), 50 TP_STRUCT__entry( 51 __array(uint64_t, hdr_dva_word, 2) 52 __field(uint64_t, hdr_birth) 53 __field(uint32_t, hdr_flags) 54 __field(uint32_t, hdr_bufcnt) 55 __field(arc_buf_contents_t, hdr_type) 56 __field(uint16_t, hdr_psize) 57 __field(uint16_t, hdr_lsize) 58 __field(uint64_t, hdr_spa) 59 __field(arc_state_type_t, hdr_state_type) 60 __field(clock_t, hdr_access) 61 __field(uint32_t, hdr_mru_hits) 62 __field(uint32_t, hdr_mru_ghost_hits) 63 __field(uint32_t, hdr_mfu_hits) 64 __field(uint32_t, hdr_mfu_ghost_hits) 65 __field(uint32_t, hdr_l2_hits) 66 __field(int64_t, hdr_refcount) 67 ), 68 TP_fast_assign( 69 __entry->hdr_dva_word[0] = ab->b_dva.dva_word[0]; 70 __entry->hdr_dva_word[1] = ab->b_dva.dva_word[1]; 71 __entry->hdr_birth = ab->b_birth; 72 __entry->hdr_flags = ab->b_flags; 73 __entry->hdr_bufcnt = ab->b_l1hdr.b_bufcnt; 74 __entry->hdr_psize = ab->b_psize; 75 __entry->hdr_lsize = ab->b_lsize; 76 __entry->hdr_spa = ab->b_spa; 77 __entry->hdr_state_type = ab->b_l1hdr.b_state->arcs_state; 78 __entry->hdr_access = ab->b_l1hdr.b_arc_access; 79 __entry->hdr_mru_hits = ab->b_l1hdr.b_mru_hits; 80 __entry->hdr_mru_ghost_hits = ab->b_l1hdr.b_mru_ghost_hits; 81 __entry->hdr_mfu_hits = ab->b_l1hdr.b_mfu_hits; 82 __entry->hdr_mfu_ghost_hits = ab->b_l1hdr.b_mfu_ghost_hits; 83 __entry->hdr_l2_hits = ab->b_l2hdr.b_hits; 84 __entry->hdr_refcount = ab->b_l1hdr.b_refcnt.rc_count; 85 ), 86 TP_printk("hdr { dva 0x%llx:0x%llx birth %llu " 87 "flags 0x%x bufcnt %u type %u psize %u lsize %u spa %llu " 88 "state_type %u access %lu mru_hits %u mru_ghost_hits %u " 89 "mfu_hits %u mfu_ghost_hits %u l2_hits %u refcount %lli }", 90 __entry->hdr_dva_word[0], __entry->hdr_dva_word[1], 91 __entry->hdr_birth, __entry->hdr_flags, 92 __entry->hdr_bufcnt, __entry->hdr_type, __entry->hdr_psize, 93 __entry->hdr_lsize, __entry->hdr_spa, __entry->hdr_state_type, 94 __entry->hdr_access, __entry->hdr_mru_hits, 95 __entry->hdr_mru_ghost_hits, __entry->hdr_mfu_hits, 96 __entry->hdr_mfu_ghost_hits, __entry->hdr_l2_hits, 97 __entry->hdr_refcount) 98 ); 99 /* END CSTYLED */ 100 101 /* BEGIN CSTYLED */ 102 #define DEFINE_ARC_BUF_HDR_EVENT(name) \ 103 DEFINE_EVENT(zfs_arc_buf_hdr_class, name, \ 104 TP_PROTO(arc_buf_hdr_t *ab), \ 105 TP_ARGS(ab)) 106 /* END CSTYLED */ 107 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__hit); 108 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__evict); 109 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__delete); 110 DEFINE_ARC_BUF_HDR_EVENT(zfs_new_state__mru); 111 DEFINE_ARC_BUF_HDR_EVENT(zfs_new_state__mfu); 112 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__async__upgrade__sync); 113 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__demand__hit__predictive__prefetch); 114 DEFINE_ARC_BUF_HDR_EVENT(zfs_l2arc__hit); 115 DEFINE_ARC_BUF_HDR_EVENT(zfs_l2arc__miss); 116 117 /* 118 * Generic support for two argument tracepoints of the form: 119 * 120 * DTRACE_PROBE2(..., 121 * vdev_t *, ..., 122 * zio_t *, ...); 123 */ 124 /* BEGIN CSTYLED */ 125 DECLARE_EVENT_CLASS(zfs_l2arc_rw_class, 126 TP_PROTO(vdev_t *vd, zio_t *zio), 127 TP_ARGS(vd, zio), 128 TP_STRUCT__entry( 129 __field(uint64_t, vdev_id) 130 __field(uint64_t, vdev_guid) 131 __field(uint64_t, vdev_state) 132 ZIO_TP_STRUCT_ENTRY 133 ), 134 TP_fast_assign( 135 __entry->vdev_id = vd->vdev_id; 136 __entry->vdev_guid = vd->vdev_guid; 137 __entry->vdev_state = vd->vdev_state; 138 ZIO_TP_FAST_ASSIGN 139 ), 140 TP_printk("vdev { id %llu guid %llu state %llu } " 141 ZIO_TP_PRINTK_FMT, __entry->vdev_id, __entry->vdev_guid, 142 __entry->vdev_state, ZIO_TP_PRINTK_ARGS) 143 ); 144 /* END CSTYLED */ 145 146 /* BEGIN CSTYLED */ 147 #define DEFINE_L2ARC_RW_EVENT(name) \ 148 DEFINE_EVENT(zfs_l2arc_rw_class, name, \ 149 TP_PROTO(vdev_t *vd, zio_t *zio), \ 150 TP_ARGS(vd, zio)) 151 /* END CSTYLED */ 152 DEFINE_L2ARC_RW_EVENT(zfs_l2arc__read); 153 DEFINE_L2ARC_RW_EVENT(zfs_l2arc__write); 154 155 156 /* 157 * Generic support for two argument tracepoints of the form: 158 * 159 * DTRACE_PROBE2(..., 160 * zio_t *, ..., 161 * l2arc_write_callback_t *, ...); 162 */ 163 /* BEGIN CSTYLED */ 164 DECLARE_EVENT_CLASS(zfs_l2arc_iodone_class, 165 TP_PROTO(zio_t *zio, l2arc_write_callback_t *cb), 166 TP_ARGS(zio, cb), 167 TP_STRUCT__entry(ZIO_TP_STRUCT_ENTRY), 168 TP_fast_assign(ZIO_TP_FAST_ASSIGN), 169 TP_printk(ZIO_TP_PRINTK_FMT, ZIO_TP_PRINTK_ARGS) 170 ); 171 /* END CSTYLED */ 172 173 /* BEGIN CSTYLED */ 174 #define DEFINE_L2ARC_IODONE_EVENT(name) \ 175 DEFINE_EVENT(zfs_l2arc_iodone_class, name, \ 176 TP_PROTO(zio_t *zio, l2arc_write_callback_t *cb), \ 177 TP_ARGS(zio, cb)) 178 /* END CSTYLED */ 179 DEFINE_L2ARC_IODONE_EVENT(zfs_l2arc__iodone); 180 181 182 /* 183 * Generic support for four argument tracepoints of the form: 184 * 185 * DTRACE_PROBE4(..., 186 * arc_buf_hdr_t *, ..., 187 * const blkptr_t *, 188 * uint64_t, 189 * const zbookmark_phys_t *); 190 */ 191 /* BEGIN CSTYLED */ 192 DECLARE_EVENT_CLASS(zfs_arc_miss_class, 193 TP_PROTO(arc_buf_hdr_t *hdr, 194 const blkptr_t *bp, uint64_t size, const zbookmark_phys_t *zb), 195 TP_ARGS(hdr, bp, size, zb), 196 TP_STRUCT__entry( 197 __array(uint64_t, hdr_dva_word, 2) 198 __field(uint64_t, hdr_birth) 199 __field(uint32_t, hdr_flags) 200 __field(uint32_t, hdr_bufcnt) 201 __field(arc_buf_contents_t, hdr_type) 202 __field(uint16_t, hdr_psize) 203 __field(uint16_t, hdr_lsize) 204 __field(uint64_t, hdr_spa) 205 __field(arc_state_type_t, hdr_state_type) 206 __field(clock_t, hdr_access) 207 __field(uint32_t, hdr_mru_hits) 208 __field(uint32_t, hdr_mru_ghost_hits) 209 __field(uint32_t, hdr_mfu_hits) 210 __field(uint32_t, hdr_mfu_ghost_hits) 211 __field(uint32_t, hdr_l2_hits) 212 __field(int64_t, hdr_refcount) 213 214 __array(uint64_t, bp_dva0, 2) 215 __array(uint64_t, bp_dva1, 2) 216 __array(uint64_t, bp_dva2, 2) 217 __array(uint64_t, bp_cksum, 4) 218 219 __field(uint64_t, bp_lsize) 220 221 __field(uint64_t, zb_objset) 222 __field(uint64_t, zb_object) 223 __field(int64_t, zb_level) 224 __field(uint64_t, zb_blkid) 225 ), 226 TP_fast_assign( 227 __entry->hdr_dva_word[0] = hdr->b_dva.dva_word[0]; 228 __entry->hdr_dva_word[1] = hdr->b_dva.dva_word[1]; 229 __entry->hdr_birth = hdr->b_birth; 230 __entry->hdr_flags = hdr->b_flags; 231 __entry->hdr_bufcnt = hdr->b_l1hdr.b_bufcnt; 232 __entry->hdr_psize = hdr->b_psize; 233 __entry->hdr_lsize = hdr->b_lsize; 234 __entry->hdr_spa = hdr->b_spa; 235 __entry->hdr_state_type = hdr->b_l1hdr.b_state->arcs_state; 236 __entry->hdr_access = hdr->b_l1hdr.b_arc_access; 237 __entry->hdr_mru_hits = hdr->b_l1hdr.b_mru_hits; 238 __entry->hdr_mru_ghost_hits = hdr->b_l1hdr.b_mru_ghost_hits; 239 __entry->hdr_mfu_hits = hdr->b_l1hdr.b_mfu_hits; 240 __entry->hdr_mfu_ghost_hits = hdr->b_l1hdr.b_mfu_ghost_hits; 241 __entry->hdr_l2_hits = hdr->b_l2hdr.b_hits; 242 __entry->hdr_refcount = hdr->b_l1hdr.b_refcnt.rc_count; 243 244 __entry->bp_dva0[0] = bp->blk_dva[0].dva_word[0]; 245 __entry->bp_dva0[1] = bp->blk_dva[0].dva_word[1]; 246 __entry->bp_dva1[0] = bp->blk_dva[1].dva_word[0]; 247 __entry->bp_dva1[1] = bp->blk_dva[1].dva_word[1]; 248 __entry->bp_dva2[0] = bp->blk_dva[2].dva_word[0]; 249 __entry->bp_dva2[1] = bp->blk_dva[2].dva_word[1]; 250 __entry->bp_cksum[0] = bp->blk_cksum.zc_word[0]; 251 __entry->bp_cksum[1] = bp->blk_cksum.zc_word[1]; 252 __entry->bp_cksum[2] = bp->blk_cksum.zc_word[2]; 253 __entry->bp_cksum[3] = bp->blk_cksum.zc_word[3]; 254 255 __entry->bp_lsize = size; 256 257 __entry->zb_objset = zb->zb_objset; 258 __entry->zb_object = zb->zb_object; 259 __entry->zb_level = zb->zb_level; 260 __entry->zb_blkid = zb->zb_blkid; 261 ), 262 TP_printk("hdr { dva 0x%llx:0x%llx birth %llu " 263 "flags 0x%x bufcnt %u psize %u lsize %u spa %llu state_type %u " 264 "access %lu mru_hits %u mru_ghost_hits %u mfu_hits %u " 265 "mfu_ghost_hits %u l2_hits %u refcount %lli } " 266 "bp { dva0 0x%llx:0x%llx dva1 0x%llx:0x%llx dva2 " 267 "0x%llx:0x%llx cksum 0x%llx:0x%llx:0x%llx:0x%llx " 268 "lsize %llu } zb { objset %llu object %llu level %lli " 269 "blkid %llu }", 270 __entry->hdr_dva_word[0], __entry->hdr_dva_word[1], 271 __entry->hdr_birth, __entry->hdr_flags, 272 __entry->hdr_bufcnt, __entry->hdr_psize, __entry->hdr_lsize, 273 __entry->hdr_spa, __entry->hdr_state_type, __entry->hdr_access, 274 __entry->hdr_mru_hits, __entry->hdr_mru_ghost_hits, 275 __entry->hdr_mfu_hits, __entry->hdr_mfu_ghost_hits, 276 __entry->hdr_l2_hits, __entry->hdr_refcount, 277 __entry->bp_dva0[0], __entry->bp_dva0[1], 278 __entry->bp_dva1[0], __entry->bp_dva1[1], 279 __entry->bp_dva2[0], __entry->bp_dva2[1], 280 __entry->bp_cksum[0], __entry->bp_cksum[1], 281 __entry->bp_cksum[2], __entry->bp_cksum[3], 282 __entry->bp_lsize, __entry->zb_objset, __entry->zb_object, 283 __entry->zb_level, __entry->zb_blkid) 284 ); 285 /* END CSTYLED */ 286 287 /* BEGIN CSTYLED */ 288 #define DEFINE_ARC_MISS_EVENT(name) \ 289 DEFINE_EVENT(zfs_arc_miss_class, name, \ 290 TP_PROTO(arc_buf_hdr_t *hdr, \ 291 const blkptr_t *bp, uint64_t size, const zbookmark_phys_t *zb), \ 292 TP_ARGS(hdr, bp, size, zb)) 293 /* END CSTYLED */ 294 DEFINE_ARC_MISS_EVENT(zfs_arc__miss); 295 296 /* 297 * Generic support for four argument tracepoints of the form: 298 * 299 * DTRACE_PROBE4(..., 300 * l2arc_dev_t *, ..., 301 * list_t *, ..., 302 * uint64_t, ..., 303 * boolean_t, ...); 304 */ 305 /* BEGIN CSTYLED */ 306 DECLARE_EVENT_CLASS(zfs_l2arc_evict_class, 307 TP_PROTO(l2arc_dev_t *dev, 308 list_t *buflist, uint64_t taddr, boolean_t all), 309 TP_ARGS(dev, buflist, taddr, all), 310 TP_STRUCT__entry( 311 __field(uint64_t, vdev_id) 312 __field(uint64_t, vdev_guid) 313 __field(uint64_t, vdev_state) 314 315 __field(uint64_t, l2ad_hand) 316 __field(uint64_t, l2ad_start) 317 __field(uint64_t, l2ad_end) 318 __field(boolean_t, l2ad_first) 319 __field(boolean_t, l2ad_writing) 320 321 __field(uint64_t, taddr) 322 __field(boolean_t, all) 323 ), 324 TP_fast_assign( 325 __entry->vdev_id = dev->l2ad_vdev->vdev_id; 326 __entry->vdev_guid = dev->l2ad_vdev->vdev_guid; 327 __entry->vdev_state = dev->l2ad_vdev->vdev_state; 328 329 __entry->l2ad_hand = dev->l2ad_hand; 330 __entry->l2ad_start = dev->l2ad_start; 331 __entry->l2ad_end = dev->l2ad_end; 332 __entry->l2ad_first = dev->l2ad_first; 333 __entry->l2ad_writing = dev->l2ad_writing; 334 335 __entry->taddr = taddr; 336 __entry->all = all; 337 ), 338 TP_printk("l2ad { vdev { id %llu guid %llu state %llu } " 339 "hand %llu start %llu end %llu " 340 "first %d writing %d } taddr %llu all %d", 341 __entry->vdev_id, __entry->vdev_guid, __entry->vdev_state, 342 __entry->l2ad_hand, __entry->l2ad_start, 343 __entry->l2ad_end, __entry->l2ad_first, __entry->l2ad_writing, 344 __entry->taddr, __entry->all) 345 ); 346 /* END CSTYLED */ 347 348 /* BEGIN CSTYLED */ 349 #define DEFINE_L2ARC_EVICT_EVENT(name) \ 350 DEFINE_EVENT(zfs_l2arc_evict_class, name, \ 351 TP_PROTO(l2arc_dev_t *dev, \ 352 list_t *buflist, uint64_t taddr, boolean_t all), \ 353 TP_ARGS(dev, buflist, taddr, all)) 354 /* END CSTYLED */ 355 DEFINE_L2ARC_EVICT_EVENT(zfs_l2arc__evict); 356 357 /* 358 * Generic support for three argument tracepoints of the form: 359 * 360 * DTRACE_PROBE3(..., 361 * uint64_t, ..., 362 * uint64_t, ..., 363 * uint64_t, ...); 364 */ 365 /* BEGIN CSTYLED */ 366 DECLARE_EVENT_CLASS(zfs_arc_wait_for_eviction_class, 367 TP_PROTO(uint64_t amount, uint64_t arc_evict_count, uint64_t aew_count), 368 TP_ARGS(amount, arc_evict_count, aew_count), 369 TP_STRUCT__entry( 370 __field(uint64_t, amount) 371 __field(uint64_t, arc_evict_count) 372 __field(uint64_t, aew_count) 373 ), 374 TP_fast_assign( 375 __entry->amount = amount; 376 __entry->arc_evict_count = arc_evict_count; 377 __entry->aew_count = aew_count; 378 ), 379 TP_printk("amount %llu arc_evict_count %llu aew_count %llu", 380 __entry->amount, __entry->arc_evict_count, __entry->aew_count) 381 ); 382 /* END CSTYLED */ 383 384 /* BEGIN CSTYLED */ 385 #define DEFINE_ARC_WAIT_FOR_EVICTION_EVENT(name) \ 386 DEFINE_EVENT(zfs_arc_wait_for_eviction_class, name, \ 387 TP_PROTO(uint64_t amount, uint64_t arc_evict_count, uint64_t aew_count), \ 388 TP_ARGS(amount, arc_evict_count, aew_count)) 389 /* END CSTYLED */ 390 DEFINE_ARC_WAIT_FOR_EVICTION_EVENT(zfs_arc__wait__for__eviction); 391 392 #endif /* _TRACE_ARC_H */ 393 394 #undef TRACE_INCLUDE_PATH 395 #undef TRACE_INCLUDE_FILE 396 #define TRACE_INCLUDE_PATH sys 397 #define TRACE_INCLUDE_FILE trace_arc 398 #include <trace/define_trace.h> 399 400 #else 401 402 DEFINE_DTRACE_PROBE1(arc__hit); 403 DEFINE_DTRACE_PROBE1(arc__evict); 404 DEFINE_DTRACE_PROBE1(arc__delete); 405 DEFINE_DTRACE_PROBE1(new_state__mru); 406 DEFINE_DTRACE_PROBE1(new_state__mfu); 407 DEFINE_DTRACE_PROBE1(arc__async__upgrade__sync); 408 DEFINE_DTRACE_PROBE1(arc__demand__hit__predictive__prefetch); 409 DEFINE_DTRACE_PROBE1(l2arc__hit); 410 DEFINE_DTRACE_PROBE1(l2arc__miss); 411 DEFINE_DTRACE_PROBE2(l2arc__read); 412 DEFINE_DTRACE_PROBE2(l2arc__write); 413 DEFINE_DTRACE_PROBE2(l2arc__iodone); 414 DEFINE_DTRACE_PROBE3(arc__wait__for__eviction); 415 DEFINE_DTRACE_PROBE4(arc__miss); 416 DEFINE_DTRACE_PROBE4(l2arc__evict); 417 418 #endif /* HAVE_DECLARE_EVENT_CLASS */ 419 #endif /* _KERNEL */ 420