• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2024 Google, Inc.
4  */
5 
6 #undef TRACE_SYSTEM
7 #undef TRACE_INCLUDE_FILE
8 #undef TRACE_INCLUDE_PATH
9 #define TRACE_SYSTEM rust_binder
10 #define TRACE_INCLUDE_FILE rust_binder_events
11 #define TRACE_INCLUDE_PATH ../drivers/android/binder
12 
13 #if !defined(_RUST_BINDER_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
14 #define _RUST_BINDER_TRACE_H
15 
16 #include <linux/tracepoint.h>
17 
18 TRACE_EVENT(rust_binder_ioctl,
19 	TP_PROTO(unsigned int cmd, unsigned long arg),
20 	TP_ARGS(cmd, arg),
21 
22 	TP_STRUCT__entry(
23 		__field(unsigned int, cmd)
24 		__field(unsigned long, arg)
25 	),
26 	TP_fast_assign(
27 		__entry->cmd = cmd;
28 		__entry->arg = arg;
29 	),
30 	TP_printk("cmd=0x%x arg=0x%lx", __entry->cmd, __entry->arg)
31 );
32 
33 DECLARE_EVENT_CLASS(rust_binder_function_return_class,
34 	TP_PROTO(int ret),
35 	TP_ARGS(ret),
36 	TP_STRUCT__entry(
37 		__field(int, ret)
38 	),
39 	TP_fast_assign(
40 		__entry->ret = ret;
41 	),
42 	TP_printk("ret=%d", __entry->ret)
43 );
44 
45 #define DEFINE_RBINDER_FUNCTION_RETURN_EVENT(name)	\
46 DEFINE_EVENT(rust_binder_function_return_class, name,	\
47 	TP_PROTO(int ret), \
48 	TP_ARGS(ret))
49 
50 DEFINE_RBINDER_FUNCTION_RETURN_EVENT(rust_binder_ioctl_done);
51 DEFINE_RBINDER_FUNCTION_RETURN_EVENT(rust_binder_read_done);
52 DEFINE_RBINDER_FUNCTION_RETURN_EVENT(rust_binder_write_done);
53 
54 TRACE_EVENT(rust_binder_set_priority,
55 	TP_PROTO(struct task_struct *thread, int desired_prio, int new_prio),
56 	TP_ARGS(thread, desired_prio, new_prio),
57 
58 	TP_STRUCT__entry(
59 		__field(int, proc)
60 		__field(int, thread)
61 		__field(unsigned int, old_prio)
62 		__field(unsigned int, new_prio)
63 		__field(unsigned int, desired_prio)
64 	),
65 	TP_fast_assign(
66 		__entry->proc = thread->tgid;
67 		__entry->thread = thread->pid;
68 		__entry->old_prio = thread->normal_prio;
69 		__entry->new_prio = new_prio;
70 		__entry->desired_prio = desired_prio;
71 	),
72 	TP_printk("proc=%d thread=%d old=%d => new=%d desired=%d",
73 		  __entry->proc, __entry->thread, __entry->old_prio,
74 		  __entry->new_prio, __entry->desired_prio)
75 );
76 
77 TRACE_EVENT(rust_binder_wait_for_work,
78 	TP_PROTO(bool proc_work, bool transaction_stack, bool thread_todo),
79 	TP_ARGS(proc_work, transaction_stack, thread_todo),
80 
81 	TP_STRUCT__entry(
82 		__field(bool, proc_work)
83 		__field(bool, transaction_stack)
84 		__field(bool, thread_todo)
85 	),
86 	TP_fast_assign(
87 		__entry->proc_work = proc_work;
88 		__entry->transaction_stack = transaction_stack;
89 		__entry->thread_todo = thread_todo;
90 	),
91 	TP_printk("proc_work=%d transaction_stack=%d thread_todo=%d",
92 		  __entry->proc_work, __entry->transaction_stack,
93 		  __entry->thread_todo)
94 );
95 
96 TRACE_EVENT(rust_binder_transaction,
97 	TP_PROTO(bool reply, rust_binder_transaction t),
98 	TP_ARGS(reply, t),
99 	TP_STRUCT__entry(
100 		__field(int, debug_id)
101 		__field(int, target_node)
102 		__field(int, from_proc)
103 		__field(int, to_proc)
104 		__field(int, reply)
105 		__field(unsigned int, code)
106 		__field(unsigned int, flags)
107 	),
108 	TP_fast_assign(
109 		rust_binder_thread from_thread = rust_binder_transaction_from_thread(t);
110 		rust_binder_process from = rust_binder_thread_proc(from_thread);
111 		rust_binder_process to = rust_binder_transaction_to_proc(t);
112 		rust_binder_node target_node = rust_binder_transaction_target_node(t);
113 
114 		__entry->debug_id = rust_binder_transaction_debug_id(t);
115 		__entry->target_node = target_node ? rust_binder_node_debug_id(target_node) : 0;
116 		__entry->from_proc = rust_binder_process_task(from)->pid;
117 		__entry->to_proc = rust_binder_process_task(to)->pid;
118 		__entry->reply = reply;
119 		__entry->code = rust_binder_transaction_code(t);
120 		__entry->flags = rust_binder_transaction_flags(t);
121 	),
122 	TP_printk("transaction=%d target_node=%d dest_proc=%d from_proc=%d reply=%d flags=0x%x code=0x%x",
123 		__entry->debug_id, __entry->target_node, __entry->to_proc,
124 		__entry->from_proc, __entry->reply, __entry->flags,
125 		__entry->code)
126 );
127 
128 TRACE_EVENT(rust_binder_transaction_thread_selected,
129 	TP_PROTO(rust_binder_transaction t, rust_binder_thread thread),
130 	TP_ARGS(t, thread),
131 	TP_STRUCT__entry(
132 		__field(int, debug_id)
133 		__field(int, to_thread)
134 	),
135 	TP_fast_assign(
136 		__entry->debug_id = rust_binder_transaction_debug_id(t);
137 		__entry->to_thread = rust_binder_thread_id(thread);
138 	),
139 	TP_printk("transaction=%d thread=%d", __entry->debug_id, __entry->to_thread)
140 );
141 
142 TRACE_EVENT(rust_binder_transaction_received,
143 	TP_PROTO(rust_binder_transaction t),
144 	TP_ARGS(t),
145 	TP_STRUCT__entry(
146 		__field(int, debug_id)
147 	),
148 	TP_fast_assign(
149 		__entry->debug_id = rust_binder_transaction_debug_id(t);
150 	),
151 	TP_printk("transaction=%d", __entry->debug_id)
152 );
153 
154 TRACE_EVENT(rust_binder_transaction_node_send,
155 	TP_PROTO(int t_debug_id, rust_binder_node node,
156 		const struct flat_binder_object *original,
157 		const struct flat_binder_object *translated),
158 	TP_ARGS(t_debug_id, node, original, translated),
159 
160 	TP_STRUCT__entry(
161 		__field(int, debug_id)
162 		__field(int, node_debug_id)
163 		__field(binder_uintptr_t, node_ptr)
164 		__field(int, types)
165 		__field(int, original_handle)
166 		__field(int, translated_handle)
167 	),
168 	TP_fast_assign(
169 		int orig_is_handle = original->hdr.type == BINDER_TYPE_HANDLE || original->hdr.type == BINDER_TYPE_WEAK_HANDLE;
170 		int orig_is_strong = original->hdr.type == BINDER_TYPE_HANDLE || original->hdr.type == BINDER_TYPE_BINDER;
171 		int tran_is_handle = translated->hdr.type == BINDER_TYPE_HANDLE || translated->hdr.type == BINDER_TYPE_WEAK_HANDLE;
172 		int tran_is_strong = translated->hdr.type == BINDER_TYPE_HANDLE || translated->hdr.type == BINDER_TYPE_BINDER;
173 
174 		__entry->debug_id = t_debug_id;
175 		__entry->node_debug_id = rust_binder_node_debug_id(node);
176 		__entry->node_ptr = rust_binder_node_debug_id(node);
177 		__entry->types =
178 			(orig_is_handle << 0) |
179 			(tran_is_handle << 1) |
180 			(orig_is_strong << 2) |
181 			(tran_is_strong << 3);
182 		__entry->original_handle = orig_is_handle ? original->handle : 0;
183 		__entry->translated_handle = tran_is_handle ? original->handle : 0;
184 	),
185 	TP_printk("transaction=%d node=%d ptr=0x%016llx: %s%s [%d] ==> %s%s [%d]",
186 		  __entry->debug_id, __entry->node_debug_id,
187 		  (u64)__entry->node_ptr,
188 		  (__entry->types & (1<<2)) ? "" : "weak ",
189 		  (__entry->types & (1<<0)) ? "handle" : "binder",
190 		  __entry->original_handle,
191 		  (__entry->types & (1<<3)) ? "" : "weak ",
192 		  (__entry->types & (1<<1)) ? "handle" : "binder",
193 		  __entry->translated_handle)
194 );
195 
196 TRACE_EVENT(rust_binder_transaction_fd_send,
197 	TP_PROTO(int t_debug_id, int fd, size_t offset),
198 	TP_ARGS(t_debug_id, fd, offset),
199 
200 	TP_STRUCT__entry(
201 		__field(int, debug_id)
202 		__field(int, fd)
203 		__field(size_t, offset)
204 	),
205 	TP_fast_assign(
206 		__entry->debug_id = t_debug_id;
207 		__entry->fd = fd;
208 		__entry->offset = offset;
209 	),
210 	TP_printk("transaction=%d src_fd=%d offset=%zu",
211 		  __entry->debug_id, __entry->fd, __entry->offset)
212 );
213 
214 TRACE_EVENT(rust_binder_transaction_fd_recv,
215 	TP_PROTO(int t_debug_id, int fd, size_t offset),
216 	TP_ARGS(t_debug_id, fd, offset),
217 
218 	TP_STRUCT__entry(
219 		__field(int, debug_id)
220 		__field(int, fd)
221 		__field(size_t, offset)
222 	),
223 	TP_fast_assign(
224 		__entry->debug_id = t_debug_id;
225 		__entry->fd = fd;
226 		__entry->offset = offset;
227 	),
228 	TP_printk("transaction=%d dest_fd=%d offset=%zu",
229 		  __entry->debug_id, __entry->fd, __entry->offset)
230 );
231 
232 TRACE_EVENT(rust_binder_transaction_alloc_buf,
233 	TP_PROTO(int debug_id, const struct binder_transaction_data_sg *data),
234 	TP_ARGS(debug_id, data),
235 
236 	TP_STRUCT__entry(
237 		__field(int, debug_id)
238 		__field(size_t, data_size)
239 		__field(size_t, offsets_size)
240 		__field(size_t, extra_buffers_size)
241 	),
242 	TP_fast_assign(
243 		__entry->debug_id = debug_id;
244 		__entry->data_size = data->transaction_data.data_size;
245 		__entry->offsets_size = data->transaction_data.offsets_size;
246 		__entry->extra_buffers_size = data->buffers_size;
247 	),
248 	TP_printk("transaction=%d data_size=%zd offsets_size=%zd extra_buffers_size=%zd",
249 		  __entry->debug_id, __entry->data_size, __entry->offsets_size,
250 		  __entry->extra_buffers_size)
251 );
252 
253 DECLARE_EVENT_CLASS(rust_binder_buffer_release_class,
254 	TP_PROTO(int debug_id),
255 	TP_ARGS(debug_id),
256 	TP_STRUCT__entry(
257 		__field(int, debug_id)
258 	),
259 	TP_fast_assign(
260 		__entry->debug_id = debug_id;
261 	),
262 	TP_printk("transaction=%d", __entry->debug_id)
263 );
264 
265 DEFINE_EVENT(rust_binder_buffer_release_class, rust_binder_transaction_buffer_release,
266 	TP_PROTO(int debug_id),
267 	TP_ARGS(debug_id));
268 
269 DEFINE_EVENT(rust_binder_buffer_release_class, rust_binder_transaction_failed_buffer_release,
270 	TP_PROTO(int debug_id),
271 	TP_ARGS(debug_id));
272 
273 DEFINE_EVENT(rust_binder_buffer_release_class, rust_binder_transaction_update_buffer_release,
274 	TP_PROTO(int debug_id),
275 	TP_ARGS(debug_id));
276 
277 TRACE_EVENT(rust_binder_update_page_range,
278 	TP_PROTO(int pid, bool allocate, size_t start, size_t end),
279 	TP_ARGS(pid, allocate, start, end),
280 	TP_STRUCT__entry(
281 		__field(int, proc)
282 		__field(bool, allocate)
283 		__field(size_t, offset)
284 		__field(size_t, size)
285 	),
286 	TP_fast_assign(
287 		__entry->proc = pid;
288 		__entry->allocate = allocate;
289 		__entry->offset = start;
290 		__entry->size = end - start;
291 	),
292 	TP_printk("proc=%d allocate=%d offset=%zu size=%zu",
293 		  __entry->proc, __entry->allocate,
294 		  __entry->offset, __entry->size)
295 );
296 
297 DECLARE_EVENT_CLASS(rust_binder_lru_page_class,
298 	TP_PROTO(int pid, size_t page_index),
299 	TP_ARGS(pid, page_index),
300 	TP_STRUCT__entry(
301 		__field(int, proc)
302 		__field(size_t, page_index)
303 	),
304 	TP_fast_assign(
305 		__entry->proc = pid;
306 		__entry->page_index = page_index;
307 	),
308 	TP_printk("proc=%d page_index=%zu",
309 		  __entry->proc, __entry->page_index)
310 );
311 
312 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_alloc_lru_start,
313 	TP_PROTO(int pid, size_t page_index),
314 	TP_ARGS(pid, page_index));
315 
316 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_alloc_lru_end,
317 	TP_PROTO(int pid, size_t page_index),
318 	TP_ARGS(pid, page_index));
319 
320 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_free_lru_start,
321 	TP_PROTO(int pid, size_t page_index),
322 	TP_ARGS(pid, page_index));
323 
324 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_free_lru_end,
325 	TP_PROTO(int pid, size_t page_index),
326 	TP_ARGS(pid, page_index));
327 
328 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_alloc_page_start,
329 	TP_PROTO(int pid, size_t page_index),
330 	TP_ARGS(pid, page_index));
331 
332 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_alloc_page_end,
333 	TP_PROTO(int pid, size_t page_index),
334 	TP_ARGS(pid, page_index));
335 
336 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_unmap_user_start,
337 	TP_PROTO(int pid, size_t page_index),
338 	TP_ARGS(pid, page_index));
339 
340 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_unmap_user_end,
341 	TP_PROTO(int pid, size_t page_index),
342 	TP_ARGS(pid, page_index));
343 
344 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_unmap_kernel_start,
345 	TP_PROTO(int pid, size_t page_index),
346 	TP_ARGS(pid, page_index));
347 
348 DEFINE_EVENT(rust_binder_lru_page_class, rust_binder_unmap_kernel_end,
349 	TP_PROTO(int pid, size_t page_index),
350 	TP_ARGS(pid, page_index));
351 
352 TRACE_EVENT(rust_binder_command,
353 	TP_PROTO(uint32_t cmd),
354 	TP_ARGS(cmd),
355 	TP_STRUCT__entry(
356 		__field(uint32_t, cmd)
357 	),
358 	TP_fast_assign(
359 		__entry->cmd = cmd;
360 	),
361 	TP_printk("cmd=0x%x %s",
362 		  __entry->cmd,
363 		  _IOC_NR(__entry->cmd) < ARRAY_SIZE(binder_command_strings) ?
364 			  binder_command_strings[_IOC_NR(__entry->cmd)] :
365 			  "unknown")
366 );
367 
368 TRACE_EVENT(rust_binder_return,
369     TP_PROTO(uint32_t ret),
370     TP_ARGS(ret),
371     TP_STRUCT__entry(
372         __field(uint32_t, ret)
373     ),
374     TP_fast_assign(
375         __entry->ret = ret;
376     ),
377     TP_printk("ret=0x%x %s",
378           __entry->ret,
379           _IOC_NR(__entry->ret) < ARRAY_SIZE(binder_return_strings) ?
380               binder_return_strings[_IOC_NR(__entry->ret)] :
381               "unknown")
382 );
383 
384 #endif /* _RUST_BINDER_TRACE_H */
385 
386 /* This part must be outside protection */
387 #include <trace/define_trace.h>
388