1 /* SPDX-License-Identifier: GPL-2.0 */
6 #include <internal/xyarray.h>
8 #include "util/debug.h"
9 #include "util/evsel.h"
11 #include "util/bpf-filter.h"
12 #include "util/bpf-filter-flex.h"
13 #include "util/bpf-filter-bison.h"
15 #include "bpf_skel/sample-filter.h"
16 #include "bpf_skel/sample_filter.skel.h"
18 #define FD(e, x, y) (*(int *)xyarray__entry(e->core.fd, x, y))
20 int perf_bpf_filter__prepare(struct evsel *evsel)
23 struct sample_filter_bpf *skel;
24 struct bpf_program *prog;
25 struct bpf_link *link;
26 struct perf_bpf_filter_expr *expr;
28 skel = sample_filter_bpf__open_and_load();
30 pr_err("Failed to load perf sample-filter BPF skeleton\n");
35 fd = bpf_map__fd(skel->maps.filters);
36 list_for_each_entry(expr, &evsel->bpf_filters, list) {
37 struct perf_bpf_filter_entry entry = {
39 .flags = expr->sample_flags,
42 bpf_map_update_elem(fd, &i, &entry, BPF_ANY);
46 prog = skel->progs.perf_sample_filter;
47 for (x = 0; x < xyarray__max_x(evsel->core.fd); x++) {
48 for (y = 0; y < xyarray__max_y(evsel->core.fd); y++) {
49 link = bpf_program__attach_perf_event(prog, FD(evsel, x, y));
51 pr_err("Failed to attach perf sample-filter program\n");
56 evsel->bpf_skel = skel;
60 int perf_bpf_filter__destroy(struct evsel *evsel)
62 struct perf_bpf_filter_expr *expr, *tmp;
64 list_for_each_entry_safe(expr, tmp, &evsel->bpf_filters, list) {
65 list_del(&expr->list);
68 sample_filter_bpf__destroy(evsel->bpf_skel);
72 struct perf_bpf_filter_expr *perf_bpf_filter_expr__new(unsigned long sample_flags,
73 enum perf_bpf_filter_op op,
76 struct perf_bpf_filter_expr *expr;
78 expr = malloc(sizeof(*expr));
80 expr->sample_flags = sample_flags;
87 int perf_bpf_filter__parse(struct list_head *expr_head, const char *str)
89 YY_BUFFER_STATE buffer;
92 buffer = perf_bpf_filter__scan_string(str);
94 ret = perf_bpf_filter_parse(expr_head);
96 perf_bpf_filter__flush_buffer(buffer);
97 perf_bpf_filter__delete_buffer(buffer);
98 perf_bpf_filter_lex_destroy();