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