1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* FS-Cache tracepoints
4 * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
8 #define TRACE_SYSTEM fscache
10 #if !defined(_TRACE_FSCACHE_H) || defined(TRACE_HEADER_MULTI_READ)
11 #define _TRACE_FSCACHE_H
13 #include <linux/fscache.h>
14 #include <linux/tracepoint.h>
17 * Define enums for tracing information.
19 #ifndef __FSCACHE_DECLARE_TRACE_ENUMS_ONCE_ONLY
20 #define __FSCACHE_DECLARE_TRACE_ENUMS_ONCE_ONLY
22 enum fscache_cookie_trace {
23 fscache_cookie_collision,
24 fscache_cookie_discard,
25 fscache_cookie_get_acquire_parent,
26 fscache_cookie_get_attach_object,
27 fscache_cookie_get_reacquire,
28 fscache_cookie_get_register_netfs,
29 fscache_cookie_put_acquire_nobufs,
30 fscache_cookie_put_dup_netfs,
31 fscache_cookie_put_relinquish,
32 fscache_cookie_put_object,
33 fscache_cookie_put_parent,
36 enum fscache_page_trace {
39 fscache_page_maybe_release,
40 fscache_page_radix_clear_store,
41 fscache_page_radix_delete,
42 fscache_page_radix_insert,
43 fscache_page_radix_pend2store,
44 fscache_page_radix_set_pend,
47 fscache_page_write_end,
48 fscache_page_write_end_pend,
49 fscache_page_write_end_noc,
50 fscache_page_write_wait,
51 fscache_page_trace__nr
54 enum fscache_op_trace {
56 fscache_op_cancel_all,
59 fscache_op_enqueue_async,
60 fscache_op_enqueue_mythread,
72 enum fscache_page_op_trace {
73 fscache_page_op_alloc_one,
74 fscache_page_op_attr_changed,
75 fscache_page_op_check_consistency,
76 fscache_page_op_invalidate,
77 fscache_page_op_retr_multi,
78 fscache_page_op_retr_one,
79 fscache_page_op_write_one,
80 fscache_page_op_trace__nr
86 * Declare tracing information enums and their string mappings for display.
88 #define fscache_cookie_traces \
89 EM(fscache_cookie_collision, "*COLLISION*") \
90 EM(fscache_cookie_discard, "DISCARD") \
91 EM(fscache_cookie_get_acquire_parent, "GET prn") \
92 EM(fscache_cookie_get_attach_object, "GET obj") \
93 EM(fscache_cookie_get_reacquire, "GET raq") \
94 EM(fscache_cookie_get_register_netfs, "GET net") \
95 EM(fscache_cookie_put_acquire_nobufs, "PUT nbf") \
96 EM(fscache_cookie_put_dup_netfs, "PUT dnt") \
97 EM(fscache_cookie_put_relinquish, "PUT rlq") \
98 EM(fscache_cookie_put_object, "PUT obj") \
99 E_(fscache_cookie_put_parent, "PUT prn")
101 #define fscache_page_traces \
102 EM(fscache_page_cached, "Cached ") \
103 EM(fscache_page_inval, "InvalPg") \
104 EM(fscache_page_maybe_release, "MayRels") \
105 EM(fscache_page_uncache, "Uncache") \
106 EM(fscache_page_radix_clear_store, "RxCStr ") \
107 EM(fscache_page_radix_delete, "RxDel ") \
108 EM(fscache_page_radix_insert, "RxIns ") \
109 EM(fscache_page_radix_pend2store, "RxP2S ") \
110 EM(fscache_page_radix_set_pend, "RxSPend ") \
111 EM(fscache_page_write, "WritePg") \
112 EM(fscache_page_write_end, "EndPgWr") \
113 EM(fscache_page_write_end_pend, "EndPgWP") \
114 EM(fscache_page_write_end_noc, "EndPgNC") \
115 E_(fscache_page_write_wait, "WtOnWrt")
117 #define fscache_op_traces \
118 EM(fscache_op_cancel, "Cancel1") \
119 EM(fscache_op_cancel_all, "CancelA") \
120 EM(fscache_op_cancelled, "Canclld") \
121 EM(fscache_op_completed, "Complet") \
122 EM(fscache_op_enqueue_async, "EnqAsyn") \
123 EM(fscache_op_enqueue_mythread, "EnqMyTh") \
124 EM(fscache_op_gc, "GC ") \
125 EM(fscache_op_init, "Init ") \
126 EM(fscache_op_put, "Put ") \
127 EM(fscache_op_run, "Run ") \
128 EM(fscache_op_signal, "Signal ") \
129 EM(fscache_op_submit, "Submit ") \
130 EM(fscache_op_submit_ex, "SubmitX") \
131 E_(fscache_op_work, "Work ")
133 #define fscache_page_op_traces \
134 EM(fscache_page_op_alloc_one, "Alloc1 ") \
135 EM(fscache_page_op_attr_changed, "AttrChg") \
136 EM(fscache_page_op_check_consistency, "CheckCn") \
137 EM(fscache_page_op_invalidate, "Inval ") \
138 EM(fscache_page_op_retr_multi, "RetrMul") \
139 EM(fscache_page_op_retr_one, "Retr1 ") \
140 E_(fscache_page_op_write_one, "Write1 ")
143 * Export enum symbols via userspace.
147 #define EM(a, b) TRACE_DEFINE_ENUM(a);
148 #define E_(a, b) TRACE_DEFINE_ENUM(a);
150 fscache_cookie_traces;
153 * Now redefine the EM() and E_() macros to map the enums to the strings that
154 * will be printed in the output.
158 #define EM(a, b) { a, b },
159 #define E_(a, b) { a, b }
162 TRACE_EVENT(fscache_cookie,
163 TP_PROTO(unsigned int cookie_debug_id,
165 enum fscache_cookie_trace where),
167 TP_ARGS(cookie_debug_id, ref, where),
170 __field(unsigned int, cookie )
171 __field(enum fscache_cookie_trace, where )
176 __entry->cookie = cookie_debug_id;
177 __entry->where = where;
181 TP_printk("%s c=%08x r=%d",
182 __print_symbolic(__entry->where, fscache_cookie_traces),
183 __entry->cookie, __entry->ref)
186 TRACE_EVENT(fscache_netfs,
187 TP_PROTO(struct fscache_netfs *netfs),
192 __field(unsigned int, cookie )
193 __array(char, name, 8 )
197 __entry->cookie = netfs->primary_index->debug_id;
198 strncpy(__entry->name, netfs->name, 8);
199 __entry->name[7] = 0;
202 TP_printk("c=%08x n=%s",
203 __entry->cookie, __entry->name)
206 TRACE_EVENT(fscache_acquire,
207 TP_PROTO(struct fscache_cookie *cookie),
212 __field(unsigned int, cookie )
213 __field(unsigned int, parent )
214 __array(char, name, 8 )
216 __field(int, p_n_children )
217 __field(u8, p_flags )
221 __entry->cookie = cookie->debug_id;
222 __entry->parent = cookie->parent->debug_id;
223 __entry->p_ref = refcount_read(&cookie->parent->ref);
224 __entry->p_n_children = atomic_read(&cookie->parent->n_children);
225 __entry->p_flags = cookie->parent->flags;
226 memcpy(__entry->name, cookie->def->name, 8);
227 __entry->name[7] = 0;
230 TP_printk("c=%08x p=%08x pr=%d pc=%d pf=%02x n=%s",
231 __entry->cookie, __entry->parent, __entry->p_ref,
232 __entry->p_n_children, __entry->p_flags, __entry->name)
235 TRACE_EVENT(fscache_relinquish,
236 TP_PROTO(struct fscache_cookie *cookie, bool retire),
238 TP_ARGS(cookie, retire),
241 __field(unsigned int, cookie )
242 __field(unsigned int, parent )
244 __field(int, n_children )
245 __field(int, n_active )
247 __field(bool, retire )
251 __entry->cookie = cookie->debug_id;
252 __entry->parent = cookie->parent->debug_id;
253 __entry->ref = refcount_read(&cookie->ref);
254 __entry->n_children = atomic_read(&cookie->n_children);
255 __entry->n_active = atomic_read(&cookie->n_active);
256 __entry->flags = cookie->flags;
257 __entry->retire = retire;
260 TP_printk("c=%08x r=%d p=%08x Nc=%d Na=%d f=%02x r=%u",
261 __entry->cookie, __entry->ref,
262 __entry->parent, __entry->n_children, __entry->n_active,
263 __entry->flags, __entry->retire)
266 TRACE_EVENT(fscache_enable,
267 TP_PROTO(struct fscache_cookie *cookie),
272 __field(unsigned int, cookie )
274 __field(int, n_children )
275 __field(int, n_active )
280 __entry->cookie = cookie->debug_id;
281 __entry->ref = refcount_read(&cookie->ref);
282 __entry->n_children = atomic_read(&cookie->n_children);
283 __entry->n_active = atomic_read(&cookie->n_active);
284 __entry->flags = cookie->flags;
287 TP_printk("c=%08x r=%d Nc=%d Na=%d f=%02x",
288 __entry->cookie, __entry->ref,
289 __entry->n_children, __entry->n_active, __entry->flags)
292 TRACE_EVENT(fscache_disable,
293 TP_PROTO(struct fscache_cookie *cookie),
298 __field(unsigned int, cookie )
300 __field(int, n_children )
301 __field(int, n_active )
306 __entry->cookie = cookie->debug_id;
307 __entry->ref = refcount_read(&cookie->ref);
308 __entry->n_children = atomic_read(&cookie->n_children);
309 __entry->n_active = atomic_read(&cookie->n_active);
310 __entry->flags = cookie->flags;
313 TP_printk("c=%08x r=%d Nc=%d Na=%d f=%02x",
314 __entry->cookie, __entry->ref,
315 __entry->n_children, __entry->n_active, __entry->flags)
318 TRACE_EVENT(fscache_osm,
319 TP_PROTO(struct fscache_object *object,
320 const struct fscache_state *state,
321 bool wait, bool oob, s8 event_num),
323 TP_ARGS(object, state, wait, oob, event_num),
326 __field(unsigned int, cookie )
327 __field(unsigned int, object )
328 __array(char, state, 8 )
331 __field(s8, event_num )
335 __entry->cookie = object->cookie->debug_id;
336 __entry->object = object->debug_id;
337 __entry->wait = wait;
339 __entry->event_num = event_num;
340 memcpy(__entry->state, state->short_name, 8);
343 TP_printk("c=%08x o=%08d %s %s%sev=%d",
347 __print_symbolic(__entry->wait,
350 __print_symbolic(__entry->oob,
356 TRACE_EVENT(fscache_page,
357 TP_PROTO(struct fscache_cookie *cookie, struct page *page,
358 enum fscache_page_trace why),
360 TP_ARGS(cookie, page, why),
363 __field(unsigned int, cookie )
364 __field(pgoff_t, page )
365 __field(enum fscache_page_trace, why )
369 __entry->cookie = cookie->debug_id;
370 __entry->page = page->index;
374 TP_printk("c=%08x %s pg=%lx",
376 __print_symbolic(__entry->why, fscache_page_traces),
380 TRACE_EVENT(fscache_check_page,
381 TP_PROTO(struct fscache_cookie *cookie, struct page *page,
384 TP_ARGS(cookie, page, val, n),
387 __field(unsigned int, cookie )
388 __field(void *, page )
389 __field(void *, val )
394 __entry->cookie = cookie->debug_id;
395 __entry->page = page;
400 TP_printk("c=%08x pg=%p val=%p n=%d",
401 __entry->cookie, __entry->page, __entry->val, __entry->n)
404 TRACE_EVENT(fscache_wake_cookie,
405 TP_PROTO(struct fscache_cookie *cookie),
410 __field(unsigned int, cookie )
414 __entry->cookie = cookie->debug_id;
417 TP_printk("c=%08x", __entry->cookie)
420 TRACE_EVENT(fscache_op,
421 TP_PROTO(struct fscache_cookie *cookie, struct fscache_operation *op,
422 enum fscache_op_trace why),
424 TP_ARGS(cookie, op, why),
427 __field(unsigned int, cookie )
428 __field(unsigned int, op )
429 __field(enum fscache_op_trace, why )
433 __entry->cookie = cookie ? cookie->debug_id : 0;
434 __entry->op = op->debug_id;
438 TP_printk("c=%08x op=%08x %s",
439 __entry->cookie, __entry->op,
440 __print_symbolic(__entry->why, fscache_op_traces))
443 TRACE_EVENT(fscache_page_op,
444 TP_PROTO(struct fscache_cookie *cookie, struct page *page,
445 struct fscache_operation *op, enum fscache_page_op_trace what),
447 TP_ARGS(cookie, page, op, what),
450 __field(unsigned int, cookie )
451 __field(unsigned int, op )
452 __field(pgoff_t, page )
453 __field(enum fscache_page_op_trace, what )
457 __entry->cookie = cookie->debug_id;
458 __entry->page = page ? page->index : 0;
459 __entry->op = op->debug_id;
460 __entry->what = what;
463 TP_printk("c=%08x %s pg=%lx op=%08x",
465 __print_symbolic(__entry->what, fscache_page_op_traces),
466 __entry->page, __entry->op)
469 TRACE_EVENT(fscache_wrote_page,
470 TP_PROTO(struct fscache_cookie *cookie, struct page *page,
471 struct fscache_operation *op, int ret),
473 TP_ARGS(cookie, page, op, ret),
476 __field(unsigned int, cookie )
477 __field(unsigned int, op )
478 __field(pgoff_t, page )
483 __entry->cookie = cookie->debug_id;
484 __entry->page = page->index;
485 __entry->op = op->debug_id;
489 TP_printk("c=%08x pg=%lx op=%08x ret=%d",
490 __entry->cookie, __entry->page, __entry->op, __entry->ret)
493 TRACE_EVENT(fscache_gang_lookup,
494 TP_PROTO(struct fscache_cookie *cookie, struct fscache_operation *op,
495 void **results, int n, pgoff_t store_limit),
497 TP_ARGS(cookie, op, results, n, store_limit),
500 __field(unsigned int, cookie )
501 __field(unsigned int, op )
502 __field(pgoff_t, results0 )
504 __field(pgoff_t, store_limit )
508 __entry->cookie = cookie->debug_id;
509 __entry->op = op->debug_id;
510 __entry->results0 = results[0] ? ((struct page *)results[0])->index : (pgoff_t)-1;
512 __entry->store_limit = store_limit;
515 TP_printk("c=%08x op=%08x r0=%lx n=%d sl=%lx",
516 __entry->cookie, __entry->op, __entry->results0, __entry->n,
517 __entry->store_limit)
520 #endif /* _TRACE_FSCACHE_H */
522 /* This part must be outside protection */
523 #include <trace/define_trace.h>