Commit c30a1353 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents 2988dfed 0e260fc7
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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 @@ static int compute_scc(struct bpf_verifier_env *env)
		err = -ENOMEM;
		goto exit;
	}
	env->scc_cnt = next_scc_id;
exit:
	kvfree(stack);
	kvfree(pre);
+8 −5
Original line number Diff line number Diff line
@@ -10965,12 +10965,15 @@ struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *p
		}
		link->link.fd = pfd;
	}

	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;
err_out:
+3 −1
Original line number Diff line number Diff line
@@ -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);
+4 −1
Original line number Diff line number Diff line
@@ -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);