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 
21 enum 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 
58 cachefiles_obj_kill_traces;
59 cachefiles_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 
71 TRACE_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(unsigned int,			obj		)
82 		    __field(unsigned int,			cookie		)
83 		    __field(enum cachefiles_obj_ref_trace,	why		)
84 		    __field(int,				usage		)
85 			     ),
86 
87 	    TP_fast_assign(
88 		    __entry->obj	= obj->fscache.debug_id;
89 		    __entry->cookie	= cookie->debug_id;
90 		    __entry->usage	= usage;
91 		    __entry->why	= why;
92 			   ),
93 
94 	    TP_printk("c=%08x o=%08x u=%d %s",
95 		      __entry->cookie, __entry->obj, __entry->usage,
96 		      __print_symbolic(__entry->why, cachefiles_obj_ref_traces))
97 	    );
98 
99 TRACE_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(unsigned int,		obj	)
108 		    __field(struct dentry *,		de	)
109 		    __field(struct inode *,		inode	)
110 			     ),
111 
112 	    TP_fast_assign(
113 		    __entry->obj	= obj->fscache.debug_id;
114 		    __entry->de		= de;
115 		    __entry->inode	= inode;
116 			   ),
117 
118 	    TP_printk("o=%08x d=%p i=%p",
119 		      __entry->obj, __entry->de, __entry->inode)
120 	    );
121 
122 TRACE_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(unsigned int,		obj	)
130 		    __field(struct dentry *,		de	)
131 		    __field(int,			ret	)
132 			     ),
133 
134 	    TP_fast_assign(
135 		    __entry->obj	= obj->fscache.debug_id;
136 		    __entry->de		= de;
137 		    __entry->ret	= ret;
138 			   ),
139 
140 	    TP_printk("o=%08x d=%p r=%u",
141 		      __entry->obj, __entry->de, __entry->ret)
142 	    );
143 
144 TRACE_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(unsigned int,		obj	)
152 		    __field(struct dentry *,		de	)
153 		    __field(int,			ret	)
154 			     ),
155 
156 	    TP_fast_assign(
157 		    __entry->obj	= obj->fscache.debug_id;
158 		    __entry->de		= de;
159 		    __entry->ret	= ret;
160 			   ),
161 
162 	    TP_printk("o=%08x d=%p r=%u",
163 		      __entry->obj, __entry->de, __entry->ret)
164 	    );
165 
166 TRACE_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(unsigned int,		obj		)
176 		    __field(struct dentry *,		de		)
177 		    __field(enum fscache_why_object_killed, why		)
178 			     ),
179 
180 	    TP_fast_assign(
181 		    __entry->obj	= obj ? obj->fscache.debug_id : UINT_MAX;
182 		    __entry->de		= de;
183 		    __entry->why	= why;
184 			   ),
185 
186 	    TP_printk("o=%08x d=%p w=%s",
187 		      __entry->obj, __entry->de,
188 		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
189 	    );
190 
191 TRACE_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(unsigned int,		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 ? obj->fscache.debug_id : UINT_MAX;
209 		    __entry->de		= de;
210 		    __entry->to		= to;
211 		    __entry->why	= why;
212 			   ),
213 
214 	    TP_printk("o=%08x d=%p t=%p w=%s",
215 		      __entry->obj, __entry->de, __entry->to,
216 		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
217 	    );
218 
219 TRACE_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(unsigned int,		obj		)
228 		    __field(struct dentry *,		de		)
229 			     ),
230 
231 	    TP_fast_assign(
232 		    __entry->obj	= obj->fscache.debug_id;
233 		    __entry->de		= de;
234 			   ),
235 
236 	    TP_printk("o=%08x d=%p",
237 		      __entry->obj, __entry->de)
238 	    );
239 
240 TRACE_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(unsigned int,		obj		)
250 		    __field(unsigned int,		xobj		)
251 		    __field(struct dentry *,		de		)
252 		    __field(u16,			flags		)
253 		    __field(u16,			fsc_flags	)
254 			     ),
255 
256 	    TP_fast_assign(
257 		    __entry->obj	= obj->fscache.debug_id;
258 		    __entry->de		= de;
259 		    __entry->xobj	= xobj->fscache.debug_id;
260 		    __entry->flags	= xobj->flags;
261 		    __entry->fsc_flags	= xobj->fscache.flags;
262 			   ),
263 
264 	    TP_printk("o=%08x d=%p wo=%08x wf=%x wff=%x",
265 		      __entry->obj, __entry->de, __entry->xobj,
266 		      __entry->flags, __entry->fsc_flags)
267 	    );
268 
269 TRACE_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(unsigned int,		obj		)
279 		    __field(struct dentry *,		de		)
280 		    __field(struct inode *,		inode		)
281 			     ),
282 
283 	    TP_fast_assign(
284 		    __entry->obj	= obj->fscache.debug_id;
285 		    __entry->de		= de;
286 		    __entry->inode	= inode;
287 			   ),
288 
289 	    TP_printk("o=%08x d=%p i=%p",
290 		      __entry->obj, __entry->de, __entry->inode)
291 	    );
292 
293 TRACE_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(unsigned int,		obj		)
303 		    __field(struct dentry *,		de		)
304 		    __field(enum fscache_why_object_killed, why		)
305 			     ),
306 
307 	    TP_fast_assign(
308 		    __entry->obj	= obj ? obj->fscache.debug_id : UINT_MAX;
309 		    __entry->de		= de;
310 		    __entry->why	= why;
311 			   ),
312 
313 	    TP_printk("o=%08x 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