1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2012 Google, Inc. 4 */ 5 6 #undef TRACE_SYSTEM 7 #define TRACE_SYSTEM binder 8 9 #if !defined(_BINDER_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 10 #define _BINDER_TRACE_H 11 12 #include <linux/tracepoint.h> 13 14 struct binder_buffer; 15 struct binder_node; 16 struct binder_proc; 17 struct binder_alloc; 18 struct binder_ref_data; 19 struct binder_thread; 20 struct binder_transaction; 21 22 TRACE_EVENT(binder_ioctl, 23 TP_PROTO(unsigned int cmd, unsigned long arg), 24 TP_ARGS(cmd, arg), 25 26 TP_STRUCT__entry( 27 __field(unsigned int, cmd) 28 __field(unsigned long, arg) 29 ), 30 TP_fast_assign( 31 __entry->cmd = cmd; 32 __entry->arg = arg; 33 ), 34 TP_printk("cmd=0x%x arg=0x%lx", __entry->cmd, __entry->arg) 35 ); 36 37 DECLARE_EVENT_CLASS(binder_function_return_class, 38 TP_PROTO(int ret), 39 TP_ARGS(ret), 40 TP_STRUCT__entry( 41 __field(int, ret) 42 ), 43 TP_fast_assign( 44 __entry->ret = ret; 45 ), 46 TP_printk("ret=%d", __entry->ret) 47 ); 48 49 #define DEFINE_BINDER_FUNCTION_RETURN_EVENT(name) \ 50 DEFINE_EVENT(binder_function_return_class, name, \ 51 TP_PROTO(int ret), \ 52 TP_ARGS(ret)) 53 54 DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_ioctl_done); 55 DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_write_done); 56 DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_read_done); 57 58 TRACE_EVENT(binder_wait_for_work, 59 TP_PROTO(bool proc_work, bool transaction_stack, bool thread_todo), 60 TP_ARGS(proc_work, transaction_stack, thread_todo), 61 62 TP_STRUCT__entry( 63 __field(bool, proc_work) 64 __field(bool, transaction_stack) 65 __field(bool, thread_todo) 66 ), 67 TP_fast_assign( 68 __entry->proc_work = proc_work; 69 __entry->transaction_stack = transaction_stack; 70 __entry->thread_todo = thread_todo; 71 ), 72 TP_printk("proc_work=%d transaction_stack=%d thread_todo=%d", 73 __entry->proc_work, __entry->transaction_stack, 74 __entry->thread_todo) 75 ); 76 77 TRACE_EVENT(binder_txn_latency_free, 78 TP_PROTO(struct binder_transaction *t, 79 int from_proc, int from_thread, 80 int to_proc, int to_thread), 81 TP_ARGS(t, from_proc, from_thread, to_proc, to_thread), 82 TP_STRUCT__entry( 83 __field(int, debug_id) 84 __field(int, from_proc) 85 __field(int, from_thread) 86 __field(int, to_proc) 87 __field(int, to_thread) 88 __field(unsigned int, code) 89 __field(unsigned int, flags) 90 ), 91 TP_fast_assign( 92 __entry->debug_id = t->debug_id; 93 __entry->from_proc = from_proc; 94 __entry->from_thread = from_thread; 95 __entry->to_proc = to_proc; 96 __entry->to_thread = to_thread; 97 __entry->code = t->code; 98 __entry->flags = t->flags; 99 ), 100 TP_printk("transaction=%d from %d:%d to %d:%d flags=0x%x code=0x%x", 101 __entry->debug_id, __entry->from_proc, __entry->from_thread, 102 __entry->to_proc, __entry->to_thread, __entry->code, 103 __entry->flags) 104 ); 105 106 TRACE_EVENT(binder_transaction, 107 TP_PROTO(bool reply, struct binder_transaction *t, 108 struct binder_node *target_node), 109 TP_ARGS(reply, t, target_node), 110 TP_STRUCT__entry( 111 __field(int, debug_id) 112 __field(int, target_node) 113 __field(int, to_proc) 114 __field(int, to_thread) 115 __field(int, reply) 116 __field(unsigned int, code) 117 __field(unsigned int, flags) 118 ), 119 TP_fast_assign( 120 __entry->debug_id = t->debug_id; 121 __entry->target_node = target_node ? target_node->debug_id : 0; 122 __entry->to_proc = t->to_proc->pid; 123 __entry->to_thread = t->to_thread ? t->to_thread->pid : 0; 124 __entry->reply = reply; 125 __entry->code = t->code; 126 __entry->flags = t->flags; 127 ), 128 TP_printk("transaction=%d dest_node=%d dest_proc=%d dest_thread=%d reply=%d flags=0x%x code=0x%x", 129 __entry->debug_id, __entry->target_node, 130 __entry->to_proc, __entry->to_thread, 131 __entry->reply, __entry->flags, __entry->code) 132 ); 133 134 TRACE_EVENT(binder_transaction_received, 135 TP_PROTO(struct binder_transaction *t), 136 TP_ARGS(t), 137 138 TP_STRUCT__entry( 139 __field(int, debug_id) 140 ), 141 TP_fast_assign( 142 __entry->debug_id = t->debug_id; 143 ), 144 TP_printk("transaction=%d", __entry->debug_id) 145 ); 146 147 TRACE_EVENT(binder_transaction_node_to_ref, 148 TP_PROTO(struct binder_transaction *t, struct binder_node *node, 149 struct binder_ref_data *rdata), 150 TP_ARGS(t, node, rdata), 151 152 TP_STRUCT__entry( 153 __field(int, debug_id) 154 __field(int, node_debug_id) 155 __field(binder_uintptr_t, node_ptr) 156 __field(int, ref_debug_id) 157 __field(uint32_t, ref_desc) 158 ), 159 TP_fast_assign( 160 __entry->debug_id = t->debug_id; 161 __entry->node_debug_id = node->debug_id; 162 __entry->node_ptr = node->ptr; 163 __entry->ref_debug_id = rdata->debug_id; 164 __entry->ref_desc = rdata->desc; 165 ), 166 TP_printk("transaction=%d node=%d src_ptr=0x%016llx ==> dest_ref=%d dest_desc=%d", 167 __entry->debug_id, __entry->node_debug_id, 168 (u64)__entry->node_ptr, 169 __entry->ref_debug_id, __entry->ref_desc) 170 ); 171 172 TRACE_EVENT(binder_transaction_ref_to_node, 173 TP_PROTO(struct binder_transaction *t, struct binder_node *node, 174 struct binder_ref_data *rdata), 175 TP_ARGS(t, node, rdata), 176 177 TP_STRUCT__entry( 178 __field(int, debug_id) 179 __field(int, ref_debug_id) 180 __field(uint32_t, ref_desc) 181 __field(int, node_debug_id) 182 __field(binder_uintptr_t, node_ptr) 183 ), 184 TP_fast_assign( 185 __entry->debug_id = t->debug_id; 186 __entry->ref_debug_id = rdata->debug_id; 187 __entry->ref_desc = rdata->desc; 188 __entry->node_debug_id = node->debug_id; 189 __entry->node_ptr = node->ptr; 190 ), 191 TP_printk("transaction=%d node=%d src_ref=%d src_desc=%d ==> dest_ptr=0x%016llx", 192 __entry->debug_id, __entry->node_debug_id, 193 __entry->ref_debug_id, __entry->ref_desc, 194 (u64)__entry->node_ptr) 195 ); 196 197 TRACE_EVENT(binder_transaction_ref_to_ref, 198 TP_PROTO(struct binder_transaction *t, struct binder_node *node, 199 struct binder_ref_data *src_ref, 200 struct binder_ref_data *dest_ref), 201 TP_ARGS(t, node, src_ref, dest_ref), 202 203 TP_STRUCT__entry( 204 __field(int, debug_id) 205 __field(int, node_debug_id) 206 __field(int, src_ref_debug_id) 207 __field(uint32_t, src_ref_desc) 208 __field(int, dest_ref_debug_id) 209 __field(uint32_t, dest_ref_desc) 210 ), 211 TP_fast_assign( 212 __entry->debug_id = t->debug_id; 213 __entry->node_debug_id = node->debug_id; 214 __entry->src_ref_debug_id = src_ref->debug_id; 215 __entry->src_ref_desc = src_ref->desc; 216 __entry->dest_ref_debug_id = dest_ref->debug_id; 217 __entry->dest_ref_desc = dest_ref->desc; 218 ), 219 TP_printk("transaction=%d node=%d src_ref=%d src_desc=%d ==> dest_ref=%d dest_desc=%d", 220 __entry->debug_id, __entry->node_debug_id, 221 __entry->src_ref_debug_id, __entry->src_ref_desc, 222 __entry->dest_ref_debug_id, __entry->dest_ref_desc) 223 ); 224 225 TRACE_EVENT(binder_transaction_fd_send, 226 TP_PROTO(struct binder_transaction *t, int fd, size_t offset), 227 TP_ARGS(t, fd, offset), 228 229 TP_STRUCT__entry( 230 __field(int, debug_id) 231 __field(int, fd) 232 __field(size_t, offset) 233 ), 234 TP_fast_assign( 235 __entry->debug_id = t->debug_id; 236 __entry->fd = fd; 237 __entry->offset = offset; 238 ), 239 TP_printk("transaction=%d src_fd=%d offset=%zu", 240 __entry->debug_id, __entry->fd, __entry->offset) 241 ); 242 243 TRACE_EVENT(binder_transaction_fd_recv, 244 TP_PROTO(struct binder_transaction *t, int fd, size_t offset), 245 TP_ARGS(t, fd, offset), 246 247 TP_STRUCT__entry( 248 __field(int, debug_id) 249 __field(int, fd) 250 __field(size_t, offset) 251 ), 252 TP_fast_assign( 253 __entry->debug_id = t->debug_id; 254 __entry->fd = fd; 255 __entry->offset = offset; 256 ), 257 TP_printk("transaction=%d dest_fd=%d offset=%zu", 258 __entry->debug_id, __entry->fd, __entry->offset) 259 ); 260 261 DECLARE_EVENT_CLASS(binder_buffer_class, 262 TP_PROTO(struct binder_buffer *buf), 263 TP_ARGS(buf), 264 TP_STRUCT__entry( 265 __field(int, debug_id) 266 __field(size_t, data_size) 267 __field(size_t, offsets_size) 268 __field(size_t, extra_buffers_size) 269 ), 270 TP_fast_assign( 271 __entry->debug_id = buf->debug_id; 272 __entry->data_size = buf->data_size; 273 __entry->offsets_size = buf->offsets_size; 274 __entry->extra_buffers_size = buf->extra_buffers_size; 275 ), 276 TP_printk("transaction=%d data_size=%zd offsets_size=%zd extra_buffers_size=%zd", 277 __entry->debug_id, __entry->data_size, __entry->offsets_size, 278 __entry->extra_buffers_size) 279 ); 280 281 DEFINE_EVENT(binder_buffer_class, binder_transaction_alloc_buf, 282 TP_PROTO(struct binder_buffer *buffer), 283 TP_ARGS(buffer)); 284 285 DEFINE_EVENT(binder_buffer_class, binder_transaction_buffer_release, 286 TP_PROTO(struct binder_buffer *buffer), 287 TP_ARGS(buffer)); 288 289 DEFINE_EVENT(binder_buffer_class, binder_transaction_failed_buffer_release, 290 TP_PROTO(struct binder_buffer *buffer), 291 TP_ARGS(buffer)); 292 293 DEFINE_EVENT(binder_buffer_class, binder_transaction_update_buffer_release, 294 TP_PROTO(struct binder_buffer *buffer), 295 TP_ARGS(buffer)); 296 297 TRACE_EVENT(binder_update_page_range, 298 TP_PROTO(struct binder_alloc *alloc, bool allocate, 299 unsigned long start, unsigned long end), 300 TP_ARGS(alloc, allocate, start, end), 301 TP_STRUCT__entry( 302 __field(int, proc) 303 __field(bool, allocate) 304 __field(size_t, offset) 305 __field(size_t, size) 306 ), 307 TP_fast_assign( 308 __entry->proc = alloc->pid; 309 __entry->allocate = allocate; 310 __entry->offset = start - alloc->vm_start; 311 __entry->size = end - start; 312 ), 313 TP_printk("proc=%d allocate=%d offset=%zu size=%zu", 314 __entry->proc, __entry->allocate, 315 __entry->offset, __entry->size) 316 ); 317 318 DECLARE_EVENT_CLASS(binder_lru_page_class, 319 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 320 TP_ARGS(alloc, page_index), 321 TP_STRUCT__entry( 322 __field(int, proc) 323 __field(size_t, page_index) 324 ), 325 TP_fast_assign( 326 __entry->proc = alloc->pid; 327 __entry->page_index = page_index; 328 ), 329 TP_printk("proc=%d page_index=%zu", 330 __entry->proc, __entry->page_index) 331 ); 332 333 DEFINE_EVENT(binder_lru_page_class, binder_alloc_lru_start, 334 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 335 TP_ARGS(alloc, page_index)); 336 337 DEFINE_EVENT(binder_lru_page_class, binder_alloc_lru_end, 338 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 339 TP_ARGS(alloc, page_index)); 340 341 DEFINE_EVENT(binder_lru_page_class, binder_free_lru_start, 342 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 343 TP_ARGS(alloc, page_index)); 344 345 DEFINE_EVENT(binder_lru_page_class, binder_free_lru_end, 346 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 347 TP_ARGS(alloc, page_index)); 348 349 DEFINE_EVENT(binder_lru_page_class, binder_alloc_page_start, 350 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 351 TP_ARGS(alloc, page_index)); 352 353 DEFINE_EVENT(binder_lru_page_class, binder_alloc_page_end, 354 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 355 TP_ARGS(alloc, page_index)); 356 357 DEFINE_EVENT(binder_lru_page_class, binder_unmap_user_start, 358 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 359 TP_ARGS(alloc, page_index)); 360 361 DEFINE_EVENT(binder_lru_page_class, binder_unmap_user_end, 362 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 363 TP_ARGS(alloc, page_index)); 364 365 DEFINE_EVENT(binder_lru_page_class, binder_unmap_kernel_start, 366 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 367 TP_ARGS(alloc, page_index)); 368 369 DEFINE_EVENT(binder_lru_page_class, binder_unmap_kernel_end, 370 TP_PROTO(const struct binder_alloc *alloc, size_t page_index), 371 TP_ARGS(alloc, page_index)); 372 373 TRACE_EVENT(binder_command, 374 TP_PROTO(uint32_t cmd), 375 TP_ARGS(cmd), 376 TP_STRUCT__entry( 377 __field(uint32_t, cmd) 378 ), 379 TP_fast_assign( 380 __entry->cmd = cmd; 381 ), 382 TP_printk("cmd=0x%x %s", 383 __entry->cmd, 384 _IOC_NR(__entry->cmd) < ARRAY_SIZE(binder_command_strings) ? 385 binder_command_strings[_IOC_NR(__entry->cmd)] : 386 "unknown") 387 ); 388 389 TRACE_EVENT(binder_return, 390 TP_PROTO(uint32_t cmd), 391 TP_ARGS(cmd), 392 TP_STRUCT__entry( 393 __field(uint32_t, cmd) 394 ), 395 TP_fast_assign( 396 __entry->cmd = cmd; 397 ), 398 TP_printk("cmd=0x%x %s", 399 __entry->cmd, 400 _IOC_NR(__entry->cmd) < ARRAY_SIZE(binder_return_strings) ? 401 binder_return_strings[_IOC_NR(__entry->cmd)] : 402 "unknown") 403 ); 404 405 #endif /* _BINDER_TRACE_H */ 406 407 #undef TRACE_INCLUDE_PATH 408 #undef TRACE_INCLUDE_FILE 409 #define TRACE_INCLUDE_PATH . 410 #define TRACE_INCLUDE_FILE binder_trace 411 #include <trace/define_trace.h> 412