1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* FS-Cache 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 fscache 9 10 #if !defined(_TRACE_FSCACHE_H) || defined(TRACE_HEADER_MULTI_READ) 11 #define _TRACE_FSCACHE_H 12 13 #include <linux/fscache.h> 14 #include <linux/tracepoint.h> 15 16 /* 17 * Define enums for tracing information. 18 */ 19 #ifndef __FSCACHE_DECLARE_TRACE_ENUMS_ONCE_ONLY 20 #define __FSCACHE_DECLARE_TRACE_ENUMS_ONCE_ONLY 21 22 enum fscache_cache_trace { 23 fscache_cache_collision, 24 fscache_cache_get_acquire, 25 fscache_cache_new_acquire, 26 fscache_cache_put_alloc_volume, 27 fscache_cache_put_cache, 28 fscache_cache_put_prep_failed, 29 fscache_cache_put_relinquish, 30 fscache_cache_put_volume, 31 }; 32 33 enum fscache_volume_trace { 34 fscache_volume_collision, 35 fscache_volume_get_cookie, 36 fscache_volume_get_create_work, 37 fscache_volume_get_hash_collision, 38 fscache_volume_free, 39 fscache_volume_new_acquire, 40 fscache_volume_put_cookie, 41 fscache_volume_put_create_work, 42 fscache_volume_put_hash_collision, 43 fscache_volume_put_relinquish, 44 fscache_volume_see_create_work, 45 fscache_volume_see_hash_wake, 46 fscache_volume_wait_create_work, 47 }; 48 49 enum fscache_cookie_trace { 50 fscache_cookie_collision, 51 fscache_cookie_discard, 52 fscache_cookie_failed, 53 fscache_cookie_get_attach_object, 54 fscache_cookie_get_end_access, 55 fscache_cookie_get_hash_collision, 56 fscache_cookie_get_inval_work, 57 fscache_cookie_get_lru, 58 fscache_cookie_get_use_work, 59 fscache_cookie_new_acquire, 60 fscache_cookie_put_hash_collision, 61 fscache_cookie_put_lru, 62 fscache_cookie_put_object, 63 fscache_cookie_put_over_queued, 64 fscache_cookie_put_relinquish, 65 fscache_cookie_put_withdrawn, 66 fscache_cookie_put_work, 67 fscache_cookie_see_active, 68 fscache_cookie_see_lru_discard, 69 fscache_cookie_see_lru_discard_clear, 70 fscache_cookie_see_lru_do_one, 71 fscache_cookie_see_relinquish, 72 fscache_cookie_see_withdraw, 73 fscache_cookie_see_work, 74 }; 75 76 enum fscache_active_trace { 77 fscache_active_use, 78 fscache_active_use_modify, 79 fscache_active_unuse, 80 }; 81 82 enum fscache_access_trace { 83 fscache_access_acquire_volume, 84 fscache_access_acquire_volume_end, 85 fscache_access_cache_pin, 86 fscache_access_cache_unpin, 87 fscache_access_invalidate_cookie, 88 fscache_access_invalidate_cookie_end, 89 fscache_access_io_end, 90 fscache_access_io_not_live, 91 fscache_access_io_read, 92 fscache_access_io_resize, 93 fscache_access_io_wait, 94 fscache_access_io_write, 95 fscache_access_lookup_cookie, 96 fscache_access_lookup_cookie_end, 97 fscache_access_lookup_cookie_end_failed, 98 fscache_access_relinquish_volume, 99 fscache_access_relinquish_volume_end, 100 fscache_access_unlive, 101 }; 102 103 #endif 104 105 /* 106 * Declare tracing information enums and their string mappings for display. 107 */ 108 #define fscache_cache_traces \ 109 EM(fscache_cache_collision, "*COLLIDE*") \ 110 EM(fscache_cache_get_acquire, "GET acq ") \ 111 EM(fscache_cache_new_acquire, "NEW acq ") \ 112 EM(fscache_cache_put_alloc_volume, "PUT alvol") \ 113 EM(fscache_cache_put_cache, "PUT cache") \ 114 EM(fscache_cache_put_prep_failed, "PUT pfail") \ 115 EM(fscache_cache_put_relinquish, "PUT relnq") \ 116 E_(fscache_cache_put_volume, "PUT vol ") 117 118 #define fscache_volume_traces \ 119 EM(fscache_volume_collision, "*COLLIDE*") \ 120 EM(fscache_volume_get_cookie, "GET cook ") \ 121 EM(fscache_volume_get_create_work, "GET creat") \ 122 EM(fscache_volume_get_hash_collision, "GET hcoll") \ 123 EM(fscache_volume_free, "FREE ") \ 124 EM(fscache_volume_new_acquire, "NEW acq ") \ 125 EM(fscache_volume_put_cookie, "PUT cook ") \ 126 EM(fscache_volume_put_create_work, "PUT creat") \ 127 EM(fscache_volume_put_hash_collision, "PUT hcoll") \ 128 EM(fscache_volume_put_relinquish, "PUT relnq") \ 129 EM(fscache_volume_see_create_work, "SEE creat") \ 130 EM(fscache_volume_see_hash_wake, "SEE hwake") \ 131 E_(fscache_volume_wait_create_work, "WAIT crea") 132 133 #define fscache_cookie_traces \ 134 EM(fscache_cookie_collision, "*COLLIDE*") \ 135 EM(fscache_cookie_discard, "DISCARD ") \ 136 EM(fscache_cookie_failed, "FAILED ") \ 137 EM(fscache_cookie_get_attach_object, "GET attch") \ 138 EM(fscache_cookie_get_hash_collision, "GET hcoll") \ 139 EM(fscache_cookie_get_end_access, "GQ endac") \ 140 EM(fscache_cookie_get_inval_work, "GQ inval") \ 141 EM(fscache_cookie_get_lru, "GET lru ") \ 142 EM(fscache_cookie_get_use_work, "GQ use ") \ 143 EM(fscache_cookie_new_acquire, "NEW acq ") \ 144 EM(fscache_cookie_put_hash_collision, "PUT hcoll") \ 145 EM(fscache_cookie_put_lru, "PUT lru ") \ 146 EM(fscache_cookie_put_object, "PUT obj ") \ 147 EM(fscache_cookie_put_over_queued, "PQ overq") \ 148 EM(fscache_cookie_put_relinquish, "PUT relnq") \ 149 EM(fscache_cookie_put_withdrawn, "PUT wthdn") \ 150 EM(fscache_cookie_put_work, "PQ work ") \ 151 EM(fscache_cookie_see_active, "- activ") \ 152 EM(fscache_cookie_see_lru_discard, "- x-lru") \ 153 EM(fscache_cookie_see_lru_discard_clear,"- lrudc") \ 154 EM(fscache_cookie_see_lru_do_one, "- lrudo") \ 155 EM(fscache_cookie_see_relinquish, "- x-rlq") \ 156 EM(fscache_cookie_see_withdraw, "- x-wth") \ 157 E_(fscache_cookie_see_work, "- work ") 158 159 #define fscache_active_traces \ 160 EM(fscache_active_use, "USE ") \ 161 EM(fscache_active_use_modify, "USE-m ") \ 162 E_(fscache_active_unuse, "UNUSE ") 163 164 #define fscache_access_traces \ 165 EM(fscache_access_acquire_volume, "BEGIN acq_vol") \ 166 EM(fscache_access_acquire_volume_end, "END acq_vol") \ 167 EM(fscache_access_cache_pin, "PIN cache ") \ 168 EM(fscache_access_cache_unpin, "UNPIN cache ") \ 169 EM(fscache_access_invalidate_cookie, "BEGIN inval ") \ 170 EM(fscache_access_invalidate_cookie_end,"END inval ") \ 171 EM(fscache_access_io_end, "END io ") \ 172 EM(fscache_access_io_not_live, "END io_notl") \ 173 EM(fscache_access_io_read, "BEGIN io_read") \ 174 EM(fscache_access_io_resize, "BEGIN io_resz") \ 175 EM(fscache_access_io_wait, "WAIT io ") \ 176 EM(fscache_access_io_write, "BEGIN io_writ") \ 177 EM(fscache_access_lookup_cookie, "BEGIN lookup ") \ 178 EM(fscache_access_lookup_cookie_end, "END lookup ") \ 179 EM(fscache_access_lookup_cookie_end_failed,"END lookupf") \ 180 EM(fscache_access_relinquish_volume, "BEGIN rlq_vol") \ 181 EM(fscache_access_relinquish_volume_end,"END rlq_vol") \ 182 E_(fscache_access_unlive, "END unlive ") 183 184 /* 185 * Export enum symbols via userspace. 186 */ 187 #undef EM 188 #undef E_ 189 #define EM(a, b) TRACE_DEFINE_ENUM(a); 190 #define E_(a, b) TRACE_DEFINE_ENUM(a); 191 192 fscache_cache_traces; 193 fscache_volume_traces; 194 fscache_cookie_traces; 195 fscache_access_traces; 196 197 /* 198 * Now redefine the EM() and E_() macros to map the enums to the strings that 199 * will be printed in the output. 200 */ 201 #undef EM 202 #undef E_ 203 #define EM(a, b) { a, b }, 204 #define E_(a, b) { a, b } 205 206 207 TRACE_EVENT(fscache_cache, 208 TP_PROTO(unsigned int cache_debug_id, 209 int usage, 210 enum fscache_cache_trace where), 211 212 TP_ARGS(cache_debug_id, usage, where), 213 214 TP_STRUCT__entry( 215 __field(unsigned int, cache ) 216 __field(int, usage ) 217 __field(enum fscache_cache_trace, where ) 218 ), 219 220 TP_fast_assign( 221 __entry->cache = cache_debug_id; 222 __entry->usage = usage; 223 __entry->where = where; 224 ), 225 226 TP_printk("C=%08x %s r=%d", 227 __entry->cache, 228 __print_symbolic(__entry->where, fscache_cache_traces), 229 __entry->usage) 230 ); 231 232 TRACE_EVENT(fscache_volume, 233 TP_PROTO(unsigned int volume_debug_id, 234 int usage, 235 enum fscache_volume_trace where), 236 237 TP_ARGS(volume_debug_id, usage, where), 238 239 TP_STRUCT__entry( 240 __field(unsigned int, volume ) 241 __field(int, usage ) 242 __field(enum fscache_volume_trace, where ) 243 ), 244 245 TP_fast_assign( 246 __entry->volume = volume_debug_id; 247 __entry->usage = usage; 248 __entry->where = where; 249 ), 250 251 TP_printk("V=%08x %s u=%d", 252 __entry->volume, 253 __print_symbolic(__entry->where, fscache_volume_traces), 254 __entry->usage) 255 ); 256 257 TRACE_EVENT(fscache_cookie, 258 TP_PROTO(unsigned int cookie_debug_id, 259 int ref, 260 enum fscache_cookie_trace where), 261 262 TP_ARGS(cookie_debug_id, ref, where), 263 264 TP_STRUCT__entry( 265 __field(unsigned int, cookie ) 266 __field(int, ref ) 267 __field(enum fscache_cookie_trace, where ) 268 ), 269 270 TP_fast_assign( 271 __entry->cookie = cookie_debug_id; 272 __entry->ref = ref; 273 __entry->where = where; 274 ), 275 276 TP_printk("c=%08x %s r=%d", 277 __entry->cookie, 278 __print_symbolic(__entry->where, fscache_cookie_traces), 279 __entry->ref) 280 ); 281 282 TRACE_EVENT(fscache_active, 283 TP_PROTO(unsigned int cookie_debug_id, 284 int ref, 285 int n_active, 286 int n_accesses, 287 enum fscache_active_trace why), 288 289 TP_ARGS(cookie_debug_id, ref, n_active, n_accesses, why), 290 291 TP_STRUCT__entry( 292 __field(unsigned int, cookie ) 293 __field(int, ref ) 294 __field(int, n_active ) 295 __field(int, n_accesses ) 296 __field(enum fscache_active_trace, why ) 297 ), 298 299 TP_fast_assign( 300 __entry->cookie = cookie_debug_id; 301 __entry->ref = ref; 302 __entry->n_active = n_active; 303 __entry->n_accesses = n_accesses; 304 __entry->why = why; 305 ), 306 307 TP_printk("c=%08x %s r=%d a=%d c=%d", 308 __entry->cookie, 309 __print_symbolic(__entry->why, fscache_active_traces), 310 __entry->ref, 311 __entry->n_accesses, 312 __entry->n_active) 313 ); 314 315 TRACE_EVENT(fscache_access_cache, 316 TP_PROTO(unsigned int cache_debug_id, 317 int ref, 318 int n_accesses, 319 enum fscache_access_trace why), 320 321 TP_ARGS(cache_debug_id, ref, n_accesses, why), 322 323 TP_STRUCT__entry( 324 __field(unsigned int, cache ) 325 __field(int, ref ) 326 __field(int, n_accesses ) 327 __field(enum fscache_access_trace, why ) 328 ), 329 330 TP_fast_assign( 331 __entry->cache = cache_debug_id; 332 __entry->ref = ref; 333 __entry->n_accesses = n_accesses; 334 __entry->why = why; 335 ), 336 337 TP_printk("C=%08x %s r=%d a=%d", 338 __entry->cache, 339 __print_symbolic(__entry->why, fscache_access_traces), 340 __entry->ref, 341 __entry->n_accesses) 342 ); 343 344 TRACE_EVENT(fscache_access_volume, 345 TP_PROTO(unsigned int volume_debug_id, 346 unsigned int cookie_debug_id, 347 int ref, 348 int n_accesses, 349 enum fscache_access_trace why), 350 351 TP_ARGS(volume_debug_id, cookie_debug_id, ref, n_accesses, why), 352 353 TP_STRUCT__entry( 354 __field(unsigned int, volume ) 355 __field(unsigned int, cookie ) 356 __field(int, ref ) 357 __field(int, n_accesses ) 358 __field(enum fscache_access_trace, why ) 359 ), 360 361 TP_fast_assign( 362 __entry->volume = volume_debug_id; 363 __entry->cookie = cookie_debug_id; 364 __entry->ref = ref; 365 __entry->n_accesses = n_accesses; 366 __entry->why = why; 367 ), 368 369 TP_printk("V=%08x c=%08x %s r=%d a=%d", 370 __entry->volume, 371 __entry->cookie, 372 __print_symbolic(__entry->why, fscache_access_traces), 373 __entry->ref, 374 __entry->n_accesses) 375 ); 376 377 TRACE_EVENT(fscache_access, 378 TP_PROTO(unsigned int cookie_debug_id, 379 int ref, 380 int n_accesses, 381 enum fscache_access_trace why), 382 383 TP_ARGS(cookie_debug_id, ref, n_accesses, why), 384 385 TP_STRUCT__entry( 386 __field(unsigned int, cookie ) 387 __field(int, ref ) 388 __field(int, n_accesses ) 389 __field(enum fscache_access_trace, why ) 390 ), 391 392 TP_fast_assign( 393 __entry->cookie = cookie_debug_id; 394 __entry->ref = ref; 395 __entry->n_accesses = n_accesses; 396 __entry->why = why; 397 ), 398 399 TP_printk("c=%08x %s r=%d a=%d", 400 __entry->cookie, 401 __print_symbolic(__entry->why, fscache_access_traces), 402 __entry->ref, 403 __entry->n_accesses) 404 ); 405 406 TRACE_EVENT(fscache_acquire, 407 TP_PROTO(struct fscache_cookie *cookie), 408 409 TP_ARGS(cookie), 410 411 TP_STRUCT__entry( 412 __field(unsigned int, cookie ) 413 __field(unsigned int, volume ) 414 __field(int, v_ref ) 415 __field(int, v_n_cookies ) 416 ), 417 418 TP_fast_assign( 419 __entry->cookie = cookie->debug_id; 420 __entry->volume = cookie->volume->debug_id; 421 __entry->v_ref = refcount_read(&cookie->volume->ref); 422 __entry->v_n_cookies = atomic_read(&cookie->volume->n_cookies); 423 ), 424 425 TP_printk("c=%08x V=%08x vr=%d vc=%d", 426 __entry->cookie, 427 __entry->volume, __entry->v_ref, __entry->v_n_cookies) 428 ); 429 430 TRACE_EVENT(fscache_relinquish, 431 TP_PROTO(struct fscache_cookie *cookie, bool retire), 432 433 TP_ARGS(cookie, retire), 434 435 TP_STRUCT__entry( 436 __field(unsigned int, cookie ) 437 __field(unsigned int, volume ) 438 __field(int, ref ) 439 __field(int, n_active ) 440 __field(u8, flags ) 441 __field(bool, retire ) 442 ), 443 444 TP_fast_assign( 445 __entry->cookie = cookie->debug_id; 446 __entry->volume = cookie->volume->debug_id; 447 __entry->ref = refcount_read(&cookie->ref); 448 __entry->n_active = atomic_read(&cookie->n_active); 449 __entry->flags = cookie->flags; 450 __entry->retire = retire; 451 ), 452 453 TP_printk("c=%08x V=%08x r=%d U=%d f=%02x rt=%u", 454 __entry->cookie, __entry->volume, __entry->ref, 455 __entry->n_active, __entry->flags, __entry->retire) 456 ); 457 458 TRACE_EVENT(fscache_invalidate, 459 TP_PROTO(struct fscache_cookie *cookie, loff_t new_size), 460 461 TP_ARGS(cookie, new_size), 462 463 TP_STRUCT__entry( 464 __field(unsigned int, cookie ) 465 __field(loff_t, new_size ) 466 ), 467 468 TP_fast_assign( 469 __entry->cookie = cookie->debug_id; 470 __entry->new_size = new_size; 471 ), 472 473 TP_printk("c=%08x sz=%llx", 474 __entry->cookie, __entry->new_size) 475 ); 476 477 TRACE_EVENT(fscache_resize, 478 TP_PROTO(struct fscache_cookie *cookie, loff_t new_size), 479 480 TP_ARGS(cookie, new_size), 481 482 TP_STRUCT__entry( 483 __field(unsigned int, cookie ) 484 __field(loff_t, old_size ) 485 __field(loff_t, new_size ) 486 ), 487 488 TP_fast_assign( 489 __entry->cookie = cookie->debug_id; 490 __entry->old_size = cookie->object_size; 491 __entry->new_size = new_size; 492 ), 493 494 TP_printk("c=%08x os=%08llx sz=%08llx", 495 __entry->cookie, 496 __entry->old_size, 497 __entry->new_size) 498 ); 499 500 #endif /* _TRACE_FSCACHE_H */ 501 502 /* This part must be outside protection */ 503 #include <trace/define_trace.h> 504