Commit | Line | Data |
---|---|---|
b4d0d230 | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
a18feb55 DH |
2 | /* CacheFiles tracepoints |
3 | * | |
4 | * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved. | |
5 | * Written by David Howells (dhowells@redhat.com) | |
a18feb55 DH |
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(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 | ||
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(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 | ||
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(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 | ||
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(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 | ||
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(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 | ||
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(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 | ||
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(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 | ||
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(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 | ||
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(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 | ||
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(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> |