Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/* CacheFiles tracepoints
3 *
4 * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
6 */
7#undef TRACE_SYSTEM
8#define TRACE_SYSTEM cachefiles
9
10#if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ)
11#define _TRACE_CACHEFILES_H
12
13#include <linux/tracepoint.h>
14
15/*
16 * Define enums for tracing information.
17 */
18#ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
19#define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
20
21enum cachefiles_obj_ref_trace {
22 cachefiles_obj_get_ioreq,
23 cachefiles_obj_new,
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,
34};
35
36enum 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,
44};
45
46enum 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_resv,
60 cachefiles_coherency_vol_check_xattr,
61 cachefiles_coherency_vol_set_fail,
62 cachefiles_coherency_vol_set_ok,
63};
64
65enum cachefiles_trunc_trace {
66 cachefiles_trunc_dio_adjust,
67 cachefiles_trunc_expand_tmpfile,
68 cachefiles_trunc_shrink,
69};
70
71enum cachefiles_prepare_read_trace {
72 cachefiles_trace_read_after_eof,
73 cachefiles_trace_read_found_hole,
74 cachefiles_trace_read_found_part,
75 cachefiles_trace_read_have_data,
76 cachefiles_trace_read_no_data,
77 cachefiles_trace_read_no_file,
78 cachefiles_trace_read_seek_error,
79 cachefiles_trace_read_seek_nxio,
80};
81
82enum cachefiles_error_trace {
83 cachefiles_trace_fallocate_error,
84 cachefiles_trace_getxattr_error,
85 cachefiles_trace_link_error,
86 cachefiles_trace_lookup_error,
87 cachefiles_trace_mkdir_error,
88 cachefiles_trace_notify_change_error,
89 cachefiles_trace_open_error,
90 cachefiles_trace_read_error,
91 cachefiles_trace_remxattr_error,
92 cachefiles_trace_rename_error,
93 cachefiles_trace_seek_error,
94 cachefiles_trace_setxattr_error,
95 cachefiles_trace_statfs_error,
96 cachefiles_trace_tmpfile_error,
97 cachefiles_trace_trunc_error,
98 cachefiles_trace_unlink_error,
99 cachefiles_trace_write_error,
100};
101
102#endif
103
104/*
105 * Define enum -> string mappings for display.
106 */
107#define cachefiles_obj_kill_traces \
108 EM(FSCACHE_OBJECT_IS_STALE, "stale") \
109 EM(FSCACHE_OBJECT_IS_WEIRD, "weird") \
110 EM(FSCACHE_OBJECT_INVALIDATED, "inval") \
111 EM(FSCACHE_OBJECT_NO_SPACE, "no_space") \
112 EM(FSCACHE_OBJECT_WAS_RETIRED, "was_retired") \
113 EM(FSCACHE_OBJECT_WAS_CULLED, "was_culled") \
114 E_(FSCACHE_VOLUME_IS_WEIRD, "volume_weird")
115
116#define cachefiles_obj_ref_traces \
117 EM(cachefiles_obj_get_ioreq, "GET ioreq") \
118 EM(cachefiles_obj_new, "NEW obj") \
119 EM(cachefiles_obj_put_alloc_fail, "PUT alloc_fail") \
120 EM(cachefiles_obj_put_detach, "PUT detach") \
121 EM(cachefiles_obj_put_ioreq, "PUT ioreq") \
122 EM(cachefiles_obj_see_clean_commit, "SEE clean_commit") \
123 EM(cachefiles_obj_see_clean_delete, "SEE clean_delete") \
124 EM(cachefiles_obj_see_clean_drop_tmp, "SEE clean_drop_tmp") \
125 EM(cachefiles_obj_see_lookup_cookie, "SEE lookup_cookie") \
126 EM(cachefiles_obj_see_lookup_failed, "SEE lookup_failed") \
127 EM(cachefiles_obj_see_withdraw_cookie, "SEE withdraw_cookie") \
128 E_(cachefiles_obj_see_withdrawal, "SEE withdrawal")
129
130#define cachefiles_coherency_traces \
131 EM(cachefiles_coherency_check_aux, "BAD aux ") \
132 EM(cachefiles_coherency_check_content, "BAD cont") \
133 EM(cachefiles_coherency_check_dirty, "BAD dirt") \
134 EM(cachefiles_coherency_check_len, "BAD len ") \
135 EM(cachefiles_coherency_check_objsize, "BAD osiz") \
136 EM(cachefiles_coherency_check_ok, "OK ") \
137 EM(cachefiles_coherency_check_type, "BAD type") \
138 EM(cachefiles_coherency_check_xattr, "BAD xatt") \
139 EM(cachefiles_coherency_set_fail, "SET fail") \
140 EM(cachefiles_coherency_set_ok, "SET ok ") \
141 EM(cachefiles_coherency_vol_check_cmp, "VOL BAD cmp ") \
142 EM(cachefiles_coherency_vol_check_ok, "VOL OK ") \
143 EM(cachefiles_coherency_vol_check_resv, "VOL BAD resv") \
144 EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt") \
145 EM(cachefiles_coherency_vol_set_fail, "VOL SET fail") \
146 E_(cachefiles_coherency_vol_set_ok, "VOL SET ok ")
147
148#define cachefiles_trunc_traces \
149 EM(cachefiles_trunc_dio_adjust, "DIOADJ") \
150 EM(cachefiles_trunc_expand_tmpfile, "EXPTMP") \
151 E_(cachefiles_trunc_shrink, "SHRINK")
152
153#define cachefiles_prepare_read_traces \
154 EM(cachefiles_trace_read_after_eof, "after-eof ") \
155 EM(cachefiles_trace_read_found_hole, "found-hole") \
156 EM(cachefiles_trace_read_found_part, "found-part") \
157 EM(cachefiles_trace_read_have_data, "have-data ") \
158 EM(cachefiles_trace_read_no_data, "no-data ") \
159 EM(cachefiles_trace_read_no_file, "no-file ") \
160 EM(cachefiles_trace_read_seek_error, "seek-error") \
161 E_(cachefiles_trace_read_seek_nxio, "seek-enxio")
162
163#define cachefiles_error_traces \
164 EM(cachefiles_trace_fallocate_error, "fallocate") \
165 EM(cachefiles_trace_getxattr_error, "getxattr") \
166 EM(cachefiles_trace_link_error, "link") \
167 EM(cachefiles_trace_lookup_error, "lookup") \
168 EM(cachefiles_trace_mkdir_error, "mkdir") \
169 EM(cachefiles_trace_notify_change_error, "notify_change") \
170 EM(cachefiles_trace_open_error, "open") \
171 EM(cachefiles_trace_read_error, "read") \
172 EM(cachefiles_trace_remxattr_error, "remxattr") \
173 EM(cachefiles_trace_rename_error, "rename") \
174 EM(cachefiles_trace_seek_error, "seek") \
175 EM(cachefiles_trace_setxattr_error, "setxattr") \
176 EM(cachefiles_trace_statfs_error, "statfs") \
177 EM(cachefiles_trace_tmpfile_error, "tmpfile") \
178 EM(cachefiles_trace_trunc_error, "trunc") \
179 EM(cachefiles_trace_unlink_error, "unlink") \
180 E_(cachefiles_trace_write_error, "write")
181
182
183/*
184 * Export enum symbols via userspace.
185 */
186#undef EM
187#undef E_
188#define EM(a, b) TRACE_DEFINE_ENUM(a);
189#define E_(a, b) TRACE_DEFINE_ENUM(a);
190
191cachefiles_obj_kill_traces;
192cachefiles_obj_ref_traces;
193cachefiles_coherency_traces;
194cachefiles_trunc_traces;
195cachefiles_prepare_read_traces;
196cachefiles_error_traces;
197
198/*
199 * Now redefine the EM() and E_() macros to map the enums to the strings that
200 * will be printed in the output.
201 */
202#undef EM
203#undef E_
204#define EM(a, b) { a, b },
205#define E_(a, b) { a, b }
206
207
208TRACE_EVENT(cachefiles_ref,
209 TP_PROTO(unsigned int object_debug_id,
210 unsigned int cookie_debug_id,
211 int usage,
212 enum cachefiles_obj_ref_trace why),
213
214 TP_ARGS(object_debug_id, cookie_debug_id, usage, why),
215
216 /* Note that obj may be NULL */
217 TP_STRUCT__entry(
218 __field(unsigned int, obj )
219 __field(unsigned int, cookie )
220 __field(enum cachefiles_obj_ref_trace, why )
221 __field(int, usage )
222 ),
223
224 TP_fast_assign(
225 __entry->obj = object_debug_id;
226 __entry->cookie = cookie_debug_id;
227 __entry->usage = usage;
228 __entry->why = why;
229 ),
230
231 TP_printk("c=%08x o=%08x u=%d %s",
232 __entry->cookie, __entry->obj, __entry->usage,
233 __print_symbolic(__entry->why, cachefiles_obj_ref_traces))
234 );
235
236TRACE_EVENT(cachefiles_lookup,
237 TP_PROTO(struct cachefiles_object *obj,
238 struct dentry *dir,
239 struct dentry *de),
240
241 TP_ARGS(obj, dir, de),
242
243 TP_STRUCT__entry(
244 __field(unsigned int, obj )
245 __field(short, error )
246 __field(unsigned long, dino )
247 __field(unsigned long, ino )
248 ),
249
250 TP_fast_assign(
251 __entry->obj = obj ? obj->debug_id : 0;
252 __entry->dino = d_backing_inode(dir)->i_ino;
253 __entry->ino = (!IS_ERR(de) && d_backing_inode(de) ?
254 d_backing_inode(de)->i_ino : 0);
255 __entry->error = IS_ERR(de) ? PTR_ERR(de) : 0;
256 ),
257
258 TP_printk("o=%08x dB=%lx B=%lx e=%d",
259 __entry->obj, __entry->dino, __entry->ino, __entry->error)
260 );
261
262TRACE_EVENT(cachefiles_mkdir,
263 TP_PROTO(struct dentry *dir, struct dentry *subdir),
264
265 TP_ARGS(dir, subdir),
266
267 TP_STRUCT__entry(
268 __field(unsigned int, dir )
269 __field(unsigned int, subdir )
270 ),
271
272 TP_fast_assign(
273 __entry->dir = d_backing_inode(dir)->i_ino;
274 __entry->subdir = d_backing_inode(subdir)->i_ino;
275 ),
276
277 TP_printk("dB=%x sB=%x",
278 __entry->dir,
279 __entry->subdir)
280 );
281
282TRACE_EVENT(cachefiles_tmpfile,
283 TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
284
285 TP_ARGS(obj, backer),
286
287 TP_STRUCT__entry(
288 __field(unsigned int, obj )
289 __field(unsigned int, backer )
290 ),
291
292 TP_fast_assign(
293 __entry->obj = obj->debug_id;
294 __entry->backer = backer->i_ino;
295 ),
296
297 TP_printk("o=%08x B=%x",
298 __entry->obj,
299 __entry->backer)
300 );
301
302TRACE_EVENT(cachefiles_link,
303 TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
304
305 TP_ARGS(obj, backer),
306
307 TP_STRUCT__entry(
308 __field(unsigned int, obj )
309 __field(unsigned int, backer )
310 ),
311
312 TP_fast_assign(
313 __entry->obj = obj->debug_id;
314 __entry->backer = backer->i_ino;
315 ),
316
317 TP_printk("o=%08x B=%x",
318 __entry->obj,
319 __entry->backer)
320 );
321
322TRACE_EVENT(cachefiles_unlink,
323 TP_PROTO(struct cachefiles_object *obj,
324 ino_t ino,
325 enum fscache_why_object_killed why),
326
327 TP_ARGS(obj, ino, why),
328
329 /* Note that obj may be NULL */
330 TP_STRUCT__entry(
331 __field(unsigned int, obj )
332 __field(unsigned int, ino )
333 __field(enum fscache_why_object_killed, why )
334 ),
335
336 TP_fast_assign(
337 __entry->obj = obj ? obj->debug_id : UINT_MAX;
338 __entry->ino = ino;
339 __entry->why = why;
340 ),
341
342 TP_printk("o=%08x B=%x w=%s",
343 __entry->obj, __entry->ino,
344 __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
345 );
346
347TRACE_EVENT(cachefiles_rename,
348 TP_PROTO(struct cachefiles_object *obj,
349 ino_t ino,
350 enum fscache_why_object_killed why),
351
352 TP_ARGS(obj, ino, why),
353
354 /* Note that obj may be NULL */
355 TP_STRUCT__entry(
356 __field(unsigned int, obj )
357 __field(unsigned int, ino )
358 __field(enum fscache_why_object_killed, why )
359 ),
360
361 TP_fast_assign(
362 __entry->obj = obj ? obj->debug_id : UINT_MAX;
363 __entry->ino = ino;
364 __entry->why = why;
365 ),
366
367 TP_printk("o=%08x B=%x w=%s",
368 __entry->obj, __entry->ino,
369 __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
370 );
371
372TRACE_EVENT(cachefiles_coherency,
373 TP_PROTO(struct cachefiles_object *obj,
374 ino_t ino,
375 enum cachefiles_content content,
376 enum cachefiles_coherency_trace why),
377
378 TP_ARGS(obj, ino, content, why),
379
380 /* Note that obj may be NULL */
381 TP_STRUCT__entry(
382 __field(unsigned int, obj )
383 __field(enum cachefiles_coherency_trace, why )
384 __field(enum cachefiles_content, content )
385 __field(u64, ino )
386 ),
387
388 TP_fast_assign(
389 __entry->obj = obj->debug_id;
390 __entry->why = why;
391 __entry->content = content;
392 __entry->ino = ino;
393 ),
394
395 TP_printk("o=%08x %s B=%llx c=%u",
396 __entry->obj,
397 __print_symbolic(__entry->why, cachefiles_coherency_traces),
398 __entry->ino,
399 __entry->content)
400 );
401
402TRACE_EVENT(cachefiles_vol_coherency,
403 TP_PROTO(struct cachefiles_volume *volume,
404 ino_t ino,
405 enum cachefiles_coherency_trace why),
406
407 TP_ARGS(volume, ino, why),
408
409 /* Note that obj may be NULL */
410 TP_STRUCT__entry(
411 __field(unsigned int, vol )
412 __field(enum cachefiles_coherency_trace, why )
413 __field(u64, ino )
414 ),
415
416 TP_fast_assign(
417 __entry->vol = volume->vcookie->debug_id;
418 __entry->why = why;
419 __entry->ino = ino;
420 ),
421
422 TP_printk("V=%08x %s B=%llx",
423 __entry->vol,
424 __print_symbolic(__entry->why, cachefiles_coherency_traces),
425 __entry->ino)
426 );
427
428TRACE_EVENT(cachefiles_prep_read,
429 TP_PROTO(struct netfs_io_subrequest *sreq,
430 enum netfs_io_source source,
431 enum cachefiles_prepare_read_trace why,
432 ino_t cache_inode),
433
434 TP_ARGS(sreq, source, why, cache_inode),
435
436 TP_STRUCT__entry(
437 __field(unsigned int, rreq )
438 __field(unsigned short, index )
439 __field(unsigned short, flags )
440 __field(enum netfs_io_source, source )
441 __field(enum cachefiles_prepare_read_trace, why )
442 __field(size_t, len )
443 __field(loff_t, start )
444 __field(unsigned int, netfs_inode )
445 __field(unsigned int, cache_inode )
446 ),
447
448 TP_fast_assign(
449 __entry->rreq = sreq->rreq->debug_id;
450 __entry->index = sreq->debug_index;
451 __entry->flags = sreq->flags;
452 __entry->source = source;
453 __entry->why = why;
454 __entry->len = sreq->len;
455 __entry->start = sreq->start;
456 __entry->netfs_inode = sreq->rreq->inode->i_ino;
457 __entry->cache_inode = cache_inode;
458 ),
459
460 TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx ni=%x B=%x",
461 __entry->rreq, __entry->index,
462 __print_symbolic(__entry->source, netfs_sreq_sources),
463 __print_symbolic(__entry->why, cachefiles_prepare_read_traces),
464 __entry->flags,
465 __entry->start, __entry->len,
466 __entry->netfs_inode, __entry->cache_inode)
467 );
468
469TRACE_EVENT(cachefiles_read,
470 TP_PROTO(struct cachefiles_object *obj,
471 struct inode *backer,
472 loff_t start,
473 size_t len),
474
475 TP_ARGS(obj, backer, start, len),
476
477 TP_STRUCT__entry(
478 __field(unsigned int, obj )
479 __field(unsigned int, backer )
480 __field(size_t, len )
481 __field(loff_t, start )
482 ),
483
484 TP_fast_assign(
485 __entry->obj = obj->debug_id;
486 __entry->backer = backer->i_ino;
487 __entry->start = start;
488 __entry->len = len;
489 ),
490
491 TP_printk("o=%08x B=%x s=%llx l=%zx",
492 __entry->obj,
493 __entry->backer,
494 __entry->start,
495 __entry->len)
496 );
497
498TRACE_EVENT(cachefiles_write,
499 TP_PROTO(struct cachefiles_object *obj,
500 struct inode *backer,
501 loff_t start,
502 size_t len),
503
504 TP_ARGS(obj, backer, start, len),
505
506 TP_STRUCT__entry(
507 __field(unsigned int, obj )
508 __field(unsigned int, backer )
509 __field(size_t, len )
510 __field(loff_t, start )
511 ),
512
513 TP_fast_assign(
514 __entry->obj = obj->debug_id;
515 __entry->backer = backer->i_ino;
516 __entry->start = start;
517 __entry->len = len;
518 ),
519
520 TP_printk("o=%08x B=%x s=%llx l=%zx",
521 __entry->obj,
522 __entry->backer,
523 __entry->start,
524 __entry->len)
525 );
526
527TRACE_EVENT(cachefiles_trunc,
528 TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
529 loff_t from, loff_t to, enum cachefiles_trunc_trace why),
530
531 TP_ARGS(obj, backer, from, to, why),
532
533 TP_STRUCT__entry(
534 __field(unsigned int, obj )
535 __field(unsigned int, backer )
536 __field(enum cachefiles_trunc_trace, why )
537 __field(loff_t, from )
538 __field(loff_t, to )
539 ),
540
541 TP_fast_assign(
542 __entry->obj = obj->debug_id;
543 __entry->backer = backer->i_ino;
544 __entry->from = from;
545 __entry->to = to;
546 __entry->why = why;
547 ),
548
549 TP_printk("o=%08x B=%x %s l=%llx->%llx",
550 __entry->obj,
551 __entry->backer,
552 __print_symbolic(__entry->why, cachefiles_trunc_traces),
553 __entry->from,
554 __entry->to)
555 );
556
557TRACE_EVENT(cachefiles_mark_active,
558 TP_PROTO(struct cachefiles_object *obj,
559 struct inode *inode),
560
561 TP_ARGS(obj, inode),
562
563 /* Note that obj may be NULL */
564 TP_STRUCT__entry(
565 __field(unsigned int, obj )
566 __field(ino_t, inode )
567 ),
568
569 TP_fast_assign(
570 __entry->obj = obj ? obj->debug_id : 0;
571 __entry->inode = inode->i_ino;
572 ),
573
574 TP_printk("o=%08x B=%lx",
575 __entry->obj, __entry->inode)
576 );
577
578TRACE_EVENT(cachefiles_mark_failed,
579 TP_PROTO(struct cachefiles_object *obj,
580 struct inode *inode),
581
582 TP_ARGS(obj, inode),
583
584 /* Note that obj may be NULL */
585 TP_STRUCT__entry(
586 __field(unsigned int, obj )
587 __field(ino_t, inode )
588 ),
589
590 TP_fast_assign(
591 __entry->obj = obj ? obj->debug_id : 0;
592 __entry->inode = inode->i_ino;
593 ),
594
595 TP_printk("o=%08x B=%lx",
596 __entry->obj, __entry->inode)
597 );
598
599TRACE_EVENT(cachefiles_mark_inactive,
600 TP_PROTO(struct cachefiles_object *obj,
601 struct inode *inode),
602
603 TP_ARGS(obj, inode),
604
605 /* Note that obj may be NULL */
606 TP_STRUCT__entry(
607 __field(unsigned int, obj )
608 __field(ino_t, inode )
609 ),
610
611 TP_fast_assign(
612 __entry->obj = obj ? obj->debug_id : 0;
613 __entry->inode = inode->i_ino;
614 ),
615
616 TP_printk("o=%08x B=%lx",
617 __entry->obj, __entry->inode)
618 );
619
620TRACE_EVENT(cachefiles_vfs_error,
621 TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
622 int error, enum cachefiles_error_trace where),
623
624 TP_ARGS(obj, backer, error, where),
625
626 TP_STRUCT__entry(
627 __field(unsigned int, obj )
628 __field(unsigned int, backer )
629 __field(enum cachefiles_error_trace, where )
630 __field(short, error )
631 ),
632
633 TP_fast_assign(
634 __entry->obj = obj ? obj->debug_id : 0;
635 __entry->backer = backer->i_ino;
636 __entry->error = error;
637 __entry->where = where;
638 ),
639
640 TP_printk("o=%08x B=%x %s e=%d",
641 __entry->obj,
642 __entry->backer,
643 __print_symbolic(__entry->where, cachefiles_error_traces),
644 __entry->error)
645 );
646
647TRACE_EVENT(cachefiles_io_error,
648 TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
649 int error, enum cachefiles_error_trace where),
650
651 TP_ARGS(obj, backer, error, where),
652
653 TP_STRUCT__entry(
654 __field(unsigned int, obj )
655 __field(unsigned int, backer )
656 __field(enum cachefiles_error_trace, where )
657 __field(short, error )
658 ),
659
660 TP_fast_assign(
661 __entry->obj = obj ? obj->debug_id : 0;
662 __entry->backer = backer->i_ino;
663 __entry->error = error;
664 __entry->where = where;
665 ),
666
667 TP_printk("o=%08x B=%x %s e=%d",
668 __entry->obj,
669 __entry->backer,
670 __print_symbolic(__entry->where, cachefiles_error_traces),
671 __entry->error)
672 );
673
674#endif /* _TRACE_CACHEFILES_H */
675
676/* This part must be outside protection */
677#include <trace/define_trace.h>