Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> writes: > On Wed, Sep 9, 2020 at 8:11 AM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: >> >> 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. >> >> Reported-by: Eelco Chaudron <echaudro@xxxxxxxxxx> >> Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> >> --- >> kernel/bpf/btf.c | 8 ++++++++ >> 1 file changed, 8 insertions(+) >> >> diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c >> index f9ac6935ab3c..37ad01c32e5a 100644 >> --- a/kernel/bpf/btf.c >> +++ b/kernel/bpf/btf.c >> @@ -3859,6 +3859,14 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type, >> } >> >> info->reg_type = PTR_TO_BTF_ID; >> + >> + /* 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. >> + */ >> + if (tgt_prog && tgt_prog->type == BPF_PROG_TYPE_EXT) >> + tgt_prog = tgt_prog->aux->linked_prog; >> + >> if (tgt_prog) { >> ret = btf_translate_to_vmlinux(log, btf, t, tgt_prog->type, arg); > > I think it would be cleaner to move resolve_prog_type() from verifier.c > and use that helper function here. FYI, I've added a different version of this patch to my freplace multi-attach series (since the approach here was incompatible with that). -Toke