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 21 enum 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 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, 44 }; 45 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, 62 }; 63 64 enum cachefiles_trunc_trace { 65 cachefiles_trunc_dio_adjust, 66 cachefiles_trunc_expand_tmpfile, 67 cachefiles_trunc_shrink, 68 }; 69 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, 79 }; 80 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, 99 }; 100 101 #endif 102 103 /* 104 * Define enum -> string mappings for display. 105 */ 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") 114 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") 128 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 ") 145 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") 150 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") 160 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") 179 180 181 /* 182 * Export enum symbols via userspace. 183 */ 184 #undef EM 185 #undef E_ 186 #define EM(a, b) TRACE_DEFINE_ENUM(a); 187 #define E_(a, b) TRACE_DEFINE_ENUM(a); 188 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; 195 196 /* 197 * Now redefine the EM() and E_() macros to map the enums to the strings that 198 * will be printed in the output. 199 */ 200 #undef EM 201 #undef E_ 202 #define EM(a, b) { a, b }, 203 #define E_(a, b) { a, b } 204 205 206 TRACE_EVENT(cachefiles_ref, 207 TP_PROTO(unsigned int object_debug_id, 208 unsigned int cookie_debug_id, 209 int usage, 210 enum cachefiles_obj_ref_trace why), 211 212 TP_ARGS(object_debug_id, cookie_debug_id, usage, why), 213 214 /* Note that obj may be NULL */ 215 TP_STRUCT__entry( 216 __field(unsigned int, obj ) 217 __field(unsigned int, cookie ) 218 __field(enum cachefiles_obj_ref_trace, why ) 219 __field(int, usage ) 220 ), 221 222 TP_fast_assign( 223 __entry->obj = object_debug_id; 224 __entry->cookie = cookie_debug_id; 225 __entry->usage = usage; 226 __entry->why = why; 227 ), 228 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)) 232 ); 233 234 TRACE_EVENT(cachefiles_lookup, 235 TP_PROTO(struct cachefiles_object *obj, 236 struct dentry *de), 237 238 TP_ARGS(obj, de), 239 240 TP_STRUCT__entry( 241 __field(unsigned int, obj ) 242 __field(short, error ) 243 __field(unsigned long, ino ) 244 ), 245 246 TP_fast_assign( 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; 251 ), 252 253 TP_printk("o=%08x i=%lx e=%d", 254 __entry->obj, __entry->ino, __entry->error) 255 ); 256 257 TRACE_EVENT(cachefiles_tmpfile, 258 TP_PROTO(struct cachefiles_object *obj, struct inode *backer), 259 260 TP_ARGS(obj, backer), 261 262 TP_STRUCT__entry( 263 __field(unsigned int, obj ) 264 __field(unsigned int, backer ) 265 ), 266 267 TP_fast_assign( 268 __entry->obj = obj->debug_id; 269 __entry->backer = backer->i_ino; 270 ), 271 272 TP_printk("o=%08x b=%08x", 273 __entry->obj, 274 __entry->backer) 275 ); 276 277 TRACE_EVENT(cachefiles_link, 278 TP_PROTO(struct cachefiles_object *obj, struct inode *backer), 279 280 TP_ARGS(obj, backer), 281 282 TP_STRUCT__entry( 283 __field(unsigned int, obj ) 284 __field(unsigned int, backer ) 285 ), 286 287 TP_fast_assign( 288 __entry->obj = obj->debug_id; 289 __entry->backer = backer->i_ino; 290 ), 291 292 TP_printk("o=%08x b=%08x", 293 __entry->obj, 294 __entry->backer) 295 ); 296 297 TRACE_EVENT(cachefiles_unlink, 298 TP_PROTO(struct cachefiles_object *obj, 299 struct dentry *de, 300 enum fscache_why_object_killed why), 301 302 TP_ARGS(obj, de, why), 303 304 /* Note that obj may be NULL */ 305 TP_STRUCT__entry( 306 __field(unsigned int, obj ) 307 __field(struct dentry *, de ) 308 __field(enum fscache_why_object_killed, why ) 309 ), 310 311 TP_fast_assign( 312 __entry->obj = obj ? obj->debug_id : UINT_MAX; 313 __entry->de = de; 314 __entry->why = why; 315 ), 316 317 TP_printk("o=%08x d=%p w=%s", 318 __entry->obj, __entry->de, 319 __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) 320 ); 321 322 TRACE_EVENT(cachefiles_rename, 323 TP_PROTO(struct cachefiles_object *obj, 324 struct dentry *de, 325 struct dentry *to, 326 enum fscache_why_object_killed why), 327 328 TP_ARGS(obj, de, to, why), 329 330 /* Note that obj may be NULL */ 331 TP_STRUCT__entry( 332 __field(unsigned int, obj ) 333 __field(struct dentry *, de ) 334 __field(struct dentry *, to ) 335 __field(enum fscache_why_object_killed, why ) 336 ), 337 338 TP_fast_assign( 339 __entry->obj = obj ? obj->debug_id : UINT_MAX; 340 __entry->de = de; 341 __entry->to = to; 342 __entry->why = why; 343 ), 344 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)) 348 ); 349 350 TRACE_EVENT(cachefiles_coherency, 351 TP_PROTO(struct cachefiles_object *obj, 352 ino_t ino, 353 enum cachefiles_content content, 354 enum cachefiles_coherency_trace why), 355 356 TP_ARGS(obj, ino, content, why), 357 358 /* Note that obj may be NULL */ 359 TP_STRUCT__entry( 360 __field(unsigned int, obj ) 361 __field(enum cachefiles_coherency_trace, why ) 362 __field(enum cachefiles_content, content ) 363 __field(u64, ino ) 364 ), 365 366 TP_fast_assign( 367 __entry->obj = obj->debug_id; 368 __entry->why = why; 369 __entry->content = content; 370 __entry->ino = ino; 371 ), 372 373 TP_printk("o=%08x %s i=%llx c=%u", 374 __entry->obj, 375 __print_symbolic(__entry->why, cachefiles_coherency_traces), 376 __entry->ino, 377 __entry->content) 378 ); 379 380 TRACE_EVENT(cachefiles_vol_coherency, 381 TP_PROTO(struct cachefiles_volume *volume, 382 ino_t ino, 383 enum cachefiles_coherency_trace why), 384 385 TP_ARGS(volume, ino, why), 386 387 /* Note that obj may be NULL */ 388 TP_STRUCT__entry( 389 __field(unsigned int, vol ) 390 __field(enum cachefiles_coherency_trace, why ) 391 __field(u64, ino ) 392 ), 393 394 TP_fast_assign( 395 __entry->vol = volume->vcookie->debug_id; 396 __entry->why = why; 397 __entry->ino = ino; 398 ), 399 400 TP_printk("V=%08x %s i=%llx", 401 __entry->vol, 402 __print_symbolic(__entry->why, cachefiles_coherency_traces), 403 __entry->ino) 404 ); 405 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, 410 ino_t cache_inode), 411 412 TP_ARGS(sreq, source, why, cache_inode), 413 414 TP_STRUCT__entry( 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 ) 424 ), 425 426 TP_fast_assign( 427 __entry->rreq = sreq->rreq->debug_id; 428 __entry->index = sreq->debug_index; 429 __entry->flags = sreq->flags; 430 __entry->source = source; 431 __entry->why = why; 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; 436 ), 437 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), 442 __entry->flags, 443 __entry->start, __entry->len, 444 __entry->netfs_inode, __entry->cache_inode) 445 ); 446 447 TRACE_EVENT(cachefiles_read, 448 TP_PROTO(struct cachefiles_object *obj, 449 struct inode *backer, 450 loff_t start, 451 size_t len), 452 453 TP_ARGS(obj, backer, start, len), 454 455 TP_STRUCT__entry( 456 __field(unsigned int, obj ) 457 __field(unsigned int, backer ) 458 __field(size_t, len ) 459 __field(loff_t, start ) 460 ), 461 462 TP_fast_assign( 463 __entry->obj = obj->debug_id; 464 __entry->backer = backer->i_ino; 465 __entry->start = start; 466 __entry->len = len; 467 ), 468 469 TP_printk("o=%08x b=%08x s=%llx l=%zx", 470 __entry->obj, 471 __entry->backer, 472 __entry->start, 473 __entry->len) 474 ); 475 476 TRACE_EVENT(cachefiles_write, 477 TP_PROTO(struct cachefiles_object *obj, 478 struct inode *backer, 479 loff_t start, 480 size_t len), 481 482 TP_ARGS(obj, backer, start, len), 483 484 TP_STRUCT__entry( 485 __field(unsigned int, obj ) 486 __field(unsigned int, backer ) 487 __field(size_t, len ) 488 __field(loff_t, start ) 489 ), 490 491 TP_fast_assign( 492 __entry->obj = obj->debug_id; 493 __entry->backer = backer->i_ino; 494 __entry->start = start; 495 __entry->len = len; 496 ), 497 498 TP_printk("o=%08x b=%08x s=%llx l=%zx", 499 __entry->obj, 500 __entry->backer, 501 __entry->start, 502 __entry->len) 503 ); 504 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), 508 509 TP_ARGS(obj, backer, from, to, why), 510 511 TP_STRUCT__entry( 512 __field(unsigned int, obj ) 513 __field(unsigned int, backer ) 514 __field(enum cachefiles_trunc_trace, why ) 515 __field(loff_t, from ) 516 __field(loff_t, to ) 517 ), 518 519 TP_fast_assign( 520 __entry->obj = obj->debug_id; 521 __entry->backer = backer->i_ino; 522 __entry->from = from; 523 __entry->to = to; 524 __entry->why = why; 525 ), 526 527 TP_printk("o=%08x b=%08x %s l=%llx->%llx", 528 __entry->obj, 529 __entry->backer, 530 __print_symbolic(__entry->why, cachefiles_trunc_traces), 531 __entry->from, 532 __entry->to) 533 ); 534 535 TRACE_EVENT(cachefiles_mark_active, 536 TP_PROTO(struct cachefiles_object *obj, 537 struct inode *inode), 538 539 TP_ARGS(obj, inode), 540 541 /* Note that obj may be NULL */ 542 TP_STRUCT__entry( 543 __field(unsigned int, obj ) 544 __field(ino_t, inode ) 545 ), 546 547 TP_fast_assign( 548 __entry->obj = obj ? obj->debug_id : 0; 549 __entry->inode = inode->i_ino; 550 ), 551 552 TP_printk("o=%08x i=%lx", 553 __entry->obj, __entry->inode) 554 ); 555 556 TRACE_EVENT(cachefiles_mark_inactive, 557 TP_PROTO(struct cachefiles_object *obj, 558 struct inode *inode), 559 560 TP_ARGS(obj, inode), 561 562 /* Note that obj may be NULL */ 563 TP_STRUCT__entry( 564 __field(unsigned int, obj ) 565 __field(ino_t, inode ) 566 ), 567 568 TP_fast_assign( 569 __entry->obj = obj ? obj->debug_id : 0; 570 __entry->inode = inode->i_ino; 571 ), 572 573 TP_printk("o=%08x i=%lx", 574 __entry->obj, __entry->inode) 575 ); 576 577 TRACE_EVENT(cachefiles_vfs_error, 578 TP_PROTO(struct cachefiles_object *obj, struct inode *backer, 579 int error, enum cachefiles_error_trace where), 580 581 TP_ARGS(obj, backer, error, where), 582 583 TP_STRUCT__entry( 584 __field(unsigned int, obj ) 585 __field(unsigned int, backer ) 586 __field(enum cachefiles_error_trace, where ) 587 __field(short, error ) 588 ), 589 590 TP_fast_assign( 591 __entry->obj = obj ? obj->debug_id : 0; 592 __entry->backer = backer->i_ino; 593 __entry->error = error; 594 __entry->where = where; 595 ), 596 597 TP_printk("o=%08x b=%08x %s e=%d", 598 __entry->obj, 599 __entry->backer, 600 __print_symbolic(__entry->where, cachefiles_error_traces), 601 __entry->error) 602 ); 603 604 TRACE_EVENT(cachefiles_io_error, 605 TP_PROTO(struct cachefiles_object *obj, struct inode *backer, 606 int error, enum cachefiles_error_trace where), 607 608 TP_ARGS(obj, backer, error, where), 609 610 TP_STRUCT__entry( 611 __field(unsigned int, obj ) 612 __field(unsigned int, backer ) 613 __field(enum cachefiles_error_trace, where ) 614 __field(short, error ) 615 ), 616 617 TP_fast_assign( 618 __entry->obj = obj ? obj->debug_id : 0; 619 __entry->backer = backer->i_ino; 620 __entry->error = error; 621 __entry->where = where; 622 ), 623 624 TP_printk("o=%08x b=%08x %s e=%d", 625 __entry->obj, 626 __entry->backer, 627 __print_symbolic(__entry->where, cachefiles_error_traces), 628 __entry->error) 629 ); 630 631 #endif /* _TRACE_CACHEFILES_H */ 632 633 /* This part must be outside protection */ 634 #include <trace/define_trace.h> 635