1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* CacheFiles tracepoints
4 * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
8 #define TRACE_SYSTEM cachefiles
10 #if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ)
11 #define _TRACE_CACHEFILES_H
13 #include <linux/tracepoint.h>
16 * Define enums for tracing information.
18 #ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
19 #define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
21 enum cachefiles_obj_ref_trace {
22 cachefiles_obj_get_ioreq,
24 cachefiles_obj_put_alloc_fail,
25 cachefiles_obj_put_detach,
26 cachefiles_obj_put_ioreq,
27 cachefiles_obj_see_clean_commit,
28 cachefiles_obj_see_clean_delete,
29 cachefiles_obj_see_clean_drop_tmp,
30 cachefiles_obj_see_lookup_cookie,
31 cachefiles_obj_see_lookup_failed,
32 cachefiles_obj_see_withdraw_cookie,
33 cachefiles_obj_see_withdrawal,
36 enum fscache_why_object_killed {
37 FSCACHE_OBJECT_IS_STALE,
38 FSCACHE_OBJECT_IS_WEIRD,
39 FSCACHE_OBJECT_INVALIDATED,
40 FSCACHE_OBJECT_NO_SPACE,
41 FSCACHE_OBJECT_WAS_RETIRED,
42 FSCACHE_OBJECT_WAS_CULLED,
43 FSCACHE_VOLUME_IS_WEIRD,
46 enum cachefiles_coherency_trace {
47 cachefiles_coherency_check_aux,
48 cachefiles_coherency_check_content,
49 cachefiles_coherency_check_dirty,
50 cachefiles_coherency_check_len,
51 cachefiles_coherency_check_objsize,
52 cachefiles_coherency_check_ok,
53 cachefiles_coherency_check_type,
54 cachefiles_coherency_check_xattr,
55 cachefiles_coherency_set_fail,
56 cachefiles_coherency_set_ok,
57 cachefiles_coherency_vol_check_cmp,
58 cachefiles_coherency_vol_check_ok,
59 cachefiles_coherency_vol_check_xattr,
60 cachefiles_coherency_vol_set_fail,
61 cachefiles_coherency_vol_set_ok,
64 enum cachefiles_trunc_trace {
65 cachefiles_trunc_dio_adjust,
66 cachefiles_trunc_expand_tmpfile,
67 cachefiles_trunc_shrink,
70 enum cachefiles_prepare_read_trace {
71 cachefiles_trace_read_after_eof,
72 cachefiles_trace_read_found_hole,
73 cachefiles_trace_read_found_part,
74 cachefiles_trace_read_have_data,
75 cachefiles_trace_read_no_data,
76 cachefiles_trace_read_no_file,
77 cachefiles_trace_read_seek_error,
78 cachefiles_trace_read_seek_nxio,
81 enum cachefiles_error_trace {
82 cachefiles_trace_fallocate_error,
83 cachefiles_trace_getxattr_error,
84 cachefiles_trace_link_error,
85 cachefiles_trace_lookup_error,
86 cachefiles_trace_mkdir_error,
87 cachefiles_trace_notify_change_error,
88 cachefiles_trace_open_error,
89 cachefiles_trace_read_error,
90 cachefiles_trace_remxattr_error,
91 cachefiles_trace_rename_error,
92 cachefiles_trace_seek_error,
93 cachefiles_trace_setxattr_error,
94 cachefiles_trace_statfs_error,
95 cachefiles_trace_tmpfile_error,
96 cachefiles_trace_trunc_error,
97 cachefiles_trace_unlink_error,
98 cachefiles_trace_write_error,
104 * Define enum -> string mappings for display.
106 #define cachefiles_obj_kill_traces \
107 EM(FSCACHE_OBJECT_IS_STALE, "stale") \
108 EM(FSCACHE_OBJECT_IS_WEIRD, "weird") \
109 EM(FSCACHE_OBJECT_INVALIDATED, "inval") \
110 EM(FSCACHE_OBJECT_NO_SPACE, "no_space") \
111 EM(FSCACHE_OBJECT_WAS_RETIRED, "was_retired") \
112 EM(FSCACHE_OBJECT_WAS_CULLED, "was_culled") \
113 E_(FSCACHE_VOLUME_IS_WEIRD, "volume_weird")
115 #define cachefiles_obj_ref_traces \
116 EM(cachefiles_obj_get_ioreq, "GET ioreq") \
117 EM(cachefiles_obj_new, "NEW obj") \
118 EM(cachefiles_obj_put_alloc_fail, "PUT alloc_fail") \
119 EM(cachefiles_obj_put_detach, "PUT detach") \
120 EM(cachefiles_obj_put_ioreq, "PUT ioreq") \
121 EM(cachefiles_obj_see_clean_commit, "SEE clean_commit") \
122 EM(cachefiles_obj_see_clean_delete, "SEE clean_delete") \
123 EM(cachefiles_obj_see_clean_drop_tmp, "SEE clean_drop_tmp") \
124 EM(cachefiles_obj_see_lookup_cookie, "SEE lookup_cookie") \
125 EM(cachefiles_obj_see_lookup_failed, "SEE lookup_failed") \
126 EM(cachefiles_obj_see_withdraw_cookie, "SEE withdraw_cookie") \
127 E_(cachefiles_obj_see_withdrawal, "SEE withdrawal")
129 #define cachefiles_coherency_traces \
130 EM(cachefiles_coherency_check_aux, "BAD aux ") \
131 EM(cachefiles_coherency_check_content, "BAD cont") \
132 EM(cachefiles_coherency_check_dirty, "BAD dirt") \
133 EM(cachefiles_coherency_check_len, "BAD len ") \
134 EM(cachefiles_coherency_check_objsize, "BAD osiz") \
135 EM(cachefiles_coherency_check_ok, "OK ") \
136 EM(cachefiles_coherency_check_type, "BAD type") \
137 EM(cachefiles_coherency_check_xattr, "BAD xatt") \
138 EM(cachefiles_coherency_set_fail, "SET fail") \
139 EM(cachefiles_coherency_set_ok, "SET ok ") \
140 EM(cachefiles_coherency_vol_check_cmp, "VOL BAD cmp ") \
141 EM(cachefiles_coherency_vol_check_ok, "VOL OK ") \
142 EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt") \
143 EM(cachefiles_coherency_vol_set_fail, "VOL SET fail") \
144 E_(cachefiles_coherency_vol_set_ok, "VOL SET ok ")
146 #define cachefiles_trunc_traces \
147 EM(cachefiles_trunc_dio_adjust, "DIOADJ") \
148 EM(cachefiles_trunc_expand_tmpfile, "EXPTMP") \
149 E_(cachefiles_trunc_shrink, "SHRINK")
151 #define cachefiles_prepare_read_traces \
152 EM(cachefiles_trace_read_after_eof, "after-eof ") \
153 EM(cachefiles_trace_read_found_hole, "found-hole") \
154 EM(cachefiles_trace_read_found_part, "found-part") \
155 EM(cachefiles_trace_read_have_data, "have-data ") \
156 EM(cachefiles_trace_read_no_data, "no-data ") \
157 EM(cachefiles_trace_read_no_file, "no-file ") \
158 EM(cachefiles_trace_read_seek_error, "seek-error") \
159 E_(cachefiles_trace_read_seek_nxio, "seek-enxio")
161 #define cachefiles_error_traces \
162 EM(cachefiles_trace_fallocate_error, "fallocate") \
163 EM(cachefiles_trace_getxattr_error, "getxattr") \
164 EM(cachefiles_trace_link_error, "link") \
165 EM(cachefiles_trace_lookup_error, "lookup") \
166 EM(cachefiles_trace_mkdir_error, "mkdir") \
167 EM(cachefiles_trace_notify_change_error, "notify_change") \
168 EM(cachefiles_trace_open_error, "open") \
169 EM(cachefiles_trace_read_error, "read") \
170 EM(cachefiles_trace_remxattr_error, "remxattr") \
171 EM(cachefiles_trace_rename_error, "rename") \
172 EM(cachefiles_trace_seek_error, "seek") \
173 EM(cachefiles_trace_setxattr_error, "setxattr") \
174 EM(cachefiles_trace_statfs_error, "statfs") \
175 EM(cachefiles_trace_tmpfile_error, "tmpfile") \
176 EM(cachefiles_trace_trunc_error, "trunc") \
177 EM(cachefiles_trace_unlink_error, "unlink") \
178 E_(cachefiles_trace_write_error, "write")
182 * Export enum symbols via userspace.
186 #define EM(a, b) TRACE_DEFINE_ENUM(a);
187 #define E_(a, b) TRACE_DEFINE_ENUM(a);
189 cachefiles_obj_kill_traces;
190 cachefiles_obj_ref_traces;
191 cachefiles_coherency_traces;
192 cachefiles_trunc_traces;
193 cachefiles_prepare_read_traces;
194 cachefiles_error_traces;
197 * Now redefine the EM() and E_() macros to map the enums to the strings that
198 * will be printed in the output.
202 #define EM(a, b) { a, b },
203 #define E_(a, b) { a, b }
206 TRACE_EVENT(cachefiles_ref,
207 TP_PROTO(unsigned int object_debug_id,
208 unsigned int cookie_debug_id,
210 enum cachefiles_obj_ref_trace why),
212 TP_ARGS(object_debug_id, cookie_debug_id, usage, why),
214 /* Note that obj may be NULL */
216 __field(unsigned int, obj )
217 __field(unsigned int, cookie )
218 __field(enum cachefiles_obj_ref_trace, why )
223 __entry->obj = object_debug_id;
224 __entry->cookie = cookie_debug_id;
225 __entry->usage = usage;
229 TP_printk("c=%08x o=%08x u=%d %s",
230 __entry->cookie, __entry->obj, __entry->usage,
231 __print_symbolic(__entry->why, cachefiles_obj_ref_traces))
234 TRACE_EVENT(cachefiles_lookup,
235 TP_PROTO(struct cachefiles_object *obj,
241 __field(unsigned int, obj )
242 __field(short, error )
243 __field(unsigned long, ino )
247 __entry->obj = obj->debug_id;
248 __entry->ino = (!IS_ERR(de) && d_backing_inode(de) ?
249 d_backing_inode(de)->i_ino : 0);
250 __entry->error = IS_ERR(de) ? PTR_ERR(de) : 0;
253 TP_printk("o=%08x i=%lx e=%d",
254 __entry->obj, __entry->ino, __entry->error)
257 TRACE_EVENT(cachefiles_tmpfile,
258 TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
260 TP_ARGS(obj, backer),
263 __field(unsigned int, obj )
264 __field(unsigned int, backer )
268 __entry->obj = obj->debug_id;
269 __entry->backer = backer->i_ino;
272 TP_printk("o=%08x b=%08x",
277 TRACE_EVENT(cachefiles_link,
278 TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
280 TP_ARGS(obj, backer),
283 __field(unsigned int, obj )
284 __field(unsigned int, backer )
288 __entry->obj = obj->debug_id;
289 __entry->backer = backer->i_ino;
292 TP_printk("o=%08x b=%08x",
297 TRACE_EVENT(cachefiles_unlink,
298 TP_PROTO(struct cachefiles_object *obj,
300 enum fscache_why_object_killed why),
302 TP_ARGS(obj, de, why),
304 /* Note that obj may be NULL */
306 __field(unsigned int, obj )
307 __field(struct dentry *, de )
308 __field(enum fscache_why_object_killed, why )
312 __entry->obj = obj ? obj->debug_id : UINT_MAX;
317 TP_printk("o=%08x d=%p w=%s",
318 __entry->obj, __entry->de,
319 __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
322 TRACE_EVENT(cachefiles_rename,
323 TP_PROTO(struct cachefiles_object *obj,
326 enum fscache_why_object_killed why),
328 TP_ARGS(obj, de, to, why),
330 /* Note that obj may be NULL */
332 __field(unsigned int, obj )
333 __field(struct dentry *, de )
334 __field(struct dentry *, to )
335 __field(enum fscache_why_object_killed, why )
339 __entry->obj = obj ? obj->debug_id : UINT_MAX;
345 TP_printk("o=%08x d=%p t=%p w=%s",
346 __entry->obj, __entry->de, __entry->to,
347 __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
350 TRACE_EVENT(cachefiles_coherency,
351 TP_PROTO(struct cachefiles_object *obj,
353 enum cachefiles_content content,
354 enum cachefiles_coherency_trace why),
356 TP_ARGS(obj, ino, content, why),
358 /* Note that obj may be NULL */
360 __field(unsigned int, obj )
361 __field(enum cachefiles_coherency_trace, why )
362 __field(enum cachefiles_content, content )
367 __entry->obj = obj->debug_id;
369 __entry->content = content;
373 TP_printk("o=%08x %s i=%llx c=%u",
375 __print_symbolic(__entry->why, cachefiles_coherency_traces),
380 TRACE_EVENT(cachefiles_vol_coherency,
381 TP_PROTO(struct cachefiles_volume *volume,
383 enum cachefiles_coherency_trace why),
385 TP_ARGS(volume, ino, why),
387 /* Note that obj may be NULL */
389 __field(unsigned int, vol )
390 __field(enum cachefiles_coherency_trace, why )
395 __entry->vol = volume->vcookie->debug_id;
400 TP_printk("V=%08x %s i=%llx",
402 __print_symbolic(__entry->why, cachefiles_coherency_traces),
406 TRACE_EVENT(cachefiles_prep_read,
407 TP_PROTO(struct netfs_read_subrequest *sreq,
408 enum netfs_read_source source,
409 enum cachefiles_prepare_read_trace why,
412 TP_ARGS(sreq, source, why, cache_inode),
415 __field(unsigned int, rreq )
416 __field(unsigned short, index )
417 __field(unsigned short, flags )
418 __field(enum netfs_read_source, source )
419 __field(enum cachefiles_prepare_read_trace, why )
420 __field(size_t, len )
421 __field(loff_t, start )
422 __field(unsigned int, netfs_inode )
423 __field(unsigned int, cache_inode )
427 __entry->rreq = sreq->rreq->debug_id;
428 __entry->index = sreq->debug_index;
429 __entry->flags = sreq->flags;
430 __entry->source = source;
432 __entry->len = sreq->len;
433 __entry->start = sreq->start;
434 __entry->netfs_inode = sreq->rreq->inode->i_ino;
435 __entry->cache_inode = cache_inode;
438 TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx ni=%x b=%x",
439 __entry->rreq, __entry->index,
440 __print_symbolic(__entry->source, netfs_sreq_sources),
441 __print_symbolic(__entry->why, cachefiles_prepare_read_traces),
443 __entry->start, __entry->len,
444 __entry->netfs_inode, __entry->cache_inode)
447 TRACE_EVENT(cachefiles_read,
448 TP_PROTO(struct cachefiles_object *obj,
449 struct inode *backer,
453 TP_ARGS(obj, backer, start, len),
456 __field(unsigned int, obj )
457 __field(unsigned int, backer )
458 __field(size_t, len )
459 __field(loff_t, start )
463 __entry->obj = obj->debug_id;
464 __entry->backer = backer->i_ino;
465 __entry->start = start;
469 TP_printk("o=%08x b=%08x s=%llx l=%zx",
476 TRACE_EVENT(cachefiles_write,
477 TP_PROTO(struct cachefiles_object *obj,
478 struct inode *backer,
482 TP_ARGS(obj, backer, start, len),
485 __field(unsigned int, obj )
486 __field(unsigned int, backer )
487 __field(size_t, len )
488 __field(loff_t, start )
492 __entry->obj = obj->debug_id;
493 __entry->backer = backer->i_ino;
494 __entry->start = start;
498 TP_printk("o=%08x b=%08x s=%llx l=%zx",
505 TRACE_EVENT(cachefiles_trunc,
506 TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
507 loff_t from, loff_t to, enum cachefiles_trunc_trace why),
509 TP_ARGS(obj, backer, from, to, why),
512 __field(unsigned int, obj )
513 __field(unsigned int, backer )
514 __field(enum cachefiles_trunc_trace, why )
515 __field(loff_t, from )
520 __entry->obj = obj->debug_id;
521 __entry->backer = backer->i_ino;
522 __entry->from = from;
527 TP_printk("o=%08x b=%08x %s l=%llx->%llx",
530 __print_symbolic(__entry->why, cachefiles_trunc_traces),
535 TRACE_EVENT(cachefiles_mark_active,
536 TP_PROTO(struct cachefiles_object *obj,
537 struct inode *inode),
541 /* Note that obj may be NULL */
543 __field(unsigned int, obj )
544 __field(ino_t, inode )
548 __entry->obj = obj ? obj->debug_id : 0;
549 __entry->inode = inode->i_ino;
552 TP_printk("o=%08x i=%lx",
553 __entry->obj, __entry->inode)
556 TRACE_EVENT(cachefiles_mark_inactive,
557 TP_PROTO(struct cachefiles_object *obj,
558 struct inode *inode),
562 /* Note that obj may be NULL */
564 __field(unsigned int, obj )
565 __field(ino_t, inode )
569 __entry->obj = obj ? obj->debug_id : 0;
570 __entry->inode = inode->i_ino;
573 TP_printk("o=%08x i=%lx",
574 __entry->obj, __entry->inode)
577 TRACE_EVENT(cachefiles_vfs_error,
578 TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
579 int error, enum cachefiles_error_trace where),
581 TP_ARGS(obj, backer, error, where),
584 __field(unsigned int, obj )
585 __field(unsigned int, backer )
586 __field(enum cachefiles_error_trace, where )
587 __field(short, error )
591 __entry->obj = obj ? obj->debug_id : 0;
592 __entry->backer = backer->i_ino;
593 __entry->error = error;
594 __entry->where = where;
597 TP_printk("o=%08x b=%08x %s e=%d",
600 __print_symbolic(__entry->where, cachefiles_error_traces),
604 TRACE_EVENT(cachefiles_io_error,
605 TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
606 int error, enum cachefiles_error_trace where),
608 TP_ARGS(obj, backer, error, where),
611 __field(unsigned int, obj )
612 __field(unsigned int, backer )
613 __field(enum cachefiles_error_trace, where )
614 __field(short, error )
618 __entry->obj = obj ? obj->debug_id : 0;
619 __entry->backer = backer->i_ino;
620 __entry->error = error;
621 __entry->where = where;
624 TP_printk("o=%08x b=%08x %s e=%d",
627 __print_symbolic(__entry->where, cachefiles_error_traces),
631 #endif /* _TRACE_CACHEFILES_H */
633 /* This part must be outside protection */
634 #include <trace/define_trace.h>