BPF List
 help / color / mirror / Atom feed
* [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules
@ 2024-01-03 19:05 Dmitrii Dolgov
  2024-01-03 19:05 ` [PATCH bpf-next v12 1/4] bpf: " Dmitrii Dolgov
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Dmitrii Dolgov @ 2024-01-03 19:05 UTC (permalink / raw)
  To: bpf
  Cc: ast, daniel, andrii, martin.lau, song, yonghong.song,
	dan.carpenter, olsajiri, asavkov, Dmitrii Dolgov

Currently, it's not allowed to attach an fentry/fexit prog to another
fentry/fexit. At the same time it's not uncommon to see a tracing
program with lots of logic in use, and the attachment limitation
prevents usage of fentry/fexit for performance analysis (e.g. with
"bpftool prog profile" command) in this case. An example could be
falcosecurity libs project that uses tp_btf tracing programs for
offloading certain part of logic into tail-called programs, but the
use-case is still generic enough -- a tracing program could be
complicated and heavy enough to warrant its profiling, yet frustratingly
it's not possible to do so use best tooling for that.

Following the corresponding discussion [1], the reason for that is to
avoid tracing progs call cycles without introducing more complex
solutions. But currently it seems impossible to load and attach tracing
programs in a way that will form such a cycle. Replace "no same type"
requirement with verification that no more than one level of attachment
nesting is allowed. In this way only one fentry/fexit program could be
attached to another fentry/fexit to cover profiling use case, and still
no cycle could be formed.

The series contains a test for recursive attachment, as well as a fix +
test for an issue in re-attachment branch of bpf_tracing_prog_attach.
When preparing the test for the main change set, I've stumbled upon the
possibility to construct a sequence of events when attach_btf would be
NULL while computing a trampoline key. It doesn't look like this issue
is triggered by the main change, because the reproduces doesn't actually
need to have an fentry attachment chain.

[1]: https://lore.kernel.org/bpf/20191108064039.2041889-16-ast@kernel.org/

Dmitrii Dolgov (3):
  bpf: Relax tracing prog recursive attach rules
  selftests/bpf: Add test for recursive attachment of tracing progs
  selftests/bpf: Test re-attachment fix for bpf_tracing_prog_attach

Jiri Olsa (1):
  bpf: Fix re-attachment branch in bpf_tracing_prog_attach

 include/linux/bpf.h                           |   1 +
 kernel/bpf/syscall.c                          |  32 +++-
 kernel/bpf/verifier.c                         |  39 +++--
 .../bpf/prog_tests/recursive_attach.c         | 151 ++++++++++++++++++
 .../selftests/bpf/progs/fentry_recursive.c    |  16 ++
 .../bpf/progs/fentry_recursive_target.c       |  27 ++++
 6 files changed, 251 insertions(+), 15 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/recursive_attach.c
 create mode 100644 tools/testing/selftests/bpf/progs/fentry_recursive.c
 create mode 100644 tools/testing/selftests/bpf/progs/fentry_recursive_target.c


base-commit: 40d0eb0259ae77ace3e81d7454d1068c38bc95c2
-- 
2.41.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH bpf-next v12 1/4] bpf: Relax tracing prog recursive attach rules
  2024-01-03 19:05 [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules Dmitrii Dolgov
@ 2024-01-03 19:05 ` Dmitrii Dolgov
  2024-01-03 19:05 ` [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs Dmitrii Dolgov
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Dmitrii Dolgov @ 2024-01-03 19:05 UTC (permalink / raw)
  To: bpf
  Cc: ast, daniel, andrii, martin.lau, song, yonghong.song,
	dan.carpenter, olsajiri, asavkov, Dmitrii Dolgov

Currently, it's not allowed to attach an fentry/fexit prog to another
one fentry/fexit. At the same time it's not uncommon to see a tracing
program with lots of logic in use, and the attachment limitation
prevents usage of fentry/fexit for performance analysis (e.g. with
"bpftool prog profile" command) in this case. An example could be
falcosecurity libs project that uses tp_btf tracing programs.

Following the corresponding discussion [1], the reason for that is to
avoid tracing progs call cycles without introducing more complex
solutions. But currently it seems impossible to load and attach tracing
programs in a way that will form such a cycle. The limitation is coming
from the fact that attach_prog_fd is specified at the prog load (thus
making it impossible to attach to a program loaded after it in this
way), as well as tracing progs not implementing link_detach.

Replace "no same type" requirement with verification that no more than
one level of attachment nesting is allowed. In this way only one
fentry/fexit program could be attached to another fentry/fexit to cover
profiling use case, and still no cycle could be formed. To implement,
add a new field into bpf_prog_aux to track nested attachment for tracing
programs.

[1]: https://lore.kernel.org/bpf/20191108064039.2041889-16-ast@kernel.org/

Acked-by: Jiri Olsa <olsajiri@gmail.com>
Acked-by: Song Liu <song@kernel.org>
Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>
---
Previous discussion: https://lore.kernel.org/bpf/20231222151153.31291-1-9erthalion6@gmail.com/

Changes in v10:
    - Set attach_tracing_prog flag at load time.

Changes in v9:
    - Formatting

Changes in v8:
    - Move bookkeping in bpf_tracing_link_release under the tgt_prog
      condition.
    - Fix some indentation issues.

Changes in v7:
    - Replace attach_depth with a boolean flag to indicate a program is
      already tracing an fentry/fexit.

Changes in v6:
    - Apply nesting level limitation only to tracing programs, otherwise
      it's possible to apply it in "fentry->extension" case and break it

Changes in v5:
    - Remove follower_cnt and drop unreachable cycle prevention condition
    - Allow only one level of attachment nesting
    - Do not display attach_depth in bpftool, as it doesn't make sense
      anymore

Changes in v3:
    - Fix incorrect decreasing of attach_depth, setting to 0 instead
    - Place bookkeeping later, to not miss a cleanup if needed
    - Display attach_depth in bpftool only if the value is not 0

Changes in v2:
    - Verify tgt_prog is not null
    - Replace boolean followed with number of followers, to handle
      multiple progs attaching/detaching

 include/linux/bpf.h   |  1 +
 kernel/bpf/syscall.c  | 23 ++++++++++++++++++++++-
 kernel/bpf/verifier.c | 39 +++++++++++++++++++++++++--------------
 3 files changed, 48 insertions(+), 15 deletions(-)

diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index eb447b0a9423..e7393674ab94 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -1414,6 +1414,7 @@ struct bpf_prog_aux {
 	bool dev_bound; /* Program is bound to the netdev. */
 	bool offload_requested; /* Program is bound and offloaded to the netdev. */
 	bool attach_btf_trace; /* true if attaching to BTF-enabled raw tp */
+	bool attach_tracing_prog; /* true if tracing another tracing program */
 	bool func_proto_unreliable;
 	bool sleepable;
 	bool tail_call_reachable;
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 5e43ddd1b83f..c40cad8886e9 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -2702,6 +2702,22 @@ static int bpf_prog_load(union bpf_attr *attr, bpfptr_t uattr, u32 uattr_size)
 			goto free_prog_sec;
 	}
 
+	/*
+	 * Bookkeeping for managing the program attachment chain.
+	 *
+	 * It might be tempting to set attach_tracing_prog flag at the attachment
+	 * time, but this will not prevent from loading bunch of tracing prog
+	 * first, then attach them one to another.
+	 *
+	 * The flag attach_tracing_prog is set for the whole program lifecycle, and
+	 * doesn't have to be cleared in bpf_tracing_link_release, since tracing
+	 * programs cannot change attachment target.
+	 */
+	if (type == BPF_PROG_TYPE_TRACING && dst_prog &&
+	    dst_prog->type == BPF_PROG_TYPE_TRACING) {
+		prog->aux->attach_tracing_prog = true;
+	}
+
 	/* find program type: socket_filter vs tracing_filter */
 	err = find_prog_type(type, prog);
 	if (err < 0)
@@ -3135,7 +3151,12 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog,
 	}
 
 	if (tgt_prog_fd) {
-		/* For now we only allow new targets for BPF_PROG_TYPE_EXT */
+		/*
+		 * For now we only allow new targets for BPF_PROG_TYPE_EXT. If this
+		 * part would be changed to implement the same for
+		 * BPF_PROG_TYPE_TRACING, do not forget to update the way how
+		 * attach_tracing_prog flag is set.
+		 */
 		if (prog->type != BPF_PROG_TYPE_EXT) {
 			err = -EINVAL;
 			goto out_put_prog;
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 8e7b6072e3f4..f8c15ce8fd05 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -20077,6 +20077,7 @@ int bpf_check_attach_target(struct bpf_verifier_log *log,
 			    struct bpf_attach_target_info *tgt_info)
 {
 	bool prog_extension = prog->type == BPF_PROG_TYPE_EXT;
+	bool prog_tracing = prog->type == BPF_PROG_TYPE_TRACING;
 	const char prefix[] = "btf_trace_";
 	int ret = 0, subprog = -1, i;
 	const struct btf_type *t;
@@ -20147,10 +20148,21 @@ int bpf_check_attach_target(struct bpf_verifier_log *log,
 			bpf_log(log, "Can attach to only JITed progs\n");
 			return -EINVAL;
 		}
-		if (tgt_prog->type == prog->type) {
-			/* Cannot fentry/fexit another fentry/fexit program.
-			 * Cannot attach program extension to another extension.
-			 * It's ok to attach fentry/fexit to extension program.
+		if (prog_tracing) {
+			if (aux->attach_tracing_prog) {
+				/*
+				 * Target program is an fentry/fexit which is already attached
+				 * to another tracing program. More levels of nesting
+				 * attachment are not allowed.
+				 */
+				bpf_log(log, "Cannot nest tracing program attach more than once\n");
+				return -EINVAL;
+			}
+		} else if (tgt_prog->type == prog->type) {
+			/*
+			 * To avoid potential call chain cycles, prevent attaching of a
+			 * program extension to another extension. It's ok to attach
+			 * fentry/fexit to extension program.
 			 */
 			bpf_log(log, "Cannot recursively attach\n");
 			return -EINVAL;
@@ -20163,16 +20175,15 @@ int bpf_check_attach_target(struct bpf_verifier_log *log,
 			 * except fentry/fexit. The reason is the following.
 			 * The fentry/fexit programs are used for performance
 			 * analysis, stats and can be attached to any program
-			 * type except themselves. When extension program is
-			 * replacing XDP function it is necessary to allow
-			 * performance analysis of all functions. Both original
-			 * XDP program and its program extension. Hence
-			 * attaching fentry/fexit to BPF_PROG_TYPE_EXT is
-			 * allowed. If extending of fentry/fexit was allowed it
-			 * would be possible to create long call chain
-			 * fentry->extension->fentry->extension beyond
-			 * reasonable stack size. Hence extending fentry is not
-			 * allowed.
+			 * type. When extension program is replacing XDP function
+			 * it is necessary to allow performance analysis of all
+			 * functions. Both original XDP program and its program
+			 * extension. Hence attaching fentry/fexit to
+			 * BPF_PROG_TYPE_EXT is allowed. If extending of
+			 * fentry/fexit was allowed it would be possible to create
+			 * long call chain fentry->extension->fentry->extension
+			 * beyond reasonable stack size. Hence extending fentry
+			 * is not allowed.
 			 */
 			bpf_log(log, "Cannot extend fentry/fexit\n");
 			return -EINVAL;
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs
  2024-01-03 19:05 [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules Dmitrii Dolgov
  2024-01-03 19:05 ` [PATCH bpf-next v12 1/4] bpf: " Dmitrii Dolgov
@ 2024-01-03 19:05 ` Dmitrii Dolgov
  2024-01-03 19:47   ` Song Liu
  2024-01-03 19:05 ` [PATCH bpf-next v12 3/4] bpf: Fix re-attachment branch in bpf_tracing_prog_attach Dmitrii Dolgov
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Dmitrii Dolgov @ 2024-01-03 19:05 UTC (permalink / raw)
  To: bpf
  Cc: ast, daniel, andrii, martin.lau, song, yonghong.song,
	dan.carpenter, olsajiri, asavkov, Dmitrii Dolgov

Verify the fact that only one fentry prog could be attached to another
fentry, building up an attachment chain of limited size. Use existing
bpf_testmod as a start of the chain.

Acked-by: Jiri Olsa <olsajiri@gmail.com>
Acked-by: Song Liu <song@kernel.org>
Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>
---
Changes in v12:
    - Skip close_progs at the beginning, remove NULL checks when closing
      progs, adjust comments style.

Changes in v11:
    - Use subtests, reduce code duplication

Changes in v10:
    - Add tests for loading tracing progs without attaching, and
      detaching tracing progs.

Changes in v8:
    - Cleanup test bpf progs and the content of first/second condition
      in the loop.

Changes in v5:
    - Test only one level of attachment

 .../bpf/prog_tests/recursive_attach.c         | 107 ++++++++++++++++++
 .../selftests/bpf/progs/fentry_recursive.c    |  16 +++
 .../bpf/progs/fentry_recursive_target.c       |  17 +++
 3 files changed, 140 insertions(+)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/recursive_attach.c
 create mode 100644 tools/testing/selftests/bpf/progs/fentry_recursive.c
 create mode 100644 tools/testing/selftests/bpf/progs/fentry_recursive_target.c

diff --git a/tools/testing/selftests/bpf/prog_tests/recursive_attach.c b/tools/testing/selftests/bpf/prog_tests/recursive_attach.c
new file mode 100644
index 000000000000..4bd0a0e4231e
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/recursive_attach.c
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2023 Red Hat, Inc. */
+#include <test_progs.h>
+#include "fentry_recursive.skel.h"
+#include "fentry_recursive_target.skel.h"
+#include <bpf/btf.h>
+#include "bpf/libbpf_internal.h"
+
+/* Test recursive attachment of tracing progs with more than one nesting level
+ * is not possible. Create a chain of attachment, verify that the last prog
+ * will fail. Depending on the arguments, following cases are tested:
+ *
+ * - Recursive loading of tracing progs, without attaching (attach = false,
+ *   detach = false). The chain looks like this:
+ *       load target
+ *       load fentry1 -> target
+ *       load fentry2 -> fentry1 (fail)
+ *
+ * - Recursive attach of tracing progs (attach = true, detach = false). The
+ *   chain looks like this:
+ *       load target
+ *       load fentry1 -> target
+ *       attach fentry1 -> target
+ *       load fentry2 -> fentry1 (fail)
+ *
+ * - Recursive attach and detach of tracing progs (attach = true, detach =
+ *   true). This validates that attach_tracing_prog flag will be set throughout
+ *   the whole lifecycle of an fentry prog, independently from whether it's
+ *   detached. The chain looks like this:
+ *       load target
+ *       load fentry1 -> target
+ *       attach fentry1 -> target
+ *       detach fentry1
+ *       load fentry2 -> fentry1 (fail)
+ */
+static void test_recursive_fentry_chain(bool attach, bool detach)
+{
+	struct fentry_recursive_target *target_skel = NULL;
+	struct fentry_recursive *tracing_chain[2] = {};
+	struct bpf_program *prog;
+	int prev_fd, err;
+
+	target_skel = fentry_recursive_target__open_and_load();
+	if (!ASSERT_OK_PTR(target_skel, "fentry_recursive_target__open_and_load"))
+		return;
+
+	/* Create an attachment chain with two fentry progs */
+	for (int i = 0; i < 2; i++) {
+		tracing_chain[i] = fentry_recursive__open();
+		if (!ASSERT_OK_PTR(tracing_chain[i], "fentry_recursive__open"))
+			goto close_prog;
+
+		/* The first prog in the chain is going to be attached to the target
+		 * fentry program, the second one to the previous in the chain.
+		 */
+		prog = tracing_chain[i]->progs.recursive_attach;
+		if (i == 0) {
+			prev_fd = bpf_program__fd(target_skel->progs.test1);
+			err = bpf_program__set_attach_target(prog, prev_fd, "test1");
+		} else {
+			prev_fd = bpf_program__fd(tracing_chain[i-1]->progs.recursive_attach);
+			err = bpf_program__set_attach_target(prog, prev_fd, "recursive_attach");
+		}
+
+		if (!ASSERT_OK(err, "bpf_program__set_attach_target"))
+			goto close_prog;
+
+		err = fentry_recursive__load(tracing_chain[i]);
+		/* The first attach should succeed, the second fail */
+		if (i == 0) {
+			if (!ASSERT_OK(err, "fentry_recursive__load"))
+				goto close_prog;
+
+			if (attach) {
+				err = fentry_recursive__attach(tracing_chain[i]);
+				if (!ASSERT_OK(err, "fentry_recursive__attach"))
+					goto close_prog;
+			}
+
+			if (detach) {
+				/* Flag attach_tracing_prog should still be set, preventing
+				 * attachment of the following prog.
+				 */
+				fentry_recursive__detach(tracing_chain[i]);
+			}
+		} else {
+			if (!ASSERT_ERR(err, "fentry_recursive__load"))
+				goto close_prog;
+		}
+	}
+
+close_prog:
+	fentry_recursive_target__destroy(target_skel);
+	for (int i = 0; i < 2; i++) {
+		fentry_recursive__destroy(tracing_chain[i]);
+	}
+}
+
+void test_recursive_fentry(void)
+{
+	if (test__start_subtest("attach"))
+		test_recursive_fentry_chain(true, false);
+	if (test__start_subtest("load"))
+		test_recursive_fentry_chain(false, false);
+	if (test__start_subtest("detach"))
+		test_recursive_fentry_chain(true, true);
+}
diff --git a/tools/testing/selftests/bpf/progs/fentry_recursive.c b/tools/testing/selftests/bpf/progs/fentry_recursive.c
new file mode 100644
index 000000000000..b9e4d35ac597
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/fentry_recursive.c
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2023 Red Hat, Inc. */
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+char _license[] SEC("license") = "GPL";
+
+/*
+ * Dummy fentry bpf prog for testing fentry attachment chains
+ */
+SEC("fentry/XXX")
+int BPF_PROG(recursive_attach, int a)
+{
+	return 0;
+}
diff --git a/tools/testing/selftests/bpf/progs/fentry_recursive_target.c b/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
new file mode 100644
index 000000000000..6e0b5c716f8e
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2023 Red Hat, Inc. */
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+char _license[] SEC("license") = "GPL";
+
+/*
+ * Dummy fentry bpf prog for testing fentry attachment chains. It's going to be
+ * a start of the chain.
+ */
+SEC("fentry/bpf_testmod_fentry_test1")
+int BPF_PROG(test1, int a)
+{
+	return 0;
+}
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH bpf-next v12 3/4] bpf: Fix re-attachment branch in bpf_tracing_prog_attach
  2024-01-03 19:05 [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules Dmitrii Dolgov
  2024-01-03 19:05 ` [PATCH bpf-next v12 1/4] bpf: " Dmitrii Dolgov
  2024-01-03 19:05 ` [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs Dmitrii Dolgov
@ 2024-01-03 19:05 ` Dmitrii Dolgov
  2024-01-03 19:05 ` [PATCH bpf-next v12 4/4] selftests/bpf: Test re-attachment fix for bpf_tracing_prog_attach Dmitrii Dolgov
  2024-01-05  4:50 ` [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules patchwork-bot+netdevbpf
  4 siblings, 0 replies; 12+ messages in thread
From: Dmitrii Dolgov @ 2024-01-03 19:05 UTC (permalink / raw)
  To: bpf
  Cc: ast, daniel, andrii, martin.lau, song, yonghong.song,
	dan.carpenter, olsajiri, asavkov, stable, Dmitrii Dolgov

From: Jiri Olsa <olsajiri@gmail.com>

The following case can cause a crash due to missing attach_btf:

1) load rawtp program
2) load fentry program with rawtp as target_fd
3) create tracing link for fentry program with target_fd = 0
4) repeat 3

In the end we have:

- prog->aux->dst_trampoline == NULL
- tgt_prog == NULL (because we did not provide target_fd to link_create)
- prog->aux->attach_btf == NULL (the program was loaded with attach_prog_fd=X)
- the program was loaded for tgt_prog but we have no way to find out which one

    BUG: kernel NULL pointer dereference, address: 0000000000000058
    Call Trace:
     <TASK>
     ? __die+0x20/0x70
     ? page_fault_oops+0x15b/0x430
     ? fixup_exception+0x22/0x330
     ? exc_page_fault+0x6f/0x170
     ? asm_exc_page_fault+0x22/0x30
     ? bpf_tracing_prog_attach+0x279/0x560
     ? btf_obj_id+0x5/0x10
     bpf_tracing_prog_attach+0x439/0x560
     __sys_bpf+0x1cf4/0x2de0
     __x64_sys_bpf+0x1c/0x30
     do_syscall_64+0x41/0xf0
     entry_SYSCALL_64_after_hwframe+0x6e/0x76

Return -EINVAL in this situation.

Fixes: f3a95075549e0 ("bpf: Allow trampoline re-attach for tracing and lsm programs")
Cc: stable@vger.kernel.org
Signed-off-by: Jiri Olsa <olsajiri@gmail.com>
Acked-by: Jiri Olsa <olsajiri@gmail.com>
Acked-by: Song Liu <song@kernel.org>
Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>
---
 kernel/bpf/syscall.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index c40cad8886e9..5096ddfbe426 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -3201,6 +3201,10 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog,
 	 *
 	 * - if prog->aux->dst_trampoline and tgt_prog is NULL, the program
 	 *   was detached and is going for re-attachment.
+	 *
+	 * - if prog->aux->dst_trampoline is NULL and tgt_prog and prog->aux->attach_btf
+	 *   are NULL, then program was already attached and user did not provide
+	 *   tgt_prog_fd so we have no way to find out or create trampoline
 	 */
 	if (!prog->aux->dst_trampoline && !tgt_prog) {
 		/*
@@ -3214,6 +3218,11 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog,
 			err = -EINVAL;
 			goto out_unlock;
 		}
+		/* We can allow re-attach only if we have valid attach_btf. */
+		if (!prog->aux->attach_btf) {
+			err = -EINVAL;
+			goto out_unlock;
+		}
 		btf_id = prog->aux->attach_btf_id;
 		key = bpf_trampoline_compute_key(NULL, prog->aux->attach_btf, btf_id);
 	}
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH bpf-next v12 4/4] selftests/bpf: Test re-attachment fix for bpf_tracing_prog_attach
  2024-01-03 19:05 [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules Dmitrii Dolgov
                   ` (2 preceding siblings ...)
  2024-01-03 19:05 ` [PATCH bpf-next v12 3/4] bpf: Fix re-attachment branch in bpf_tracing_prog_attach Dmitrii Dolgov
@ 2024-01-03 19:05 ` Dmitrii Dolgov
  2024-01-03 19:47   ` Song Liu
  2024-01-05  4:50 ` [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules patchwork-bot+netdevbpf
  4 siblings, 1 reply; 12+ messages in thread
From: Dmitrii Dolgov @ 2024-01-03 19:05 UTC (permalink / raw)
  To: bpf
  Cc: ast, daniel, andrii, martin.lau, song, yonghong.song,
	dan.carpenter, olsajiri, asavkov, Dmitrii Dolgov

Add a test case to verify the fix for "prog->aux->dst_trampoline and
tgt_prog is NULL" branch in bpf_tracing_prog_attach. The sequence of
events:

1. load rawtp program
2. load fentry program with rawtp as target_fd
3. create tracing link for fentry program with target_fd = 0
4. repeat 3

Acked-by: Jiri Olsa <olsajiri@gmail.com>
Acked-by: Song Liu <song@kernel.org>
Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>
---
Changes in v12:
    - Adjust comments style.

Changes in v8:
    - Cleanup, remove link opts and if condition around assert for the
      expected error, unneeded parts of the test bpf prog and some
      indendation improvements.

 .../bpf/prog_tests/recursive_attach.c         | 44 +++++++++++++++++++
 .../bpf/progs/fentry_recursive_target.c       | 10 +++++
 2 files changed, 54 insertions(+)

diff --git a/tools/testing/selftests/bpf/prog_tests/recursive_attach.c b/tools/testing/selftests/bpf/prog_tests/recursive_attach.c
index 4bd0a0e4231e..8100509e561b 100644
--- a/tools/testing/selftests/bpf/prog_tests/recursive_attach.c
+++ b/tools/testing/selftests/bpf/prog_tests/recursive_attach.c
@@ -105,3 +105,47 @@ void test_recursive_fentry(void)
 	if (test__start_subtest("detach"))
 		test_recursive_fentry_chain(true, true);
 }
+
+/* Test that a tracing prog reattachment (when we land in
+ * "prog->aux->dst_trampoline and tgt_prog is NULL" branch in
+ * bpf_tracing_prog_attach) does not lead to a crash due to missing attach_btf
+ */
+void test_fentry_attach_btf_presence(void)
+{
+	struct fentry_recursive_target *target_skel = NULL;
+	struct fentry_recursive *tracing_skel = NULL;
+	struct bpf_program *prog;
+	int err, link_fd, tgt_prog_fd;
+
+	target_skel = fentry_recursive_target__open_and_load();
+	if (!ASSERT_OK_PTR(target_skel, "fentry_recursive_target__open_and_load"))
+		goto close_prog;
+
+	tracing_skel = fentry_recursive__open();
+	if (!ASSERT_OK_PTR(tracing_skel, "fentry_recursive__open"))
+		goto close_prog;
+
+	prog = tracing_skel->progs.recursive_attach;
+	tgt_prog_fd = bpf_program__fd(target_skel->progs.fentry_target);
+	err = bpf_program__set_attach_target(prog, tgt_prog_fd, "fentry_target");
+	if (!ASSERT_OK(err, "bpf_program__set_attach_target"))
+		goto close_prog;
+
+	err = fentry_recursive__load(tracing_skel);
+	if (!ASSERT_OK(err, "fentry_recursive__load"))
+		goto close_prog;
+
+	tgt_prog_fd = bpf_program__fd(tracing_skel->progs.recursive_attach);
+	link_fd = bpf_link_create(tgt_prog_fd, 0, BPF_TRACE_FENTRY, NULL);
+	if (!ASSERT_GE(link_fd, 0, "link_fd"))
+		goto close_prog;
+
+	fentry_recursive__detach(tracing_skel);
+
+	err = fentry_recursive__attach(tracing_skel);
+	ASSERT_ERR(err, "fentry_recursive__attach");
+
+close_prog:
+	fentry_recursive_target__destroy(target_skel);
+	fentry_recursive__destroy(tracing_skel);
+}
diff --git a/tools/testing/selftests/bpf/progs/fentry_recursive_target.c b/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
index 6e0b5c716f8e..51af8426da3a 100644
--- a/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
+++ b/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
@@ -15,3 +15,13 @@ int BPF_PROG(test1, int a)
 {
 	return 0;
 }
+
+/*
+ * Dummy bpf prog for testing attach_btf presence when attaching an fentry
+ * program.
+ */
+SEC("raw_tp/sys_enter")
+int BPF_PROG(fentry_target, struct pt_regs *regs, long id)
+{
+	return 0;
+}
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs
  2024-01-03 19:05 ` [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs Dmitrii Dolgov
@ 2024-01-03 19:47   ` Song Liu
  2024-01-03 20:18     ` Dmitry Dolgov
  0 siblings, 1 reply; 12+ messages in thread
From: Song Liu @ 2024-01-03 19:47 UTC (permalink / raw)
  To: Dmitrii Dolgov
  Cc: bpf, ast, daniel, andrii, martin.lau, yonghong.song,
	dan.carpenter, olsajiri, asavkov

On Wed, Jan 3, 2024 at 11:06 AM Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
>
[...]
> +
> +/*
> + * Dummy fentry bpf prog for testing fentry attachment chains
> + */

Comment  style. This could fit in one line.

> +SEC("fentry/XXX")
> +int BPF_PROG(recursive_attach, int a)
> +{
> +       return 0;
> +}
> diff --git a/tools/testing/selftests/bpf/progs/fentry_recursive_target.c b/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
> new file mode 100644
> index 000000000000..6e0b5c716f8e
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
> @@ -0,0 +1,17 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright (c) 2023 Red Hat, Inc. */
> +#include <linux/bpf.h>
> +#include <bpf/bpf_helpers.h>
> +#include <bpf/bpf_tracing.h>
> +
> +char _license[] SEC("license") = "GPL";
> +
> +/*
> + * Dummy fentry bpf prog for testing fentry attachment chains. It's going to be
> + * a start of the chain.
> + */

Comment  style. I guess we don't need to respin the set just for this.

> +SEC("fentry/bpf_testmod_fentry_test1")
> +int BPF_PROG(test1, int a)
> +{
> +       return 0;
> +}
> --
> 2.41.0
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH bpf-next v12 4/4] selftests/bpf: Test re-attachment fix for bpf_tracing_prog_attach
  2024-01-03 19:05 ` [PATCH bpf-next v12 4/4] selftests/bpf: Test re-attachment fix for bpf_tracing_prog_attach Dmitrii Dolgov
@ 2024-01-03 19:47   ` Song Liu
  0 siblings, 0 replies; 12+ messages in thread
From: Song Liu @ 2024-01-03 19:47 UTC (permalink / raw)
  To: Dmitrii Dolgov
  Cc: bpf, ast, daniel, andrii, martin.lau, yonghong.song,
	dan.carpenter, olsajiri, asavkov

On Wed, Jan 3, 2024 at 11:06 AM Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
>
[...]
> diff --git a/tools/testing/selftests/bpf/progs/fentry_recursive_target.c b/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
> index 6e0b5c716f8e..51af8426da3a 100644
> --- a/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
> +++ b/tools/testing/selftests/bpf/progs/fentry_recursive_target.c
> @@ -15,3 +15,13 @@ int BPF_PROG(test1, int a)
>  {
>         return 0;
>  }
> +
> +/*
> + * Dummy bpf prog for testing attach_btf presence when attaching an fentry
> + * program.
> + */

Comment style.

> +SEC("raw_tp/sys_enter")
> +int BPF_PROG(fentry_target, struct pt_regs *regs, long id)
> +{
> +       return 0;
> +}
> --
> 2.41.0
>
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs
  2024-01-03 19:47   ` Song Liu
@ 2024-01-03 20:18     ` Dmitry Dolgov
  2024-01-03 20:47       ` Song Liu
  0 siblings, 1 reply; 12+ messages in thread
From: Dmitry Dolgov @ 2024-01-03 20:18 UTC (permalink / raw)
  To: Song Liu
  Cc: bpf, ast, daniel, andrii, martin.lau, yonghong.song,
	dan.carpenter, olsajiri, asavkov

> On Wed, Jan 03, 2024 at 11:47:14AM -0800, Song Liu wrote:
> On Wed, Jan 3, 2024 at 11:06 AM Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
> > +char _license[] SEC("license") = "GPL";
> > +
> > +/*
> > + * Dummy fentry bpf prog for testing fentry attachment chains. It's going to be
> > + * a start of the chain.
> > + */
>
> Comment  style. I guess we don't need to respin the set just for this.

Damn, I thought I've corrected them all, sorry.

What do you mean by not needing to respin the set, are you suggesting
leaving it like this, or to change it without bumping the patch set
number?

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs
  2024-01-03 20:18     ` Dmitry Dolgov
@ 2024-01-03 20:47       ` Song Liu
  2024-01-03 20:51         ` Dmitry Dolgov
  0 siblings, 1 reply; 12+ messages in thread
From: Song Liu @ 2024-01-03 20:47 UTC (permalink / raw)
  To: Dmitry Dolgov
  Cc: bpf, ast, daniel, andrii, martin.lau, yonghong.song,
	dan.carpenter, olsajiri, asavkov

On Wed, Jan 3, 2024 at 12:19 PM Dmitry Dolgov <9erthalion6@gmail.com> wrote:
>
> > On Wed, Jan 03, 2024 at 11:47:14AM -0800, Song Liu wrote:
> > On Wed, Jan 3, 2024 at 11:06 AM Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
> > > +char _license[] SEC("license") = "GPL";
> > > +
> > > +/*
> > > + * Dummy fentry bpf prog for testing fentry attachment chains. It's going to be
> > > + * a start of the chain.
> > > + */
> >
> > Comment  style. I guess we don't need to respin the set just for this.
>
> Damn, I thought I've corrected them all, sorry.
>
> What do you mean by not needing to respin the set, are you suggesting
> leaving it like this, or to change it without bumping the patch set
> number?

I meant let's not send v13 yet. If this is the only fix we need, the maintainer
can probably fix it when applying the patches.

Thanks,
Song

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs
  2024-01-03 20:47       ` Song Liu
@ 2024-01-03 20:51         ` Dmitry Dolgov
  2024-01-05  4:45           ` Alexei Starovoitov
  0 siblings, 1 reply; 12+ messages in thread
From: Dmitry Dolgov @ 2024-01-03 20:51 UTC (permalink / raw)
  To: Song Liu
  Cc: bpf, ast, daniel, andrii, martin.lau, yonghong.song,
	dan.carpenter, olsajiri, asavkov

> On Wed, Jan 03, 2024 at 12:47:44PM -0800, Song Liu wrote:
> On Wed, Jan 3, 2024 at 12:19 PM Dmitry Dolgov <9erthalion6@gmail.com> wrote:
> >
> > > On Wed, Jan 03, 2024 at 11:47:14AM -0800, Song Liu wrote:
> > > On Wed, Jan 3, 2024 at 11:06 AM Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
> > > > +char _license[] SEC("license") = "GPL";
> > > > +
> > > > +/*
> > > > + * Dummy fentry bpf prog for testing fentry attachment chains. It's going to be
> > > > + * a start of the chain.
> > > > + */
> > >
> > > Comment  style. I guess we don't need to respin the set just for this.
> >
> > Damn, I thought I've corrected them all, sorry.
> >
> > What do you mean by not needing to respin the set, are you suggesting
> > leaving it like this, or to change it without bumping the patch set
> > number?
>
> I meant let's not send v13 yet. If this is the only fix we need, the maintainer
> can probably fix it when applying the patches.

Sounds reasonable, thanks.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs
  2024-01-03 20:51         ` Dmitry Dolgov
@ 2024-01-05  4:45           ` Alexei Starovoitov
  0 siblings, 0 replies; 12+ messages in thread
From: Alexei Starovoitov @ 2024-01-05  4:45 UTC (permalink / raw)
  To: Dmitry Dolgov
  Cc: Song Liu, bpf, Alexei Starovoitov, Daniel Borkmann,
	Andrii Nakryiko, Martin KaFai Lau, Yonghong Song, Dan Carpenter,
	Jiri Olsa, Artem Savkov

On Wed, Jan 3, 2024 at 12:51 PM Dmitry Dolgov <9erthalion6@gmail.com> wrote:
>
> > On Wed, Jan 03, 2024 at 12:47:44PM -0800, Song Liu wrote:
> > On Wed, Jan 3, 2024 at 12:19 PM Dmitry Dolgov <9erthalion6@gmail.com> wrote:
> > >
> > > > On Wed, Jan 03, 2024 at 11:47:14AM -0800, Song Liu wrote:
> > > > On Wed, Jan 3, 2024 at 11:06 AM Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
> > > > > +char _license[] SEC("license") = "GPL";
> > > > > +
> > > > > +/*
> > > > > + * Dummy fentry bpf prog for testing fentry attachment chains. It's going to be
> > > > > + * a start of the chain.
> > > > > + */
> > > >
> > > > Comment  style. I guess we don't need to respin the set just for this.
> > >
> > > Damn, I thought I've corrected them all, sorry.
> > >
> > > What do you mean by not needing to respin the set, are you suggesting
> > > leaving it like this, or to change it without bumping the patch set
> > > number?
> >
> > I meant let's not send v13 yet. If this is the only fix we need, the maintainer
> > can probably fix it when applying the patches.
>
> Sounds reasonable, thanks.

Fixed up patches 2 and 4 while applying.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules
  2024-01-03 19:05 [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules Dmitrii Dolgov
                   ` (3 preceding siblings ...)
  2024-01-03 19:05 ` [PATCH bpf-next v12 4/4] selftests/bpf: Test re-attachment fix for bpf_tracing_prog_attach Dmitrii Dolgov
@ 2024-01-05  4:50 ` patchwork-bot+netdevbpf
  4 siblings, 0 replies; 12+ messages in thread
From: patchwork-bot+netdevbpf @ 2024-01-05  4:50 UTC (permalink / raw)
  To: Dmitry Dolgov
  Cc: bpf, ast, daniel, andrii, martin.lau, song, yonghong.song,
	dan.carpenter, olsajiri, asavkov

Hello:

This series was applied to bpf/bpf-next.git (master)
by Alexei Starovoitov <ast@kernel.org>:

On Wed,  3 Jan 2024 20:05:43 +0100 you wrote:
> Currently, it's not allowed to attach an fentry/fexit prog to another
> fentry/fexit. At the same time it's not uncommon to see a tracing
> program with lots of logic in use, and the attachment limitation
> prevents usage of fentry/fexit for performance analysis (e.g. with
> "bpftool prog profile" command) in this case. An example could be
> falcosecurity libs project that uses tp_btf tracing programs for
> offloading certain part of logic into tail-called programs, but the
> use-case is still generic enough -- a tracing program could be
> complicated and heavy enough to warrant its profiling, yet frustratingly
> it's not possible to do so use best tooling for that.
> 
> [...]

Here is the summary with links:
  - [bpf-next,v12,1/4] bpf: Relax tracing prog recursive attach rules
    https://git.kernel.org/bpf/bpf-next/c/19bfcdf9498a
  - [bpf-next,v12,2/4] selftests/bpf: Add test for recursive attachment of tracing progs
    https://git.kernel.org/bpf/bpf-next/c/5c5371e069e1
  - [bpf-next,v12,3/4] bpf: Fix re-attachment branch in bpf_tracing_prog_attach
    https://git.kernel.org/bpf/bpf-next/c/715d82ba636c
  - [bpf-next,v12,4/4] selftests/bpf: Test re-attachment fix for bpf_tracing_prog_attach
    https://git.kernel.org/bpf/bpf-next/c/e02feb3f1f47

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2024-01-05  4:50 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-03 19:05 [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules Dmitrii Dolgov
2024-01-03 19:05 ` [PATCH bpf-next v12 1/4] bpf: " Dmitrii Dolgov
2024-01-03 19:05 ` [PATCH bpf-next v12 2/4] selftests/bpf: Add test for recursive attachment of tracing progs Dmitrii Dolgov
2024-01-03 19:47   ` Song Liu
2024-01-03 20:18     ` Dmitry Dolgov
2024-01-03 20:47       ` Song Liu
2024-01-03 20:51         ` Dmitry Dolgov
2024-01-05  4:45           ` Alexei Starovoitov
2024-01-03 19:05 ` [PATCH bpf-next v12 3/4] bpf: Fix re-attachment branch in bpf_tracing_prog_attach Dmitrii Dolgov
2024-01-03 19:05 ` [PATCH bpf-next v12 4/4] selftests/bpf: Test re-attachment fix for bpf_tracing_prog_attach Dmitrii Dolgov
2024-01-03 19:47   ` Song Liu
2024-01-05  4:50 ` [PATCH bpf-next v12 0/4] Relax tracing prog recursive attach rules patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox