mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
Merge tag 'bpf-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
Pull bpf fixes from Alexei Starovoitov: - Fix memory leak of bpf_scc_info objects (Eduard Zingerman) - Fix a regression in the 'perf' tool caused by moving UID filtering to BPF (Ilya Leoshkevich) * tag 'bpf-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf: perf bpf-filter: Enable events manually libbpf: Add the ability to suppress perf event enablement bpf: Fix memory leak of bpf_scc_info objects
This commit is contained in:
@@ -23114,6 +23114,8 @@ static void free_states(struct bpf_verifier_env *env)
|
||||
|
||||
for (i = 0; i < env->scc_cnt; ++i) {
|
||||
info = env->scc_info[i];
|
||||
if (!info)
|
||||
continue;
|
||||
for (j = 0; j < info->num_visits; j++)
|
||||
free_backedges(&info->visits[j]);
|
||||
kvfree(info);
|
||||
@@ -24554,6 +24556,7 @@ dfs_continue:
|
||||
err = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
env->scc_cnt = next_scc_id;
|
||||
exit:
|
||||
kvfree(stack);
|
||||
kvfree(pre);
|
||||
|
||||
@@ -10965,11 +10965,14 @@ struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *p
|
||||
}
|
||||
link->link.fd = pfd;
|
||||
}
|
||||
if (ioctl(pfd, PERF_EVENT_IOC_ENABLE, 0) < 0) {
|
||||
err = -errno;
|
||||
pr_warn("prog '%s': failed to enable perf_event FD %d: %s\n",
|
||||
prog->name, pfd, errstr(err));
|
||||
goto err_out;
|
||||
|
||||
if (!OPTS_GET(opts, dont_enable, false)) {
|
||||
if (ioctl(pfd, PERF_EVENT_IOC_ENABLE, 0) < 0) {
|
||||
err = -errno;
|
||||
pr_warn("prog '%s': failed to enable perf_event FD %d: %s\n",
|
||||
prog->name, pfd, errstr(err));
|
||||
goto err_out;
|
||||
}
|
||||
}
|
||||
|
||||
return &link->link;
|
||||
|
||||
@@ -499,9 +499,11 @@ struct bpf_perf_event_opts {
|
||||
__u64 bpf_cookie;
|
||||
/* don't use BPF link when attach BPF program */
|
||||
bool force_ioctl_attach;
|
||||
/* don't automatically enable the event */
|
||||
bool dont_enable;
|
||||
size_t :0;
|
||||
};
|
||||
#define bpf_perf_event_opts__last_field force_ioctl_attach
|
||||
#define bpf_perf_event_opts__last_field dont_enable
|
||||
|
||||
LIBBPF_API struct bpf_link *
|
||||
bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd);
|
||||
|
||||
@@ -451,6 +451,8 @@ int perf_bpf_filter__prepare(struct evsel *evsel, struct target *target)
|
||||
struct bpf_link *link;
|
||||
struct perf_bpf_filter_entry *entry;
|
||||
bool needs_idx_hash = !target__has_cpu(target);
|
||||
DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts,
|
||||
.dont_enable = true);
|
||||
|
||||
entry = calloc(MAX_FILTERS, sizeof(*entry));
|
||||
if (entry == NULL)
|
||||
@@ -522,7 +524,8 @@ int perf_bpf_filter__prepare(struct evsel *evsel, struct target *target)
|
||||
prog = skel->progs.perf_sample_filter;
|
||||
for (x = 0; x < xyarray__max_x(evsel->core.fd); x++) {
|
||||
for (y = 0; y < xyarray__max_y(evsel->core.fd); y++) {
|
||||
link = bpf_program__attach_perf_event(prog, FD(evsel, x, y));
|
||||
link = bpf_program__attach_perf_event_opts(prog, FD(evsel, x, y),
|
||||
&pe_opts);
|
||||
if (IS_ERR(link)) {
|
||||
pr_err("Failed to attach perf sample-filter program\n");
|
||||
ret = PTR_ERR(link);
|
||||
|
||||
Reference in New Issue
Block a user