Lines Matching refs:tu

89 static int register_uprobe_event(struct trace_uprobe *tu);
90 static int unregister_uprobe_event(struct trace_uprobe *tu);
211 base_addr = udd->bp_addr - udd->tu->offset; in translate_user_vaddr()
267 static inline bool is_ret_probe(struct trace_uprobe *tu) in is_ret_probe() argument
269 return tu->consumer.ret_handler != NULL; in is_ret_probe()
274 struct trace_uprobe *tu = to_trace_uprobe(ev); in trace_uprobe_is_busy() local
276 return trace_probe_is_enabled(&tu->tp); in trace_uprobe_is_busy()
279 static bool trace_uprobe_match_command_head(struct trace_uprobe *tu, in trace_uprobe_match_command_head() argument
288 len = strlen(tu->filename); in trace_uprobe_match_command_head()
289 if (strncmp(tu->filename, argv[0], len) || argv[0][len] != ':') in trace_uprobe_match_command_head()
292 if (tu->ref_ctr_offset == 0) in trace_uprobe_match_command_head()
294 (int)(sizeof(void *) * 2), tu->offset); in trace_uprobe_match_command_head()
297 (int)(sizeof(void *) * 2), tu->offset, in trace_uprobe_match_command_head()
298 tu->ref_ctr_offset); in trace_uprobe_match_command_head()
304 return trace_probe_match_command_args(&tu->tp, argc, argv); in trace_uprobe_match_command_head()
310 struct trace_uprobe *tu = to_trace_uprobe(ev); in trace_uprobe_match() local
313 strcmp(trace_probe_name(&tu->tp), event) == 0) && in trace_uprobe_match()
314 (!system || strcmp(trace_probe_group_name(&tu->tp), system) == 0) && in trace_uprobe_match()
315 trace_uprobe_match_command_head(tu, argc, argv); in trace_uprobe_match()
336 struct trace_uprobe *tu; in alloc_trace_uprobe() local
339 tu = kzalloc(struct_size(tu, tp.args, nargs), GFP_KERNEL); in alloc_trace_uprobe()
340 if (!tu) in alloc_trace_uprobe()
343 tu->nhits = alloc_percpu(unsigned long); in alloc_trace_uprobe()
344 if (!tu->nhits) { in alloc_trace_uprobe()
349 ret = trace_probe_init(&tu->tp, event, group, true, nargs); in alloc_trace_uprobe()
353 dyn_event_init(&tu->devent, &trace_uprobe_ops); in alloc_trace_uprobe()
354 tu->consumer.handler = uprobe_dispatcher; in alloc_trace_uprobe()
356 tu->consumer.ret_handler = uretprobe_dispatcher; in alloc_trace_uprobe()
357 init_trace_uprobe_filter(tu->tp.event->filter); in alloc_trace_uprobe()
358 return tu; in alloc_trace_uprobe()
361 free_percpu(tu->nhits); in alloc_trace_uprobe()
362 kfree(tu); in alloc_trace_uprobe()
367 static void free_trace_uprobe(struct trace_uprobe *tu) in free_trace_uprobe() argument
369 if (!tu) in free_trace_uprobe()
372 path_put(&tu->path); in free_trace_uprobe()
373 trace_probe_cleanup(&tu->tp); in free_trace_uprobe()
374 kfree(tu->filename); in free_trace_uprobe()
375 free_percpu(tu->nhits); in free_trace_uprobe()
376 kfree(tu); in free_trace_uprobe()
382 struct trace_uprobe *tu; in find_probe_event() local
384 for_each_trace_uprobe(tu, pos) in find_probe_event()
385 if (strcmp(trace_probe_name(&tu->tp), event) == 0 && in find_probe_event()
386 strcmp(trace_probe_group_name(&tu->tp), group) == 0) in find_probe_event()
387 return tu; in find_probe_event()
393 static int unregister_trace_uprobe(struct trace_uprobe *tu) in unregister_trace_uprobe() argument
397 if (trace_probe_has_sibling(&tu->tp)) in unregister_trace_uprobe()
401 if (trace_event_dyn_busy(trace_probe_event_call(&tu->tp))) in unregister_trace_uprobe()
404 ret = unregister_uprobe_event(tu); in unregister_trace_uprobe()
409 dyn_event_remove(&tu->devent); in unregister_trace_uprobe()
410 trace_probe_unlink(&tu->tp); in unregister_trace_uprobe()
411 free_trace_uprobe(tu); in unregister_trace_uprobe()
444 static int append_trace_uprobe(struct trace_uprobe *tu, struct trace_uprobe *to) in append_trace_uprobe() argument
448 ret = trace_probe_compare_arg_type(&tu->tp, &to->tp); in append_trace_uprobe()
455 if (trace_uprobe_has_same_uprobe(to, tu)) { in append_trace_uprobe()
462 ret = trace_probe_append(&tu->tp, &to->tp); in append_trace_uprobe()
464 dyn_event_add(&tu->devent, trace_probe_event_call(&tu->tp)); in append_trace_uprobe()
496 static int register_trace_uprobe(struct trace_uprobe *tu) in register_trace_uprobe() argument
503 ret = validate_ref_ctr_offset(tu); in register_trace_uprobe()
508 old_tu = find_probe_event(trace_probe_name(&tu->tp), in register_trace_uprobe()
509 trace_probe_group_name(&tu->tp)); in register_trace_uprobe()
511 if (is_ret_probe(tu) != is_ret_probe(old_tu)) { in register_trace_uprobe()
516 return append_trace_uprobe(tu, old_tu); in register_trace_uprobe()
519 ret = register_uprobe_event(tu); in register_trace_uprobe()
529 dyn_event_add(&tu->devent, trace_probe_event_call(&tu->tp)); in register_trace_uprobe()
540 struct trace_uprobe *tu; in __trace_uprobe_create() local
684 tu = alloc_trace_uprobe(group, event, argc, is_return); in __trace_uprobe_create()
685 if (IS_ERR(tu)) { in __trace_uprobe_create()
686 ret = PTR_ERR(tu); in __trace_uprobe_create()
691 tu->offset = offset; in __trace_uprobe_create()
692 tu->ref_ctr_offset = ref_ctr_offset; in __trace_uprobe_create()
693 tu->path = path; in __trace_uprobe_create()
694 tu->filename = filename; in __trace_uprobe_create()
703 ret = traceprobe_parse_probe_arg(&tu->tp, i, argv[i], &ctx); in __trace_uprobe_create()
709 ptype = is_ret_probe(tu) ? PROBE_PRINT_RETURN : PROBE_PRINT_NORMAL; in __trace_uprobe_create()
710 ret = traceprobe_set_print_fmt(&tu->tp, ptype); in __trace_uprobe_create()
714 ret = register_trace_uprobe(tu); in __trace_uprobe_create()
719 free_trace_uprobe(tu); in __trace_uprobe_create()
750 struct trace_uprobe *tu = to_trace_uprobe(ev); in trace_uprobe_release() local
752 return unregister_trace_uprobe(tu); in trace_uprobe_release()
758 struct trace_uprobe *tu = to_trace_uprobe(ev); in trace_uprobe_show() local
759 char c = is_ret_probe(tu) ? 'r' : 'p'; in trace_uprobe_show()
762 seq_printf(m, "%c:%s/%s %s:0x%0*lx", c, trace_probe_group_name(&tu->tp), in trace_uprobe_show()
763 trace_probe_name(&tu->tp), tu->filename, in trace_uprobe_show()
764 (int)(sizeof(void *) * 2), tu->offset); in trace_uprobe_show()
766 if (tu->ref_ctr_offset) in trace_uprobe_show()
767 seq_printf(m, "(0x%lx)", tu->ref_ctr_offset); in trace_uprobe_show()
769 for (i = 0; i < tu->tp.nr_args; i++) in trace_uprobe_show()
770 seq_printf(m, " %s=%s", tu->tp.args[i].name, tu->tp.args[i].comm); in trace_uprobe_show()
830 struct trace_uprobe *tu; in probes_profile_seq_show() local
837 tu = to_trace_uprobe(ev); in probes_profile_seq_show()
841 nhits += per_cpu(*tu->nhits, cpu); in probes_profile_seq_show()
844 seq_printf(m, " %s %-44s %15lu\n", tu->filename, in probes_profile_seq_show()
845 trace_probe_name(&tu->tp), nhits); in probes_profile_seq_show()
971 static struct uprobe_cpu_buffer *prepare_uprobe_buffer(struct trace_uprobe *tu, in prepare_uprobe_buffer() argument
981 esize = SIZEOF_TRACE_ENTRY(is_ret_probe(tu)); in prepare_uprobe_buffer()
982 dsize = __get_data_size(&tu->tp, regs, NULL); in prepare_uprobe_buffer()
985 ucb->dsize = tu->tp.size + dsize; in prepare_uprobe_buffer()
989 dsize = MAX_UCB_BUFFER_SIZE - tu->tp.size; in prepare_uprobe_buffer()
992 store_trace_args(ucb->buf, &tu->tp, regs, NULL, esize, dsize); in prepare_uprobe_buffer()
998 static void __uprobe_trace_func(struct trace_uprobe *tu, in __uprobe_trace_func() argument
1007 struct trace_event_call *call = trace_probe_event_call(&tu->tp); in __uprobe_trace_func()
1014 esize = SIZEOF_TRACE_ENTRY(is_ret_probe(tu)); in __uprobe_trace_func()
1020 if (is_ret_probe(tu)) { in __uprobe_trace_func()
1035 static int uprobe_trace_func(struct trace_uprobe *tu, struct pt_regs *regs, in uprobe_trace_func() argument
1041 if (is_ret_probe(tu)) in uprobe_trace_func()
1044 ucb = prepare_uprobe_buffer(tu, regs, ucbp); in uprobe_trace_func()
1047 trace_probe_for_each_link_rcu(link, &tu->tp) in uprobe_trace_func()
1048 __uprobe_trace_func(tu, 0, regs, ucb, link->file); in uprobe_trace_func()
1054 static void uretprobe_trace_func(struct trace_uprobe *tu, unsigned long func, in uretprobe_trace_func() argument
1061 ucb = prepare_uprobe_buffer(tu, regs, ucbp); in uretprobe_trace_func()
1064 trace_probe_for_each_link_rcu(link, &tu->tp) in uretprobe_trace_func()
1065 __uprobe_trace_func(tu, func, regs, ucb, link->file); in uretprobe_trace_func()
1075 struct trace_uprobe *tu; in print_uprobe_event() local
1079 tu = trace_uprobe_primary_from_call( in print_uprobe_event()
1081 if (unlikely(!tu)) in print_uprobe_event()
1084 if (is_ret_probe(tu)) { in print_uprobe_event()
1086 trace_probe_name(&tu->tp), in print_uprobe_event()
1091 trace_probe_name(&tu->tp), in print_uprobe_event()
1096 if (trace_probe_print_args(s, tu->tp.args, tu->tp.nr_args, data, entry) < 0) in print_uprobe_event()
1107 static int trace_uprobe_enable(struct trace_uprobe *tu, filter_func_t filter) in trace_uprobe_enable() argument
1109 struct inode *inode = d_real_inode(tu->path.dentry); in trace_uprobe_enable()
1112 tu->consumer.filter = filter; in trace_uprobe_enable()
1113 uprobe = uprobe_register(inode, tu->offset, tu->ref_ctr_offset, &tu->consumer); in trace_uprobe_enable()
1117 tu->uprobe = uprobe; in trace_uprobe_enable()
1123 struct trace_uprobe *tu; in __probe_event_disable() local
1126 tu = container_of(tp, struct trace_uprobe, tp); in __probe_event_disable()
1127 WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter)); in __probe_event_disable()
1129 list_for_each_entry(tu, trace_probe_probe_list(tp), tp.list) { in __probe_event_disable()
1130 if (!tu->uprobe) in __probe_event_disable()
1133 uprobe_unregister_nosync(tu->uprobe, &tu->consumer); in __probe_event_disable()
1135 tu->uprobe = NULL; in __probe_event_disable()
1145 struct trace_uprobe *tu; in probe_event_enable() local
1169 tu = container_of(tp, struct trace_uprobe, tp); in probe_event_enable()
1170 WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter)); in probe_event_enable()
1179 list_for_each_entry(tu, trace_probe_probe_list(tp), tp.list) { in probe_event_enable()
1180 ret = trace_uprobe_enable(tu, filter); in probe_event_enable()
1230 struct trace_uprobe *tu; in uprobe_event_define_fields() local
1232 tu = trace_uprobe_primary_from_call(event_call); in uprobe_event_define_fields()
1233 if (unlikely(!tu)) in uprobe_event_define_fields()
1236 if (is_ret_probe(tu)) { in uprobe_event_define_fields()
1245 return traceprobe_define_arg_fields(event_call, size, &tu->tp); in uprobe_event_define_fields()
1322 struct trace_uprobe *tu; in uprobe_perf_close() local
1329 tu = container_of(tp, struct trace_uprobe, tp); in uprobe_perf_close()
1330 if (trace_uprobe_filter_remove(tu->tp.event->filter, event)) in uprobe_perf_close()
1333 list_for_each_entry(tu, trace_probe_probe_list(tp), tp.list) { in uprobe_perf_close()
1334 ret = uprobe_apply(tu->uprobe, &tu->consumer, false); in uprobe_perf_close()
1346 struct trace_uprobe *tu; in uprobe_perf_open() local
1353 tu = container_of(tp, struct trace_uprobe, tp); in uprobe_perf_open()
1354 if (trace_uprobe_filter_add(tu->tp.event->filter, event)) in uprobe_perf_open()
1357 list_for_each_entry(tu, trace_probe_probe_list(tp), tp.list) { in uprobe_perf_open()
1358 err = uprobe_apply(tu->uprobe, &tu->consumer, true); in uprobe_perf_open()
1371 struct trace_uprobe *tu; in uprobe_perf_filter() local
1374 tu = container_of(uc, struct trace_uprobe, consumer); in uprobe_perf_filter()
1375 filter = tu->tp.event->filter; in uprobe_perf_filter()
1391 static void __uprobe_perf_func(struct trace_uprobe *tu, in __uprobe_perf_func() argument
1395 struct trace_event_call *call = trace_probe_event_call(&tu->tp); in __uprobe_perf_func()
1417 esize = SIZEOF_TRACE_ENTRY(is_ret_probe(tu)); in __uprobe_perf_func()
1419 ucb = prepare_uprobe_buffer(tu, regs, ucbp); in __uprobe_perf_func()
1434 if (is_ret_probe(tu)) { in __uprobe_perf_func()
1455 static int uprobe_perf_func(struct trace_uprobe *tu, struct pt_regs *regs, in uprobe_perf_func() argument
1458 if (!uprobe_perf_filter(&tu->consumer, current->mm)) in uprobe_perf_func()
1461 if (!is_ret_probe(tu)) in uprobe_perf_func()
1462 __uprobe_perf_func(tu, 0, regs, ucbp); in uprobe_perf_func()
1466 static void uretprobe_perf_func(struct trace_uprobe *tu, unsigned long func, in uretprobe_perf_func() argument
1470 __uprobe_perf_func(tu, func, regs, ucbp); in uretprobe_perf_func()
1479 struct trace_uprobe *tu; in bpf_get_uprobe_info() local
1482 tu = find_probe_event(pevent, group); in bpf_get_uprobe_info()
1484 tu = trace_uprobe_primary_from_call(event->tp_event); in bpf_get_uprobe_info()
1485 if (!tu) in bpf_get_uprobe_info()
1488 *fd_type = is_ret_probe(tu) ? BPF_FD_TYPE_URETPROBE in bpf_get_uprobe_info()
1490 *filename = tu->filename; in bpf_get_uprobe_info()
1491 *probe_offset = tu->offset; in bpf_get_uprobe_info()
1534 struct trace_uprobe *tu; in uprobe_dispatcher() local
1539 tu = container_of(con, struct trace_uprobe, consumer); in uprobe_dispatcher()
1541 this_cpu_inc(*tu->nhits); in uprobe_dispatcher()
1543 udd.tu = tu; in uprobe_dispatcher()
1551 if (trace_probe_test_flag(&tu->tp, TP_FLAG_TRACE)) in uprobe_dispatcher()
1552 ret |= uprobe_trace_func(tu, regs, &ucb); in uprobe_dispatcher()
1555 if (trace_probe_test_flag(&tu->tp, TP_FLAG_PROFILE)) in uprobe_dispatcher()
1556 ret |= uprobe_perf_func(tu, regs, &ucb); in uprobe_dispatcher()
1566 struct trace_uprobe *tu; in uretprobe_dispatcher() local
1570 tu = container_of(con, struct trace_uprobe, consumer); in uretprobe_dispatcher()
1572 udd.tu = tu; in uretprobe_dispatcher()
1580 if (trace_probe_test_flag(&tu->tp, TP_FLAG_TRACE)) in uretprobe_dispatcher()
1581 uretprobe_trace_func(tu, func, regs, &ucb); in uretprobe_dispatcher()
1584 if (trace_probe_test_flag(&tu->tp, TP_FLAG_PROFILE)) in uretprobe_dispatcher()
1585 uretprobe_perf_func(tu, func, regs, &ucb); in uretprobe_dispatcher()
1601 static inline void init_trace_event_call(struct trace_uprobe *tu) in init_trace_event_call() argument
1603 struct trace_event_call *call = trace_probe_event_call(&tu->tp); in init_trace_event_call()
1611 static int register_uprobe_event(struct trace_uprobe *tu) in register_uprobe_event() argument
1613 init_trace_event_call(tu); in register_uprobe_event()
1615 return trace_probe_register_event_call(&tu->tp); in register_uprobe_event()
1618 static int unregister_uprobe_event(struct trace_uprobe *tu) in unregister_uprobe_event() argument
1620 return trace_probe_unregister_event_call(&tu->tp); in unregister_uprobe_event()
1629 struct trace_uprobe *tu; in create_local_trace_uprobe() local
1647 tu = alloc_trace_uprobe(UPROBE_EVENT_SYSTEM, "DUMMY_EVENT", 0, in create_local_trace_uprobe()
1650 if (IS_ERR(tu)) { in create_local_trace_uprobe()
1652 (int)PTR_ERR(tu)); in create_local_trace_uprobe()
1654 return ERR_CAST(tu); in create_local_trace_uprobe()
1657 tu->offset = offs; in create_local_trace_uprobe()
1658 tu->path = path; in create_local_trace_uprobe()
1659 tu->ref_ctr_offset = ref_ctr_offset; in create_local_trace_uprobe()
1660 tu->filename = kstrdup(name, GFP_KERNEL); in create_local_trace_uprobe()
1661 if (!tu->filename) { in create_local_trace_uprobe()
1666 init_trace_event_call(tu); in create_local_trace_uprobe()
1668 ptype = is_ret_probe(tu) ? PROBE_PRINT_RETURN : PROBE_PRINT_NORMAL; in create_local_trace_uprobe()
1669 if (traceprobe_set_print_fmt(&tu->tp, ptype) < 0) { in create_local_trace_uprobe()
1674 return trace_probe_event_call(&tu->tp); in create_local_trace_uprobe()
1676 free_trace_uprobe(tu); in create_local_trace_uprobe()
1682 struct trace_uprobe *tu; in destroy_local_trace_uprobe() local
1684 tu = trace_uprobe_primary_from_call(event_call); in destroy_local_trace_uprobe()
1686 free_trace_uprobe(tu); in destroy_local_trace_uprobe()