]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - include/os/linux/zfs/sys/trace_arc.h
Vendor import of openzfs master @ 184df27eef0abdc7ab2105b21257f753834b936b
[FreeBSD/FreeBSD.git] / include / os / linux / zfs / sys / trace_arc.h
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_l1hdr.b_l2_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_l1hdr.b_l2_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 */