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.
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.
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]
25 #if defined(HAVE_DECLARE_EVENT_CLASS)
28 #define TRACE_SYSTEM zfs
30 #undef TRACE_SYSTEM_VAR
31 #define TRACE_SYSTEM_VAR zfs_arc
33 #if !defined(_TRACE_ARC_H) || defined(TRACE_HEADER_MULTI_READ)
36 #include <linux/tracepoint.h>
37 #include <sys/types.h>
38 #include <sys/trace_common.h> /* For ZIO macros */
41 * Generic support for one argument tracepoints of the form:
44 * arc_buf_hdr_t *, ...);
47 DECLARE_EVENT_CLASS(zfs_arc_buf_hdr_class
,
48 TP_PROTO(arc_buf_hdr_t
*ab
),
51 __array(uint64_t, hdr_dva_word
, 2)
52 __field(uint64_t, hdr_birth
)
53 __field(uint32_t, hdr_flags
)
54 __field(arc_buf_contents_t
, hdr_type
)
55 __field(uint16_t, hdr_psize
)
56 __field(uint16_t, hdr_lsize
)
57 __field(uint64_t, hdr_spa
)
58 __field(arc_state_type_t
, hdr_state_type
)
59 __field(clock_t, hdr_access
)
60 __field(uint32_t, hdr_mru_hits
)
61 __field(uint32_t, hdr_mru_ghost_hits
)
62 __field(uint32_t, hdr_mfu_hits
)
63 __field(uint32_t, hdr_mfu_ghost_hits
)
64 __field(uint32_t, hdr_l2_hits
)
65 __field(int64_t, hdr_refcount
)
68 __entry
->hdr_dva_word
[0] = ab
->b_dva
.dva_word
[0];
69 __entry
->hdr_dva_word
[1] = ab
->b_dva
.dva_word
[1];
70 __entry
->hdr_birth
= ab
->b_birth
;
71 __entry
->hdr_flags
= ab
->b_flags
;
72 __entry
->hdr_psize
= ab
->b_psize
;
73 __entry
->hdr_lsize
= ab
->b_lsize
;
74 __entry
->hdr_spa
= ab
->b_spa
;
75 __entry
->hdr_state_type
= ab
->b_l1hdr
.b_state
->arcs_state
;
76 __entry
->hdr_access
= ab
->b_l1hdr
.b_arc_access
;
77 __entry
->hdr_mru_hits
= ab
->b_l1hdr
.b_mru_hits
;
78 __entry
->hdr_mru_ghost_hits
= ab
->b_l1hdr
.b_mru_ghost_hits
;
79 __entry
->hdr_mfu_hits
= ab
->b_l1hdr
.b_mfu_hits
;
80 __entry
->hdr_mfu_ghost_hits
= ab
->b_l1hdr
.b_mfu_ghost_hits
;
81 __entry
->hdr_l2_hits
= ab
->b_l2hdr
.b_hits
;
82 __entry
->hdr_refcount
= ab
->b_l1hdr
.b_refcnt
.rc_count
;
84 TP_printk("hdr { dva 0x%llx:0x%llx birth %llu "
85 "flags 0x%x type %u psize %u lsize %u spa %llu "
86 "state_type %u access %lu mru_hits %u mru_ghost_hits %u "
87 "mfu_hits %u mfu_ghost_hits %u l2_hits %u refcount %lli }",
88 __entry
->hdr_dva_word
[0], __entry
->hdr_dva_word
[1],
89 __entry
->hdr_birth
, __entry
->hdr_flags
,
90 __entry
->hdr_type
, __entry
->hdr_psize
,
91 __entry
->hdr_lsize
, __entry
->hdr_spa
, __entry
->hdr_state_type
,
92 __entry
->hdr_access
, __entry
->hdr_mru_hits
,
93 __entry
->hdr_mru_ghost_hits
, __entry
->hdr_mfu_hits
,
94 __entry
->hdr_mfu_ghost_hits
, __entry
->hdr_l2_hits
,
95 __entry
->hdr_refcount
)
99 #define DEFINE_ARC_BUF_HDR_EVENT(name) \
100 DEFINE_EVENT(zfs_arc_buf_hdr_class, name, \
101 TP_PROTO(arc_buf_hdr_t *ab), \
103 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__hit
);
104 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__iohit
);
105 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__evict
);
106 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__delete
);
107 DEFINE_ARC_BUF_HDR_EVENT(zfs_new_state__mru
);
108 DEFINE_ARC_BUF_HDR_EVENT(zfs_new_state__mfu
);
109 DEFINE_ARC_BUF_HDR_EVENT(zfs_new_state__uncached
);
110 DEFINE_ARC_BUF_HDR_EVENT(zfs_arc__async__upgrade__sync
);
111 DEFINE_ARC_BUF_HDR_EVENT(zfs_l2arc__hit
);
112 DEFINE_ARC_BUF_HDR_EVENT(zfs_l2arc__miss
);
115 * Generic support for two argument tracepoints of the form:
122 DECLARE_EVENT_CLASS(zfs_l2arc_rw_class
,
123 TP_PROTO(vdev_t
*vd
, zio_t
*zio
),
126 __field(uint64_t, vdev_id
)
127 __field(uint64_t, vdev_guid
)
128 __field(uint64_t, vdev_state
)
132 __entry
->vdev_id
= vd
->vdev_id
;
133 __entry
->vdev_guid
= vd
->vdev_guid
;
134 __entry
->vdev_state
= vd
->vdev_state
;
137 TP_printk("vdev { id %llu guid %llu state %llu } "
138 ZIO_TP_PRINTK_FMT
, __entry
->vdev_id
, __entry
->vdev_guid
,
139 __entry
->vdev_state
, ZIO_TP_PRINTK_ARGS
)
143 #define DEFINE_L2ARC_RW_EVENT(name) \
144 DEFINE_EVENT(zfs_l2arc_rw_class, name, \
145 TP_PROTO(vdev_t *vd, zio_t *zio), \
147 DEFINE_L2ARC_RW_EVENT(zfs_l2arc__read
);
148 DEFINE_L2ARC_RW_EVENT(zfs_l2arc__write
);
152 * Generic support for two argument tracepoints of the form:
156 * l2arc_write_callback_t *, ...);
159 DECLARE_EVENT_CLASS(zfs_l2arc_iodone_class
,
160 TP_PROTO(zio_t
*zio
, l2arc_write_callback_t
*cb
),
162 TP_STRUCT__entry(ZIO_TP_STRUCT_ENTRY
),
163 TP_fast_assign(ZIO_TP_FAST_ASSIGN
),
164 TP_printk(ZIO_TP_PRINTK_FMT
, ZIO_TP_PRINTK_ARGS
)
168 #define DEFINE_L2ARC_IODONE_EVENT(name) \
169 DEFINE_EVENT(zfs_l2arc_iodone_class, name, \
170 TP_PROTO(zio_t *zio, l2arc_write_callback_t *cb), \
172 DEFINE_L2ARC_IODONE_EVENT(zfs_l2arc__iodone
);
176 * Generic support for four argument tracepoints of the form:
179 * arc_buf_hdr_t *, ...,
182 * const zbookmark_phys_t *);
185 DECLARE_EVENT_CLASS(zfs_arc_miss_class
,
186 TP_PROTO(arc_buf_hdr_t
*hdr
,
187 const blkptr_t
*bp
, uint64_t size
, const zbookmark_phys_t
*zb
),
188 TP_ARGS(hdr
, bp
, size
, zb
),
190 __array(uint64_t, hdr_dva_word
, 2)
191 __field(uint64_t, hdr_birth
)
192 __field(uint32_t, hdr_flags
)
193 __field(arc_buf_contents_t
, hdr_type
)
194 __field(uint16_t, hdr_psize
)
195 __field(uint16_t, hdr_lsize
)
196 __field(uint64_t, hdr_spa
)
197 __field(arc_state_type_t
, hdr_state_type
)
198 __field(clock_t, hdr_access
)
199 __field(uint32_t, hdr_mru_hits
)
200 __field(uint32_t, hdr_mru_ghost_hits
)
201 __field(uint32_t, hdr_mfu_hits
)
202 __field(uint32_t, hdr_mfu_ghost_hits
)
203 __field(uint32_t, hdr_l2_hits
)
204 __field(int64_t, hdr_refcount
)
206 __array(uint64_t, bp_dva0
, 2)
207 __array(uint64_t, bp_dva1
, 2)
208 __array(uint64_t, bp_dva2
, 2)
209 __array(uint64_t, bp_cksum
, 4)
211 __field(uint64_t, bp_lsize
)
213 __field(uint64_t, zb_objset
)
214 __field(uint64_t, zb_object
)
215 __field(int64_t, zb_level
)
216 __field(uint64_t, zb_blkid
)
219 __entry
->hdr_dva_word
[0] = hdr
->b_dva
.dva_word
[0];
220 __entry
->hdr_dva_word
[1] = hdr
->b_dva
.dva_word
[1];
221 __entry
->hdr_birth
= hdr
->b_birth
;
222 __entry
->hdr_flags
= hdr
->b_flags
;
223 __entry
->hdr_psize
= hdr
->b_psize
;
224 __entry
->hdr_lsize
= hdr
->b_lsize
;
225 __entry
->hdr_spa
= hdr
->b_spa
;
226 __entry
->hdr_state_type
= hdr
->b_l1hdr
.b_state
->arcs_state
;
227 __entry
->hdr_access
= hdr
->b_l1hdr
.b_arc_access
;
228 __entry
->hdr_mru_hits
= hdr
->b_l1hdr
.b_mru_hits
;
229 __entry
->hdr_mru_ghost_hits
= hdr
->b_l1hdr
.b_mru_ghost_hits
;
230 __entry
->hdr_mfu_hits
= hdr
->b_l1hdr
.b_mfu_hits
;
231 __entry
->hdr_mfu_ghost_hits
= hdr
->b_l1hdr
.b_mfu_ghost_hits
;
232 __entry
->hdr_l2_hits
= hdr
->b_l2hdr
.b_hits
;
233 __entry
->hdr_refcount
= hdr
->b_l1hdr
.b_refcnt
.rc_count
;
235 __entry
->bp_dva0
[0] = bp
->blk_dva
[0].dva_word
[0];
236 __entry
->bp_dva0
[1] = bp
->blk_dva
[0].dva_word
[1];
237 __entry
->bp_dva1
[0] = bp
->blk_dva
[1].dva_word
[0];
238 __entry
->bp_dva1
[1] = bp
->blk_dva
[1].dva_word
[1];
239 __entry
->bp_dva2
[0] = bp
->blk_dva
[2].dva_word
[0];
240 __entry
->bp_dva2
[1] = bp
->blk_dva
[2].dva_word
[1];
241 __entry
->bp_cksum
[0] = bp
->blk_cksum
.zc_word
[0];
242 __entry
->bp_cksum
[1] = bp
->blk_cksum
.zc_word
[1];
243 __entry
->bp_cksum
[2] = bp
->blk_cksum
.zc_word
[2];
244 __entry
->bp_cksum
[3] = bp
->blk_cksum
.zc_word
[3];
246 __entry
->bp_lsize
= size
;
248 __entry
->zb_objset
= zb
->zb_objset
;
249 __entry
->zb_object
= zb
->zb_object
;
250 __entry
->zb_level
= zb
->zb_level
;
251 __entry
->zb_blkid
= zb
->zb_blkid
;
253 TP_printk("hdr { dva 0x%llx:0x%llx birth %llu "
254 "flags 0x%x psize %u lsize %u spa %llu state_type %u "
255 "access %lu mru_hits %u mru_ghost_hits %u mfu_hits %u "
256 "mfu_ghost_hits %u l2_hits %u refcount %lli } "
257 "bp { dva0 0x%llx:0x%llx dva1 0x%llx:0x%llx dva2 "
258 "0x%llx:0x%llx cksum 0x%llx:0x%llx:0x%llx:0x%llx "
259 "lsize %llu } zb { objset %llu object %llu level %lli "
261 __entry
->hdr_dva_word
[0], __entry
->hdr_dva_word
[1],
262 __entry
->hdr_birth
, __entry
->hdr_flags
,
263 __entry
->hdr_psize
, __entry
->hdr_lsize
,
264 __entry
->hdr_spa
, __entry
->hdr_state_type
, __entry
->hdr_access
,
265 __entry
->hdr_mru_hits
, __entry
->hdr_mru_ghost_hits
,
266 __entry
->hdr_mfu_hits
, __entry
->hdr_mfu_ghost_hits
,
267 __entry
->hdr_l2_hits
, __entry
->hdr_refcount
,
268 __entry
->bp_dva0
[0], __entry
->bp_dva0
[1],
269 __entry
->bp_dva1
[0], __entry
->bp_dva1
[1],
270 __entry
->bp_dva2
[0], __entry
->bp_dva2
[1],
271 __entry
->bp_cksum
[0], __entry
->bp_cksum
[1],
272 __entry
->bp_cksum
[2], __entry
->bp_cksum
[3],
273 __entry
->bp_lsize
, __entry
->zb_objset
, __entry
->zb_object
,
274 __entry
->zb_level
, __entry
->zb_blkid
)
278 #define DEFINE_ARC_MISS_EVENT(name) \
279 DEFINE_EVENT(zfs_arc_miss_class, name, \
280 TP_PROTO(arc_buf_hdr_t *hdr, \
281 const blkptr_t *bp, uint64_t size, const zbookmark_phys_t *zb), \
282 TP_ARGS(hdr, bp, size, zb))
283 DEFINE_ARC_MISS_EVENT(zfs_arc__miss
);
286 * Generic support for four argument tracepoints of the form:
289 * l2arc_dev_t *, ...,
295 DECLARE_EVENT_CLASS(zfs_l2arc_evict_class
,
296 TP_PROTO(l2arc_dev_t
*dev
,
297 list_t
*buflist
, uint64_t taddr
, boolean_t all
),
298 TP_ARGS(dev
, buflist
, taddr
, all
),
300 __field(uint64_t, vdev_id
)
301 __field(uint64_t, vdev_guid
)
302 __field(uint64_t, vdev_state
)
304 __field(uint64_t, l2ad_hand
)
305 __field(uint64_t, l2ad_start
)
306 __field(uint64_t, l2ad_end
)
307 __field(boolean_t
, l2ad_first
)
308 __field(boolean_t
, l2ad_writing
)
310 __field(uint64_t, taddr
)
311 __field(boolean_t
, all
)
314 __entry
->vdev_id
= dev
->l2ad_vdev
->vdev_id
;
315 __entry
->vdev_guid
= dev
->l2ad_vdev
->vdev_guid
;
316 __entry
->vdev_state
= dev
->l2ad_vdev
->vdev_state
;
318 __entry
->l2ad_hand
= dev
->l2ad_hand
;
319 __entry
->l2ad_start
= dev
->l2ad_start
;
320 __entry
->l2ad_end
= dev
->l2ad_end
;
321 __entry
->l2ad_first
= dev
->l2ad_first
;
322 __entry
->l2ad_writing
= dev
->l2ad_writing
;
324 __entry
->taddr
= taddr
;
327 TP_printk("l2ad { vdev { id %llu guid %llu state %llu } "
328 "hand %llu start %llu end %llu "
329 "first %d writing %d } taddr %llu all %d",
330 __entry
->vdev_id
, __entry
->vdev_guid
, __entry
->vdev_state
,
331 __entry
->l2ad_hand
, __entry
->l2ad_start
,
332 __entry
->l2ad_end
, __entry
->l2ad_first
, __entry
->l2ad_writing
,
333 __entry
->taddr
, __entry
->all
)
337 #define DEFINE_L2ARC_EVICT_EVENT(name) \
338 DEFINE_EVENT(zfs_l2arc_evict_class, name, \
339 TP_PROTO(l2arc_dev_t *dev, list_t *buflist, uint64_t taddr, boolean_t all),\
340 TP_ARGS(dev, buflist, taddr, all))
341 DEFINE_L2ARC_EVICT_EVENT(zfs_l2arc__evict
);
344 * Generic support for three argument tracepoints of the form:
352 DECLARE_EVENT_CLASS(zfs_arc_wait_for_eviction_class
,
353 TP_PROTO(uint64_t amount
, uint64_t arc_evict_count
, uint64_t aew_count
),
354 TP_ARGS(amount
, arc_evict_count
, aew_count
),
356 __field(uint64_t, amount
)
357 __field(uint64_t, arc_evict_count
)
358 __field(uint64_t, aew_count
)
361 __entry
->amount
= amount
;
362 __entry
->arc_evict_count
= arc_evict_count
;
363 __entry
->aew_count
= aew_count
;
365 TP_printk("amount %llu arc_evict_count %llu aew_count %llu",
366 __entry
->amount
, __entry
->arc_evict_count
, __entry
->aew_count
)
370 #define DEFINE_ARC_WAIT_FOR_EVICTION_EVENT(name) \
371 DEFINE_EVENT(zfs_arc_wait_for_eviction_class, name, \
372 TP_PROTO(uint64_t amount, uint64_t arc_evict_count, uint64_t aew_count), \
373 TP_ARGS(amount, arc_evict_count, aew_count))
374 DEFINE_ARC_WAIT_FOR_EVICTION_EVENT(zfs_arc__wait__for__eviction
);
376 #endif /* _TRACE_ARC_H */
378 #undef TRACE_INCLUDE_PATH
379 #undef TRACE_INCLUDE_FILE
380 #define TRACE_INCLUDE_PATH sys
381 #define TRACE_INCLUDE_FILE trace_arc
382 #include <trace/define_trace.h>
386 DEFINE_DTRACE_PROBE1(arc__hit
);
387 DEFINE_DTRACE_PROBE1(arc__iohit
);
388 DEFINE_DTRACE_PROBE1(arc__evict
);
389 DEFINE_DTRACE_PROBE1(arc__delete
);
390 DEFINE_DTRACE_PROBE1(new_state__mru
);
391 DEFINE_DTRACE_PROBE1(new_state__mfu
);
392 DEFINE_DTRACE_PROBE1(new_state__uncached
);
393 DEFINE_DTRACE_PROBE1(arc__async__upgrade__sync
);
394 DEFINE_DTRACE_PROBE1(l2arc__hit
);
395 DEFINE_DTRACE_PROBE1(l2arc__miss
);
396 DEFINE_DTRACE_PROBE2(l2arc__read
);
397 DEFINE_DTRACE_PROBE2(l2arc__write
);
398 DEFINE_DTRACE_PROBE2(l2arc__iodone
);
399 DEFINE_DTRACE_PROBE3(arc__wait__for__eviction
);
400 DEFINE_DTRACE_PROBE4(arc__miss
);
401 DEFINE_DTRACE_PROBE4(l2arc__evict
);
403 #endif /* HAVE_DECLARE_EVENT_CLASS */