Lines Matching +full:event +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0
12 #include "bpf-event.h"
13 #include "bpf-utils.h"
23 #include "util/synthetic-events.h"
31 ret += snprintf(buf + ret, size - ret, "%02x", data[i]);
36 union perf_event *event,
40 struct perf_env *env = machine->env;
42 int id = event->bpf.id;
45 /* perf-record, no need to handle bpf-event */
52 info_linear = info_node->info_linear;
54 for (i = 0; i < info_linear->info.nr_jited_ksyms; i++) {
55 u64 *addrs = (u64 *)(uintptr_t)(info_linear->info.jited_ksyms);
63 dso__bpf_prog(dso)->id = id;
64 dso__bpf_prog(dso)->sub_id = i;
65 dso__bpf_prog(dso)->env = env;
72 int machine__process_bpf(struct machine *machine, union perf_event *event,
76 perf_event__fprintf_bpf(event, stdout);
78 switch (event->bpf.type) {
80 return machine__process_bpf_event_load(machine, event, sample);
90 pr_debug("unexpected bpf event type of %d\n", event->bpf.type);
108 return -1;
110 node->id = btf_id;
111 node->data_size = data_size;
112 memcpy(node->data, data, data_size);
117 return -1;
127 u8 (*prog_tags)[BPF_TAG_SIZE] = (void *)(uintptr_t)(info->prog_tags);
128 void *func_infos = (void *)(uintptr_t)(info->func_info);
129 u32 sub_prog_cnt = info->nr_jited_ksyms;
136 name_len += snprintf_hex(buf + name_len, size - name_len,
139 finfo = func_infos + sub_id * info->func_info_rec_size;
140 t = btf__type_by_id(btf, finfo->type_id);
141 short_name = btf__name_by_offset(btf, t->name_off);
144 if (info->name[0])
145 short_name = info->name;
149 name_len += snprintf(buf + name_len, size - name_len,
161 * -1 for failures;
162 * -2 for lack of kernel support.
168 union perf_event *event,
171 struct perf_record_ksymbol *ksymbol_event = &event->ksymbol;
172 struct perf_record_bpf_event *bpf_event = &event->bpf;
173 const struct perf_tool *tool = session->tool;
184 * for perf-record and perf-report use header.env;
187 env = session->data ? &session->header.env : &perf_env;
201 return -1;
204 if (info_linear->info_len < offsetof(struct bpf_prog_info, prog_tags)) {
207 return -2;
210 info = &info_linear->info;
211 if (!info->jited_ksyms) {
213 return -1;
217 sub_prog_cnt = info->nr_jited_ksyms;
218 if (sub_prog_cnt != info->nr_prog_tags ||
219 sub_prog_cnt != info->nr_jited_func_lens) {
221 return -1;
225 if (info->btf_id && info->nr_func_info && info->func_info_rec_size) {
227 if (sub_prog_cnt != info->nr_func_info) {
230 return -1;
232 btf = btf__load_from_kernel_by_id(info->btf_id);
234 pr_debug("%s: failed to get BTF of id %u, aborting\n", __func__, info->btf_id);
235 err = -1;
238 perf_env__fetch_btf(env, info->btf_id, btf);
243 __u32 *prog_lens = (__u32 *)(uintptr_t)(info->jited_func_lens);
244 __u64 *prog_addrs = (__u64 *)(uintptr_t)(info->jited_ksyms);
250 .size = offsetof(struct perf_record_ksymbol, name),
258 name_len = synthesize_bpf_prog_name(ksymbol_event->name,
260 ksymbol_event->header.size += PERF_ALIGN(name_len + 1,
263 memset((void *)event + event->header.size, 0, machine->id_hdr_size);
264 event->header.size += machine->id_hdr_size;
265 err = perf_tool__process_synth_event(tool, event,
269 if (!opts->no_bpf_event) {
278 .id = info->id,
280 memcpy(bpf_event->tag, info->tag, BPF_TAG_SIZE);
281 memset((void *)event + event->header.size, 0, machine->id_hdr_size);
282 event->header.size += machine->id_hdr_size;
287 err = -1;
291 info_node->info_linear = info_linear;
302 err = perf_tool__process_synth_event(tool, event,
309 return err ? -1 : 0;
313 union perf_event *event;
320 process_bpf_image(char *name, u64 addr, struct kallsyms_parse *data)
322 struct machine *machine = data->machine;
323 union perf_event *event = data->event;
327 ksymbol = &event->ksymbol;
332 .size = offsetof(struct perf_record_ksymbol, name),
340 len = scnprintf(ksymbol->name, KSYM_NAME_LEN, "%s", name);
341 ksymbol->header.size += PERF_ALIGN(len + 1, sizeof(u64));
342 memset((void *) event + event->header.size, 0, machine->id_hdr_size);
343 event->header.size += machine->id_hdr_size;
345 return perf_tool__process_synth_event(data->tool, event, machine,
346 data->process);
354 char *module, *name;
366 name = memdup(_name, (module - _name) + 1);
367 if (!name)
368 return -ENOMEM;
370 name[module - _name] = 0;
373 if ((sscanf(name, "bpf_trampoline_%lu", &id) == 1) ||
374 (sscanf(name, "bpf_dispatcher_%s", disp) == 1))
375 err = process_bpf_image(name, start, data);
377 free(name);
388 union perf_event *event;
393 if (opts->no_bpf_event)
396 event = malloc(sizeof(event->bpf) + KSYM_NAME_LEN + machine->id_hdr_size);
397 if (!event)
398 return -1;
410 errno == EINVAL ? " -- kernel too old?" : "");
412 err = (errno == EINVAL || errno == EPERM) ? 0 : -1;
424 event, opts);
428 if (err == -2)
434 /* Synthesize all the bpf images - trampolines/dispatchers. */
439 .event = event,
442 .tool = session->tool,
450 free(event);
481 btf_id = info_linear->info.btf_id;
485 info_node->info_linear = info_linear;
509 static int bpf_event__sb_cb(union perf_event *event, void *data)
513 if (event->header.type != PERF_RECORD_BPF_EVENT)
514 return -1;
516 switch (event->bpf.type) {
518 perf_env__add_bpf_info(env, event->bpf.id);
528 pr_debug("unexpected bpf event type of %d\n", event->bpf.type);
559 __u32 *prog_lens = (__u32 *)(uintptr_t)(info->jited_func_lens);
560 __u64 *prog_addrs = (__u64 *)(uintptr_t)(info->jited_ksyms);
561 char name[KSYM_NAME_LEN];
565 sub_prog_cnt = info->nr_jited_ksyms;
566 if (sub_prog_cnt != info->nr_prog_tags ||
567 sub_prog_cnt != info->nr_jited_func_lens)
570 if (info->btf_id) {
573 node = __perf_env__find_btf(env, info->btf_id);
575 btf = btf__new((__u8 *)(node->data),
576 node->data_size);
580 synthesize_bpf_prog_name(name, KSYM_NAME_LEN, info, btf, 0);
582 info->id, name, prog_addrs[0], prog_lens[0]);
586 fprintf(fp, "# bpf_prog_info %u:\n", info->id);
588 synthesize_bpf_prog_name(name, KSYM_NAME_LEN, info, btf, i);
591 i, name, prog_addrs[i], prog_lens[i]);