Lines Matching +full:event +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0
12 #include "bpf-event.h"
22 #include "util/synthetic-events.h"
28 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" in btf__load_from_kernel_by_id()
43 ret += snprintf(buf + ret, size - ret, "%02x", data[i]); in snprintf_hex()
48 union perf_event *event, in machine__process_bpf_event_load() argument
53 struct perf_env *env = machine->env; in machine__process_bpf_event_load()
54 int id = event->bpf.id; in machine__process_bpf_event_load()
57 /* perf-record, no need to handle bpf-event */ in machine__process_bpf_event_load()
64 info_linear = info_node->info_linear; in machine__process_bpf_event_load()
66 for (i = 0; i < info_linear->info.nr_jited_ksyms; i++) { in machine__process_bpf_event_load()
67 u64 *addrs = (u64 *)(uintptr_t)(info_linear->info.jited_ksyms); in machine__process_bpf_event_load()
69 struct map *map = maps__find(&machine->kmaps, addr); in machine__process_bpf_event_load()
72 map->dso->binary_type = DSO_BINARY_TYPE__BPF_PROG_INFO; in machine__process_bpf_event_load()
73 map->dso->bpf_prog.id = id; in machine__process_bpf_event_load()
74 map->dso->bpf_prog.sub_id = i; in machine__process_bpf_event_load()
75 map->dso->bpf_prog.env = env; in machine__process_bpf_event_load()
81 int machine__process_bpf(struct machine *machine, union perf_event *event, in machine__process_bpf() argument
85 perf_event__fprintf_bpf(event, stdout); in machine__process_bpf()
87 switch (event->bpf.type) { in machine__process_bpf()
89 return machine__process_bpf_event_load(machine, event, sample); in machine__process_bpf()
99 pr_debug("unexpected bpf event type of %d\n", event->bpf.type); in machine__process_bpf()
117 return -1; in perf_env__fetch_btf()
119 node->id = btf_id; in perf_env__fetch_btf()
120 node->data_size = data_size; in perf_env__fetch_btf()
121 memcpy(node->data, data, data_size); in perf_env__fetch_btf()
132 u8 (*prog_tags)[BPF_TAG_SIZE] = (void *)(uintptr_t)(info->prog_tags); in synthesize_bpf_prog_name()
133 void *func_infos = (void *)(uintptr_t)(info->func_info); in synthesize_bpf_prog_name()
134 u32 sub_prog_cnt = info->nr_jited_ksyms; in synthesize_bpf_prog_name()
141 name_len += snprintf_hex(buf + name_len, size - name_len, in synthesize_bpf_prog_name()
144 finfo = func_infos + sub_id * info->func_info_rec_size; in synthesize_bpf_prog_name()
145 t = btf__type_by_id(btf, finfo->type_id); in synthesize_bpf_prog_name()
146 short_name = btf__name_by_offset(btf, t->name_off); in synthesize_bpf_prog_name()
149 if (info->name[0]) in synthesize_bpf_prog_name()
150 short_name = info->name; in synthesize_bpf_prog_name()
154 name_len += snprintf(buf + name_len, size - name_len, in synthesize_bpf_prog_name()
166 * -1 for failures;
167 * -2 for lack of kernel support.
173 union perf_event *event, in perf_event__synthesize_one_bpf_prog() argument
176 struct perf_record_ksymbol *ksymbol_event = &event->ksymbol; in perf_event__synthesize_one_bpf_prog()
177 struct perf_record_bpf_event *bpf_event = &event->bpf; in perf_event__synthesize_one_bpf_prog()
179 struct perf_tool *tool = session->tool; in perf_event__synthesize_one_bpf_prog()
189 * for perf-record and perf-report use header.env; in perf_event__synthesize_one_bpf_prog()
192 env = session->data ? &session->header.env : &perf_env; in perf_event__synthesize_one_bpf_prog()
206 return -1; in perf_event__synthesize_one_bpf_prog()
209 if (info_linear->info_len < offsetof(struct bpf_prog_info, prog_tags)) { in perf_event__synthesize_one_bpf_prog()
212 return -2; in perf_event__synthesize_one_bpf_prog()
215 info = &info_linear->info; in perf_event__synthesize_one_bpf_prog()
216 if (!info->jited_ksyms) { in perf_event__synthesize_one_bpf_prog()
218 return -1; in perf_event__synthesize_one_bpf_prog()
222 sub_prog_cnt = info->nr_jited_ksyms; in perf_event__synthesize_one_bpf_prog()
223 if (sub_prog_cnt != info->nr_prog_tags || in perf_event__synthesize_one_bpf_prog()
224 sub_prog_cnt != info->nr_jited_func_lens) { in perf_event__synthesize_one_bpf_prog()
226 return -1; in perf_event__synthesize_one_bpf_prog()
230 if (info->btf_id && info->nr_func_info && info->func_info_rec_size) { in perf_event__synthesize_one_bpf_prog()
232 if (sub_prog_cnt != info->nr_func_info) { in perf_event__synthesize_one_bpf_prog()
235 return -1; in perf_event__synthesize_one_bpf_prog()
237 btf = btf__load_from_kernel_by_id(info->btf_id); in perf_event__synthesize_one_bpf_prog()
239 pr_debug("%s: failed to get BTF of id %u, aborting\n", __func__, info->btf_id); in perf_event__synthesize_one_bpf_prog()
240 err = -1; in perf_event__synthesize_one_bpf_prog()
243 perf_env__fetch_btf(env, info->btf_id, btf); in perf_event__synthesize_one_bpf_prog()
248 __u32 *prog_lens = (__u32 *)(uintptr_t)(info->jited_func_lens); in perf_event__synthesize_one_bpf_prog()
249 __u64 *prog_addrs = (__u64 *)(uintptr_t)(info->jited_ksyms); in perf_event__synthesize_one_bpf_prog()
255 .size = offsetof(struct perf_record_ksymbol, name), in perf_event__synthesize_one_bpf_prog()
263 name_len = synthesize_bpf_prog_name(ksymbol_event->name, in perf_event__synthesize_one_bpf_prog()
265 ksymbol_event->header.size += PERF_ALIGN(name_len + 1, in perf_event__synthesize_one_bpf_prog()
268 memset((void *)event + event->header.size, 0, machine->id_hdr_size); in perf_event__synthesize_one_bpf_prog()
269 event->header.size += machine->id_hdr_size; in perf_event__synthesize_one_bpf_prog()
270 err = perf_tool__process_synth_event(tool, event, in perf_event__synthesize_one_bpf_prog()
274 if (!opts->no_bpf_event) { in perf_event__synthesize_one_bpf_prog()
283 .id = info->id, in perf_event__synthesize_one_bpf_prog()
285 memcpy(bpf_event->tag, info->tag, BPF_TAG_SIZE); in perf_event__synthesize_one_bpf_prog()
286 memset((void *)event + event->header.size, 0, machine->id_hdr_size); in perf_event__synthesize_one_bpf_prog()
287 event->header.size += machine->id_hdr_size; in perf_event__synthesize_one_bpf_prog()
292 err = -1; in perf_event__synthesize_one_bpf_prog()
296 info_node->info_linear = info_linear; in perf_event__synthesize_one_bpf_prog()
304 err = perf_tool__process_synth_event(tool, event, in perf_event__synthesize_one_bpf_prog()
311 return err ? -1 : 0; in perf_event__synthesize_one_bpf_prog()
315 union perf_event *event; member
322 process_bpf_image(char *name, u64 addr, struct kallsyms_parse *data) in process_bpf_image() argument
324 struct machine *machine = data->machine; in process_bpf_image()
325 union perf_event *event = data->event; in process_bpf_image() local
329 ksymbol = &event->ksymbol; in process_bpf_image()
334 .size = offsetof(struct perf_record_ksymbol, name), in process_bpf_image()
342 len = scnprintf(ksymbol->name, KSYM_NAME_LEN, "%s", name); in process_bpf_image()
343 ksymbol->header.size += PERF_ALIGN(len + 1, sizeof(u64)); in process_bpf_image()
344 memset((void *) event + event->header.size, 0, machine->id_hdr_size); in process_bpf_image()
345 event->header.size += machine->id_hdr_size; in process_bpf_image()
347 return perf_tool__process_synth_event(data->tool, event, machine, in process_bpf_image()
348 data->process); in process_bpf_image()
356 char *module, *name; in kallsyms_process_symbol() local
368 name = memdup(_name, (module - _name) + 1); in kallsyms_process_symbol()
369 if (!name) in kallsyms_process_symbol()
370 return -ENOMEM; in kallsyms_process_symbol()
372 name[module - _name] = 0; in kallsyms_process_symbol()
375 if ((sscanf(name, "bpf_trampoline_%lu", &id) == 1) || in kallsyms_process_symbol()
376 (sscanf(name, "bpf_dispatcher_%s", disp) == 1)) in kallsyms_process_symbol()
377 err = process_bpf_image(name, start, data); in kallsyms_process_symbol()
379 free(name); in kallsyms_process_symbol()
390 union perf_event *event; in perf_event__synthesize_bpf_events() local
395 event = malloc(sizeof(event->bpf) + KSYM_NAME_LEN + machine->id_hdr_size); in perf_event__synthesize_bpf_events()
396 if (!event) in perf_event__synthesize_bpf_events()
397 return -1; in perf_event__synthesize_bpf_events()
409 errno == EINVAL ? " -- kernel too old?" : ""); in perf_event__synthesize_bpf_events()
411 err = (errno == EINVAL || errno == EPERM) ? 0 : -1; in perf_event__synthesize_bpf_events()
423 event, opts); in perf_event__synthesize_bpf_events()
427 if (err == -2) in perf_event__synthesize_bpf_events()
433 /* Synthesize all the bpf images - trampolines/dispatchers. */ in perf_event__synthesize_bpf_events()
438 .event = event, in perf_event__synthesize_bpf_events()
441 .tool = session->tool, in perf_event__synthesize_bpf_events()
449 free(event); in perf_event__synthesize_bpf_events()
480 btf_id = info_linear->info.btf_id; in perf_env__add_bpf_info()
484 info_node->info_linear = info_linear; in perf_env__add_bpf_info()
505 static int bpf_event__sb_cb(union perf_event *event, void *data) in bpf_event__sb_cb() argument
509 if (event->header.type != PERF_RECORD_BPF_EVENT) in bpf_event__sb_cb()
510 return -1; in bpf_event__sb_cb()
512 switch (event->bpf.type) { in bpf_event__sb_cb()
514 perf_env__add_bpf_info(env, event->bpf.id); in bpf_event__sb_cb()
524 pr_debug("unexpected bpf event type of %d\n", event->bpf.type); in bpf_event__sb_cb()
555 __u32 *prog_lens = (__u32 *)(uintptr_t)(info->jited_func_lens); in bpf_event__print_bpf_prog_info()
556 __u64 *prog_addrs = (__u64 *)(uintptr_t)(info->jited_ksyms); in bpf_event__print_bpf_prog_info()
557 char name[KSYM_NAME_LEN]; in bpf_event__print_bpf_prog_info() local
561 sub_prog_cnt = info->nr_jited_ksyms; in bpf_event__print_bpf_prog_info()
562 if (sub_prog_cnt != info->nr_prog_tags || in bpf_event__print_bpf_prog_info()
563 sub_prog_cnt != info->nr_jited_func_lens) in bpf_event__print_bpf_prog_info()
566 if (info->btf_id) { in bpf_event__print_bpf_prog_info()
569 node = perf_env__find_btf(env, info->btf_id); in bpf_event__print_bpf_prog_info()
571 btf = btf__new((__u8 *)(node->data), in bpf_event__print_bpf_prog_info()
572 node->data_size); in bpf_event__print_bpf_prog_info()
576 synthesize_bpf_prog_name(name, KSYM_NAME_LEN, info, btf, 0); in bpf_event__print_bpf_prog_info()
578 info->id, name, prog_addrs[0], prog_lens[0]); in bpf_event__print_bpf_prog_info()
582 fprintf(fp, "# bpf_prog_info %u:\n", info->id); in bpf_event__print_bpf_prog_info()
584 synthesize_bpf_prog_name(name, KSYM_NAME_LEN, info, btf, i); in bpf_event__print_bpf_prog_info()
587 i, name, prog_addrs[i], prog_lens[i]); in bpf_event__print_bpf_prog_info()