Message ID | 160051618958.58048.6126760401623211021.stgit@toke.dk |
---|---|
State | Changes Requested |
Delegated to: | BPF Maintainers |
Headers | show |
Series | bpf: Support multi-attach for freplace programs | expand |
On Sat, Sep 19, 2020 at 4:50 AM Toke Høiland-Jørgensen <toke@redhat.com> wrote: > > From: Toke Høiland-Jørgensen <toke@redhat.com> > > Eelco reported we can't properly access arguments if the tracing > program is attached to extension program. > > Having following program: > > SEC("classifier/test_pkt_md_access") > int test_pkt_md_access(struct __sk_buff *skb) > > with its extension: > > SEC("freplace/test_pkt_md_access") > int test_pkt_md_access_new(struct __sk_buff *skb) > > and tracing that extension with: > > SEC("fentry/test_pkt_md_access_new") > int BPF_PROG(fentry, struct sk_buff *skb) > > It's not possible to access skb argument in the fentry program, > with following error from verifier: > > ; int BPF_PROG(fentry, struct sk_buff *skb) > 0: (79) r1 = *(u64 *)(r1 +0) > invalid bpf_context access off=0 size=8 > > The problem is that btf_ctx_access gets the context type for the > traced program, which is in this case the extension. > > But when we trace extension program, we want to get the context > type of the program that the extension is attached to, so we can > access the argument properly in the trace program. > > This version of the patch is tweaked slightly from Jiri's original one, > since the refactoring in the previous patches means we have to get the > target prog type from the new variable in prog->aux instead of directly > from the target prog. > > Reported-by: Eelco Chaudron <echaudro@redhat.com> > Suggested-by: Jiri Olsa <jolsa@kernel.org> > Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> > --- Acked-by: Andrii Nakryiko <andriin@fb.com> > kernel/bpf/btf.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > [...]
diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 9228af9917a8..55f7b2ba1cbd 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -3860,7 +3860,14 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type, info->reg_type = PTR_TO_BTF_ID; if (tgt_prog) { - ret = btf_translate_to_vmlinux(log, btf, t, tgt_prog->type, arg); + enum bpf_prog_type tgt_type; + + if (tgt_prog->type == BPF_PROG_TYPE_EXT) + tgt_type = tgt_prog->aux->tgt_prog_type; + else + tgt_type = tgt_prog->type; + + ret = btf_translate_to_vmlinux(log, btf, t, tgt_type, arg); if (ret > 0) { info->btf_id = ret; return true;