* [PATCH bpf-next 0/2] bpf: Allow access to const void pointer arguments in tracing programs
@ 2025-04-12 17:06 KaFai Wan
2025-04-12 17:06 ` [PATCH bpf-next 1/2] " KaFai Wan
2025-04-12 17:06 ` [PATCH bpf-next 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program KaFai Wan
0 siblings, 2 replies; 7+ messages in thread
From: KaFai Wan @ 2025-04-12 17:06 UTC (permalink / raw)
To: martin.lau, ast, daniel, andrii, eddyz87, song, yonghong.song,
john.fastabend, kpsingh, sdf, haoluo, jolsa, mykolal, shuah,
memxor
Cc: bpf, linux-kernel, linux-kselftest, kafai.wan, leon.hwang
hi,
Tracing programs can access arguments via BTF [1]. Currently we allow
tracing programs to access pointers to string (char pointer),
void pointers, pointers to structs, and int pointers [2].
If we try to access argument which is pointer to const void like 2nd
argument in kfree, it's an UNKNOWN type, verifier will fail to load.
typedef void (*btf_trace_kfree)(void *, long unsigned int, const void *);
[1] https://lore.kernel.org/bpf/20191016032505.2089704-7-ast@kernel.org/
[2] https://lore.kernel.org/bpf/20211208193245.172141-1-jolsa@kernel.org/
---
KaFai Wan (2):
bpf: Allow access to const void pointer arguments in tracing programs
selftests/bpf: Add test to access const void pointer argument in
tracing program
kernel/bpf/btf.c | 10 +++++++++-
.../selftests/bpf/progs/verifier_btf_ctx_access.c | 9 +++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH bpf-next 1/2] bpf: Allow access to const void pointer arguments in tracing programs
2025-04-12 17:06 [PATCH bpf-next 0/2] bpf: Allow access to const void pointer arguments in tracing programs KaFai Wan
@ 2025-04-12 17:06 ` KaFai Wan
2025-04-14 10:35 ` Jiri Olsa
2025-04-12 17:06 ` [PATCH bpf-next 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program KaFai Wan
1 sibling, 1 reply; 7+ messages in thread
From: KaFai Wan @ 2025-04-12 17:06 UTC (permalink / raw)
To: martin.lau, ast, daniel, andrii, eddyz87, song, yonghong.song,
john.fastabend, kpsingh, sdf, haoluo, jolsa, mykolal, shuah,
memxor
Cc: bpf, linux-kernel, linux-kselftest, kafai.wan, leon.hwang
Adding support to access arguments with const void pointer arguments
in tracing programs.
Currently we allow tracing programs to access void pointers. If we try to
access argument which is pointer to const void like 2nd argument in kfree,
verifier will fail to load the program with;
0: R1=ctx() R10=fp0
; asm volatile ("r2 = *(u64 *)(r1 + 8); ");
0: (79) r2 = *(u64 *)(r1 +8)
func 'kfree' arg1 type UNKNOWN is not a struct
Adding is_void_ptr to generic void pointer check.
Cc: Leon Hwang <leon.hwang@linux.dev>
Signed-off-by: KaFai Wan <kafai.wan@hotmail.com>
---
kernel/bpf/btf.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index 16ba36f34dfa..e11d3afd0562 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -6383,6 +6383,14 @@ struct btf *bpf_prog_get_target_btf(const struct bpf_prog *prog)
return prog->aux->attach_btf;
}
+static bool is_void_ptr(struct btf *btf, const struct btf_type *t)
+{
+ /* skip modifiers */
+ t = btf_type_skip_modifiers(btf, t->type, NULL);
+
+ return t->type == 0;
+}
+
static bool is_int_ptr(struct btf *btf, const struct btf_type *t)
{
/* skip modifiers */
@@ -6776,7 +6784,7 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,
}
}
- if (t->type == 0)
+ if (is_void_ptr(btf, t))
/* This is a pointer to void.
* It is the same as scalar from the verifier safety pov.
* No further pointer walking is allowed.
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH bpf-next 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program
2025-04-12 17:06 [PATCH bpf-next 0/2] bpf: Allow access to const void pointer arguments in tracing programs KaFai Wan
2025-04-12 17:06 ` [PATCH bpf-next 1/2] " KaFai Wan
@ 2025-04-12 17:06 ` KaFai Wan
2025-04-14 10:35 ` Jiri Olsa
1 sibling, 1 reply; 7+ messages in thread
From: KaFai Wan @ 2025-04-12 17:06 UTC (permalink / raw)
To: martin.lau, ast, daniel, andrii, eddyz87, song, yonghong.song,
john.fastabend, kpsingh, sdf, haoluo, jolsa, mykolal, shuah,
memxor
Cc: bpf, linux-kernel, linux-kselftest, kafai.wan, leon.hwang
Adding verifier test for accessing const void pointer argument in
tracing programs.
The test program loads 2nd argument of kfree tp_btf which is
const void pointer and checks that verifier allows that.
Signed-off-by: KaFai Wan <kafai.wan@hotmail.com>
---
.../selftests/bpf/progs/verifier_btf_ctx_access.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c b/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
index 28b939572cda..a6cec7f73dcd 100644
--- a/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
+++ b/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
@@ -65,4 +65,13 @@ __naked void ctx_access_u32_pointer_reject_8(void)
" ::: __clobber_all);
}
+SEC("tp_btf/kfree")
+__description("btf_ctx_access const void pointer accept")
+int ctx_access_const_void_pointer_accept(void)
+{
+ /* load 2nd argument value (const void pointer) */
+ asm volatile ("r2 = *(u64 *)(r1 + 8); ");
+ return 0;
+}
+
char _license[] SEC("license") = "GPL";
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next 1/2] bpf: Allow access to const void pointer arguments in tracing programs
2025-04-12 17:06 ` [PATCH bpf-next 1/2] " KaFai Wan
@ 2025-04-14 10:35 ` Jiri Olsa
2025-04-15 14:37 ` Kafai Wan
0 siblings, 1 reply; 7+ messages in thread
From: Jiri Olsa @ 2025-04-14 10:35 UTC (permalink / raw)
To: KaFai Wan
Cc: martin.lau, ast, daniel, andrii, eddyz87, song, yonghong.song,
john.fastabend, kpsingh, sdf, haoluo, mykolal, shuah, memxor, bpf,
linux-kernel, linux-kselftest, kafai.wan, leon.hwang
On Sun, Apr 13, 2025 at 01:06:25AM +0800, KaFai Wan wrote:
> Adding support to access arguments with const void pointer arguments
> in tracing programs.
>
> Currently we allow tracing programs to access void pointers. If we try to
> access argument which is pointer to const void like 2nd argument in kfree,
> verifier will fail to load the program with;
>
> 0: R1=ctx() R10=fp0
> ; asm volatile ("r2 = *(u64 *)(r1 + 8); ");
> 0: (79) r2 = *(u64 *)(r1 +8)
> func 'kfree' arg1 type UNKNOWN is not a struct
>
> Adding is_void_ptr to generic void pointer check.
>
> Cc: Leon Hwang <leon.hwang@linux.dev>
> Signed-off-by: KaFai Wan <kafai.wan@hotmail.com>
> ---
> kernel/bpf/btf.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
> index 16ba36f34dfa..e11d3afd0562 100644
> --- a/kernel/bpf/btf.c
> +++ b/kernel/bpf/btf.c
> @@ -6383,6 +6383,14 @@ struct btf *bpf_prog_get_target_btf(const struct bpf_prog *prog)
> return prog->aux->attach_btf;
> }
>
> +static bool is_void_ptr(struct btf *btf, const struct btf_type *t)
> +{
> + /* skip modifiers */
> + t = btf_type_skip_modifiers(btf, t->type, NULL);
> +
> + return t->type == 0;
I think you can use btf_type_is_void in here
> +}
> +
> static bool is_int_ptr(struct btf *btf, const struct btf_type *t)
> {
> /* skip modifiers */
> @@ -6776,7 +6784,7 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,
> }
> }
>
> - if (t->type == 0)
> + if (is_void_ptr(btf, t))
lgtm,
nit, the is_void_ptr name suggest there's also ptr check in the helper function,
which is not the case. I understand it follows is_int_ptr name, but perhaps we
could rename both helpers to is_void and is_int ... feel free to ignore ;-)
jirka
> /* This is a pointer to void.
> * It is the same as scalar from the verifier safety pov.
> * No further pointer walking is allowed.
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program
2025-04-12 17:06 ` [PATCH bpf-next 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program KaFai Wan
@ 2025-04-14 10:35 ` Jiri Olsa
2025-04-15 14:31 ` Kafai Wan
0 siblings, 1 reply; 7+ messages in thread
From: Jiri Olsa @ 2025-04-14 10:35 UTC (permalink / raw)
To: KaFai Wan
Cc: martin.lau, ast, daniel, andrii, eddyz87, song, yonghong.song,
john.fastabend, kpsingh, sdf, haoluo, mykolal, shuah, memxor, bpf,
linux-kernel, linux-kselftest, kafai.wan, leon.hwang
On Sun, Apr 13, 2025 at 01:06:26AM +0800, KaFai Wan wrote:
> Adding verifier test for accessing const void pointer argument in
> tracing programs.
>
> The test program loads 2nd argument of kfree tp_btf which is
> const void pointer and checks that verifier allows that.
>
> Signed-off-by: KaFai Wan <kafai.wan@hotmail.com>
> ---
> .../selftests/bpf/progs/verifier_btf_ctx_access.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c b/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
> index 28b939572cda..a6cec7f73dcd 100644
> --- a/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
> +++ b/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
> @@ -65,4 +65,13 @@ __naked void ctx_access_u32_pointer_reject_8(void)
> " ::: __clobber_all);
> }
>
> +SEC("tp_btf/kfree")
> +__description("btf_ctx_access const void pointer accept")
> +int ctx_access_const_void_pointer_accept(void)
> +{
> + /* load 2nd argument value (const void pointer) */
> + asm volatile ("r2 = *(u64 *)(r1 + 8); ");
I think we should follow formatting of other tests in the file,
a do smth like:
asm volatile (" \
r2 = *(u64 *)(r1 + 8); "); /* load 2nd argument value (const void pointer) */\
...
thanks,
jirka
> + return 0;
> +}
> +
> char _license[] SEC("license") = "GPL";
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program
2025-04-14 10:35 ` Jiri Olsa
@ 2025-04-15 14:31 ` Kafai Wan
0 siblings, 0 replies; 7+ messages in thread
From: Kafai Wan @ 2025-04-15 14:31 UTC (permalink / raw)
To: Jiri Olsa
Cc: martin.lau, ast, daniel, andrii, eddyz87, song, yonghong.song,
john.fastabend, kpsingh, sdf, haoluo, mykolal, shuah, memxor, bpf,
linux-kernel, linux-kselftest, kafai.wan, leon.hwang
On Mon, Apr 14, 2025 at 6:35 PM Jiri Olsa <olsajiri@gmail.com> wrote:
>
> On Sun, Apr 13, 2025 at 01:06:26AM +0800, KaFai Wan wrote:
> > Adding verifier test for accessing const void pointer argument in
> > tracing programs.
> >
> > The test program loads 2nd argument of kfree tp_btf which is
> > const void pointer and checks that verifier allows that.
> >
> > Signed-off-by: KaFai Wan <kafai.wan@hotmail.com>
> > ---
> > .../selftests/bpf/progs/verifier_btf_ctx_access.c | 9 +++++++++
> > 1 file changed, 9 insertions(+)
> >
> > diff --git a/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c b/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
> > index 28b939572cda..a6cec7f73dcd 100644
> > --- a/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
> > +++ b/tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c
> > @@ -65,4 +65,13 @@ __naked void ctx_access_u32_pointer_reject_8(void)
> > " ::: __clobber_all);
> > }
> >
> > +SEC("tp_btf/kfree")
> > +__description("btf_ctx_access const void pointer accept")
> > +int ctx_access_const_void_pointer_accept(void)
> > +{
> > + /* load 2nd argument value (const void pointer) */
> > + asm volatile ("r2 = *(u64 *)(r1 + 8); ");
>
> I think we should follow formatting of other tests in the file,
> a do smth like:
>
> asm volatile (" \
> r2 = *(u64 *)(r1 + 8); "); /* load 2nd argument value (const void pointer) */\
> ...
I will fix it. and I find out the kernel does not support test_run of tp_btf, I
will change to fentry.
>
> thanks,
> jirka
>
>
> > + return 0;
> > +}
> > +
> > char _license[] SEC("license") = "GPL";
> > --
> > 2.43.0
> >
thanks,
kafai
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next 1/2] bpf: Allow access to const void pointer arguments in tracing programs
2025-04-14 10:35 ` Jiri Olsa
@ 2025-04-15 14:37 ` Kafai Wan
0 siblings, 0 replies; 7+ messages in thread
From: Kafai Wan @ 2025-04-15 14:37 UTC (permalink / raw)
To: Jiri Olsa
Cc: martin.lau, ast, daniel, andrii, eddyz87, song, yonghong.song,
john.fastabend, kpsingh, sdf, haoluo, mykolal, shuah, memxor, bpf,
linux-kernel, linux-kselftest, kafai.wan, leon.hwang
On Mon, Apr 14, 2025 at 6:35 PM Jiri Olsa <olsajiri@gmail.com> wrote:
>
> On Sun, Apr 13, 2025 at 01:06:25AM +0800, KaFai Wan wrote:
> > Adding support to access arguments with const void pointer arguments
> > in tracing programs.
> >
> > Currently we allow tracing programs to access void pointers. If we try to
> > access argument which is pointer to const void like 2nd argument in kfree,
> > verifier will fail to load the program with;
> >
> > 0: R1=ctx() R10=fp0
> > ; asm volatile ("r2 = *(u64 *)(r1 + 8); ");
> > 0: (79) r2 = *(u64 *)(r1 +8)
> > func 'kfree' arg1 type UNKNOWN is not a struct
> >
> > Adding is_void_ptr to generic void pointer check.
> >
> > Cc: Leon Hwang <leon.hwang@linux.dev>
> > Signed-off-by: KaFai Wan <kafai.wan@hotmail.com>
> > ---
> > kernel/bpf/btf.c | 10 +++++++++-
> > 1 file changed, 9 insertions(+), 1 deletion(-)
> >
> > diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
> > index 16ba36f34dfa..e11d3afd0562 100644
> > --- a/kernel/bpf/btf.c
> > +++ b/kernel/bpf/btf.c
> > @@ -6383,6 +6383,14 @@ struct btf *bpf_prog_get_target_btf(const struct bpf_prog *prog)
> > return prog->aux->attach_btf;
> > }
> >
> > +static bool is_void_ptr(struct btf *btf, const struct btf_type *t)
> > +{
> > + /* skip modifiers */
> > + t = btf_type_skip_modifiers(btf, t->type, NULL);
> > +
> > + return t->type == 0;
>
> I think you can use btf_type_is_void in here
>
Yes, I will use btf_type_is_void.
> > +}
> > +
> > static bool is_int_ptr(struct btf *btf, const struct btf_type *t)
> > {
> > /* skip modifiers */
> > @@ -6776,7 +6784,7 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,
> > }
> > }
> >
> > - if (t->type == 0)
> > + if (is_void_ptr(btf, t))
>
> lgtm,
>
> nit, the is_void_ptr name suggest there's also ptr check in the helper function,
> which is not the case. I understand it follows is_int_ptr name, but perhaps we
> could rename both helpers to is_void and is_int ... feel free to ignore ;-)
you are right, I will rename it. but I'm not sure if it's possible to merge
these two functions into one like is_void_or_int, they both skip modifiers.
>
> jirka
>
>
> > /* This is a pointer to void.
> > * It is the same as scalar from the verifier safety pov.
> > * No further pointer walking is allowed.
> > --
> > 2.43.0
> >
thanks,
kafai
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-04-15 14:37 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-12 17:06 [PATCH bpf-next 0/2] bpf: Allow access to const void pointer arguments in tracing programs KaFai Wan
2025-04-12 17:06 ` [PATCH bpf-next 1/2] " KaFai Wan
2025-04-14 10:35 ` Jiri Olsa
2025-04-15 14:37 ` Kafai Wan
2025-04-12 17:06 ` [PATCH bpf-next 2/2] selftests/bpf: Add test to access const void pointer argument in tracing program KaFai Wan
2025-04-14 10:35 ` Jiri Olsa
2025-04-15 14:31 ` Kafai Wan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox