1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/* CacheFiles tracepoints
3 *
4 * Copyright (C) 2016 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_put_wait_retry = fscache_obj_ref__nr_traces,
23	cachefiles_obj_put_wait_timeo,
24	cachefiles_obj_ref__nr_traces
25};
26
27#endif
28
29/*
30 * Define enum -> string mappings for display.
31 */
32#define cachefiles_obj_kill_traces				\
33	EM(FSCACHE_OBJECT_IS_STALE,	"stale")		\
34	EM(FSCACHE_OBJECT_NO_SPACE,	"no_space")		\
35	EM(FSCACHE_OBJECT_WAS_RETIRED,	"was_retired")		\
36	E_(FSCACHE_OBJECT_WAS_CULLED,	"was_culled")
37
38#define cachefiles_obj_ref_traces					\
39	EM(fscache_obj_get_add_to_deps,		"GET add_to_deps")	\
40	EM(fscache_obj_get_queue,		"GET queue")		\
41	EM(fscache_obj_put_alloc_fail,		"PUT alloc_fail")	\
42	EM(fscache_obj_put_attach_fail,		"PUT attach_fail")	\
43	EM(fscache_obj_put_drop_obj,		"PUT drop_obj")		\
44	EM(fscache_obj_put_enq_dep,		"PUT enq_dep")		\
45	EM(fscache_obj_put_queue,		"PUT queue")		\
46	EM(fscache_obj_put_work,		"PUT work")		\
47	EM(cachefiles_obj_put_wait_retry,	"PUT wait_retry")	\
48	E_(cachefiles_obj_put_wait_timeo,	"PUT wait_timeo")
49
50/*
51 * Export enum symbols via userspace.
52 */
53#undef EM
54#undef E_
55#define EM(a, b) TRACE_DEFINE_ENUM(a);
56#define E_(a, b) TRACE_DEFINE_ENUM(a);
57
58cachefiles_obj_kill_traces;
59cachefiles_obj_ref_traces;
60
61/*
62 * Now redefine the EM() and E_() macros to map the enums to the strings that
63 * will be printed in the output.
64 */
65#undef EM
66#undef E_
67#define EM(a, b)	{ a, b },
68#define E_(a, b)	{ a, b }
69
70
71TRACE_EVENT(cachefiles_ref,
72	    TP_PROTO(struct cachefiles_object *obj,
73		     struct fscache_cookie *cookie,
74		     enum cachefiles_obj_ref_trace why,
75		     int usage),
76
77	    TP_ARGS(obj, cookie, why, usage),
78
79	    /* Note that obj may be NULL */
80	    TP_STRUCT__entry(
81		    __field(struct cachefiles_object *,		obj		)
82		    __field(struct fscache_cookie *,		cookie		)
83		    __field(enum cachefiles_obj_ref_trace,	why		)
84		    __field(int,				usage		)
85			     ),
86
87	    TP_fast_assign(
88		    __entry->obj	= obj;
89		    __entry->cookie	= cookie;
90		    __entry->usage	= usage;
91		    __entry->why	= why;
92			   ),
93
94	    TP_printk("c=%p o=%p u=%d %s",
95		      __entry->cookie, __entry->obj, __entry->usage,
96		      __print_symbolic(__entry->why, cachefiles_obj_ref_traces))
97	    );
98
99TRACE_EVENT(cachefiles_lookup,
100	    TP_PROTO(struct cachefiles_object *obj,
101		     struct dentry *de,
102		     struct inode *inode),
103
104	    TP_ARGS(obj, de, inode),
105
106	    TP_STRUCT__entry(
107		    __field(struct cachefiles_object *,	obj	)
108		    __field(struct dentry *,		de	)
109		    __field(struct inode *,		inode	)
110			     ),
111
112	    TP_fast_assign(
113		    __entry->obj	= obj;
114		    __entry->de		= de;
115		    __entry->inode	= inode;
116			   ),
117
118	    TP_printk("o=%p d=%p i=%p",
119		      __entry->obj, __entry->de, __entry->inode)
120	    );
121
122TRACE_EVENT(cachefiles_mkdir,
123	    TP_PROTO(struct cachefiles_object *obj,
124		     struct dentry *de, int ret),
125
126	    TP_ARGS(obj, de, ret),
127
128	    TP_STRUCT__entry(
129		    __field(struct cachefiles_object *,	obj	)
130		    __field(struct dentry *,		de	)
131		    __field(int,			ret	)
132			     ),
133
134	    TP_fast_assign(
135		    __entry->obj	= obj;
136		    __entry->de		= de;
137		    __entry->ret	= ret;
138			   ),
139
140	    TP_printk("o=%p d=%p r=%u",
141		      __entry->obj, __entry->de, __entry->ret)
142	    );
143
144TRACE_EVENT(cachefiles_create,
145	    TP_PROTO(struct cachefiles_object *obj,
146		     struct dentry *de, int ret),
147
148	    TP_ARGS(obj, de, ret),
149
150	    TP_STRUCT__entry(
151		    __field(struct cachefiles_object *,	obj	)
152		    __field(struct dentry *,		de	)
153		    __field(int,			ret	)
154			     ),
155
156	    TP_fast_assign(
157		    __entry->obj	= obj;
158		    __entry->de		= de;
159		    __entry->ret	= ret;
160			   ),
161
162	    TP_printk("o=%p d=%p r=%u",
163		      __entry->obj, __entry->de, __entry->ret)
164	    );
165
166TRACE_EVENT(cachefiles_unlink,
167	    TP_PROTO(struct cachefiles_object *obj,
168		     struct dentry *de,
169		     enum fscache_why_object_killed why),
170
171	    TP_ARGS(obj, de, why),
172
173	    /* Note that obj may be NULL */
174	    TP_STRUCT__entry(
175		    __field(struct cachefiles_object *,	obj		)
176		    __field(struct dentry *,		de		)
177		    __field(enum fscache_why_object_killed, why		)
178			     ),
179
180	    TP_fast_assign(
181		    __entry->obj	= obj;
182		    __entry->de		= de;
183		    __entry->why	= why;
184			   ),
185
186	    TP_printk("o=%p d=%p w=%s",
187		      __entry->obj, __entry->de,
188		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
189	    );
190
191TRACE_EVENT(cachefiles_rename,
192	    TP_PROTO(struct cachefiles_object *obj,
193		     struct dentry *de,
194		     struct dentry *to,
195		     enum fscache_why_object_killed why),
196
197	    TP_ARGS(obj, de, to, why),
198
199	    /* Note that obj may be NULL */
200	    TP_STRUCT__entry(
201		    __field(struct cachefiles_object *,	obj		)
202		    __field(struct dentry *,		de		)
203		    __field(struct dentry *,		to		)
204		    __field(enum fscache_why_object_killed, why		)
205			     ),
206
207	    TP_fast_assign(
208		    __entry->obj	= obj;
209		    __entry->de		= de;
210		    __entry->to		= to;
211		    __entry->why	= why;
212			   ),
213
214	    TP_printk("o=%p d=%p t=%p w=%s",
215		      __entry->obj, __entry->de, __entry->to,
216		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
217	    );
218
219TRACE_EVENT(cachefiles_mark_active,
220	    TP_PROTO(struct cachefiles_object *obj,
221		     struct dentry *de),
222
223	    TP_ARGS(obj, de),
224
225	    /* Note that obj may be NULL */
226	    TP_STRUCT__entry(
227		    __field(struct cachefiles_object *,	obj		)
228		    __field(struct dentry *,		de		)
229			     ),
230
231	    TP_fast_assign(
232		    __entry->obj	= obj;
233		    __entry->de		= de;
234			   ),
235
236	    TP_printk("o=%p d=%p",
237		      __entry->obj, __entry->de)
238	    );
239
240TRACE_EVENT(cachefiles_wait_active,
241	    TP_PROTO(struct cachefiles_object *obj,
242		     struct dentry *de,
243		     struct cachefiles_object *xobj),
244
245	    TP_ARGS(obj, de, xobj),
246
247	    /* Note that obj may be NULL */
248	    TP_STRUCT__entry(
249		    __field(struct cachefiles_object *,	obj		)
250		    __field(struct dentry *,		de		)
251		    __field(struct cachefiles_object *,	xobj		)
252		    __field(u16,			flags		)
253		    __field(u16,			fsc_flags	)
254			     ),
255
256	    TP_fast_assign(
257		    __entry->obj	= obj;
258		    __entry->de		= de;
259		    __entry->xobj	= xobj;
260		    __entry->flags	= xobj->flags;
261		    __entry->fsc_flags	= xobj->fscache.flags;
262			   ),
263
264	    TP_printk("o=%p d=%p wo=%p wf=%x wff=%x",
265		      __entry->obj, __entry->de, __entry->xobj,
266		      __entry->flags, __entry->fsc_flags)
267	    );
268
269TRACE_EVENT(cachefiles_mark_inactive,
270	    TP_PROTO(struct cachefiles_object *obj,
271		     struct dentry *de,
272		     struct inode *inode),
273
274	    TP_ARGS(obj, de, inode),
275
276	    /* Note that obj may be NULL */
277	    TP_STRUCT__entry(
278		    __field(struct cachefiles_object *,	obj		)
279		    __field(struct dentry *,		de		)
280		    __field(struct inode *,		inode		)
281			     ),
282
283	    TP_fast_assign(
284		    __entry->obj	= obj;
285		    __entry->de		= de;
286		    __entry->inode	= inode;
287			   ),
288
289	    TP_printk("o=%p d=%p i=%p",
290		      __entry->obj, __entry->de, __entry->inode)
291	    );
292
293TRACE_EVENT(cachefiles_mark_buried,
294	    TP_PROTO(struct cachefiles_object *obj,
295		     struct dentry *de,
296		     enum fscache_why_object_killed why),
297
298	    TP_ARGS(obj, de, why),
299
300	    /* Note that obj may be NULL */
301	    TP_STRUCT__entry(
302		    __field(struct cachefiles_object *,	obj		)
303		    __field(struct dentry *,		de		)
304		    __field(enum fscache_why_object_killed, why		)
305			     ),
306
307	    TP_fast_assign(
308		    __entry->obj	= obj;
309		    __entry->de		= de;
310		    __entry->why	= why;
311			   ),
312
313	    TP_printk("o=%p d=%p w=%s",
314		      __entry->obj, __entry->de,
315		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
316	    );
317
318#endif /* _TRACE_CACHEFILES_H */
319
320/* This part must be outside protection */
321#include <trace/define_trace.h>
322