From: 梦龙董 <dongmenglong.8@bytedance.com> To: Jiri Olsa <olsajiri@gmail.com> Cc: andrii@kernel.org, ast@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@google.com, haoluo@google.com, mykolal@fb.com, shuah@kernel.org, mcoquelin.stm32@gmail.com, alexandre.torgue@foss.st.com, thinker.li@gmail.com, zhoufeng.zf@bytedance.com, davemarchevsky@fb.com, dxu@dxuuu.xyz, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org Subject: Re: [External] Re: [PATCH bpf-next 1/5] bpf: tracing: add support to record and check the accessed args Date: Wed, 21 Feb 2024 10:58:30 +0800 [thread overview] Message-ID: <CALz3k9juJUBDV=wyCG7Ru6_OcMCpArL5MSGWrsb5xhx=u4+N2g@mail.gmail.com> (raw) In-Reply-To: <ZdTe8LteoqR43d4q@krava> On Wed, Feb 21, 2024 at 1:18 AM Jiri Olsa <olsajiri@gmail.com> wrote: > > On Tue, Feb 20, 2024 at 11:51:01AM +0800, Menglong Dong wrote: > > SNIP > > > +static int get_ctx_arg_idx_aligned(struct btf *btf, const struct btf_type *t, > > + int off) > > +{ > > + const struct btf_param *args; > > + u32 offset = 0, nr_args; > > + int i; > > + > > + nr_args = btf_type_vlen(t); > > + args = (const struct btf_param *)(t + 1); > > + for (i = 0; i < nr_args; i++) { > > + if (offset == off) > > + return i; > > + > > + t = btf_type_skip_modifiers(btf, args[i].type, NULL); > > + offset += btf_type_is_ptr(t) ? 8 : roundup(t->size, 8); > > + if (offset > off) > > + return -1; > > + } > > + return -1; > > +} > > + > > +/* This function is similar to btf_check_func_type_match(), except that it > > + * only compare some function args of the function prototype t1 and t2. > > + */ > > could we reuse btf_check_func_type_match instead? perhaps just > adding extra argument with arguments bitmap to it? > This is a little difficult, as the way we check the consistency of t1 and t2 is a little different. in btf_check_func_type_match(), we check the args of t1 and t2 by index. But in btf_check_func_part_match(), we check the args of t1 and t2 by offset. Reusing can make btf_check_func_type_match become complex and hard to understand. Anyway, let me have a try to see if it works to reuse btf_check_func_type_match(). Thanks! Menglong Dong > jirka > > > +int btf_check_func_part_match(struct btf *btf1, const struct btf_type *func1, > > + struct btf *btf2, const struct btf_type *func2, > > + u64 func_args) > > +{ > > + const struct btf_param *args1, *args2; > > + u32 nargs1, i, offset = 0; > > + const char *s1, *s2; > > + > > + if (!btf_type_is_func_proto(func1) || !btf_type_is_func_proto(func2)) > > + return -EINVAL; > > + > > + args1 = (const struct btf_param *)(func1 + 1); > > + args2 = (const struct btf_param *)(func2 + 1); > > + nargs1 = btf_type_vlen(func1); > > + > > + for (i = 0; i <= nargs1; i++) { > > + const struct btf_type *t1, *t2; > > + > > + if (!(func_args & (1 << i))) > > + goto next; > > + > > + if (i < nargs1) { > > + int t2_index; > > + > > + /* get the index of the arg corresponding to args1[i] > > + * by the offset. > > + */ > > + t2_index = get_ctx_arg_idx_aligned(btf2, func2, > > + offset); > > + if (t2_index < 0) > > + return -EINVAL; > > + > > + t1 = btf_type_skip_modifiers(btf1, args1[i].type, NULL); > > + t2 = btf_type_skip_modifiers(btf2, args2[t2_index].type, > > + NULL); > > + } else { > > + /* i == nargs1, this is the index of return value of t1 */ > > + if (get_ctx_arg_total_size(btf1, func1) != > > + get_ctx_arg_total_size(btf2, func2)) > > + return -EINVAL; > > + > > + /* check the return type of t1 and t2 */ > > + t1 = btf_type_skip_modifiers(btf1, func1->type, NULL); > > + t2 = btf_type_skip_modifiers(btf2, func2->type, NULL); > > + } > > + > > + if (t1->info != t2->info || > > + (btf_type_has_size(t1) && t1->size != t2->size)) > > + return -EINVAL; > > + if (btf_type_is_int(t1) || btf_is_any_enum(t1)) > > + goto next; > > + > > + if (btf_type_is_struct(t1)) > > + goto on_struct; > > + > > + if (!btf_type_is_ptr(t1)) > > + return -EINVAL; > > + > > + t1 = btf_type_skip_modifiers(btf1, t1->type, NULL); > > + t2 = btf_type_skip_modifiers(btf2, t2->type, NULL); > > + if (!btf_type_is_struct(t1) || !btf_type_is_struct(t2)) > > + return -EINVAL; > > + > > +on_struct: > > + s1 = btf_name_by_offset(btf1, t1->name_off); > > + s2 = btf_name_by_offset(btf2, t2->name_off); > > + if (strcmp(s1, s2)) > > + return -EINVAL; > > +next: > > + if (i < nargs1) { > > + t1 = btf_type_skip_modifiers(btf1, args1[i].type, NULL); > > + offset += btf_type_is_ptr(t1) ? 8 : roundup(t1->size, 8); > > + } > > + } > > + > > + return 0; > > +} > > + > > static bool btf_is_dynptr_ptr(const struct btf *btf, const struct btf_type *t) > > { > > const char *name; > > -- > > 2.39.2 > >
WARNING: multiple messages have this Message-ID (diff)
From: 梦龙董 <dongmenglong.8@bytedance.com> To: Jiri Olsa <olsajiri@gmail.com> Cc: andrii@kernel.org, ast@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, john.fastabend@gmail.com, kpsingh@kernel.org, sdf@google.com, haoluo@google.com, mykolal@fb.com, shuah@kernel.org, mcoquelin.stm32@gmail.com, alexandre.torgue@foss.st.com, thinker.li@gmail.com, zhoufeng.zf@bytedance.com, davemarchevsky@fb.com, dxu@dxuuu.xyz, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org Subject: Re: [External] Re: [PATCH bpf-next 1/5] bpf: tracing: add support to record and check the accessed args Date: Wed, 21 Feb 2024 10:58:30 +0800 [thread overview] Message-ID: <CALz3k9juJUBDV=wyCG7Ru6_OcMCpArL5MSGWrsb5xhx=u4+N2g@mail.gmail.com> (raw) In-Reply-To: <ZdTe8LteoqR43d4q@krava> On Wed, Feb 21, 2024 at 1:18 AM Jiri Olsa <olsajiri@gmail.com> wrote: > > On Tue, Feb 20, 2024 at 11:51:01AM +0800, Menglong Dong wrote: > > SNIP > > > +static int get_ctx_arg_idx_aligned(struct btf *btf, const struct btf_type *t, > > + int off) > > +{ > > + const struct btf_param *args; > > + u32 offset = 0, nr_args; > > + int i; > > + > > + nr_args = btf_type_vlen(t); > > + args = (const struct btf_param *)(t + 1); > > + for (i = 0; i < nr_args; i++) { > > + if (offset == off) > > + return i; > > + > > + t = btf_type_skip_modifiers(btf, args[i].type, NULL); > > + offset += btf_type_is_ptr(t) ? 8 : roundup(t->size, 8); > > + if (offset > off) > > + return -1; > > + } > > + return -1; > > +} > > + > > +/* This function is similar to btf_check_func_type_match(), except that it > > + * only compare some function args of the function prototype t1 and t2. > > + */ > > could we reuse btf_check_func_type_match instead? perhaps just > adding extra argument with arguments bitmap to it? > This is a little difficult, as the way we check the consistency of t1 and t2 is a little different. in btf_check_func_type_match(), we check the args of t1 and t2 by index. But in btf_check_func_part_match(), we check the args of t1 and t2 by offset. Reusing can make btf_check_func_type_match become complex and hard to understand. Anyway, let me have a try to see if it works to reuse btf_check_func_type_match(). Thanks! Menglong Dong > jirka > > > +int btf_check_func_part_match(struct btf *btf1, const struct btf_type *func1, > > + struct btf *btf2, const struct btf_type *func2, > > + u64 func_args) > > +{ > > + const struct btf_param *args1, *args2; > > + u32 nargs1, i, offset = 0; > > + const char *s1, *s2; > > + > > + if (!btf_type_is_func_proto(func1) || !btf_type_is_func_proto(func2)) > > + return -EINVAL; > > + > > + args1 = (const struct btf_param *)(func1 + 1); > > + args2 = (const struct btf_param *)(func2 + 1); > > + nargs1 = btf_type_vlen(func1); > > + > > + for (i = 0; i <= nargs1; i++) { > > + const struct btf_type *t1, *t2; > > + > > + if (!(func_args & (1 << i))) > > + goto next; > > + > > + if (i < nargs1) { > > + int t2_index; > > + > > + /* get the index of the arg corresponding to args1[i] > > + * by the offset. > > + */ > > + t2_index = get_ctx_arg_idx_aligned(btf2, func2, > > + offset); > > + if (t2_index < 0) > > + return -EINVAL; > > + > > + t1 = btf_type_skip_modifiers(btf1, args1[i].type, NULL); > > + t2 = btf_type_skip_modifiers(btf2, args2[t2_index].type, > > + NULL); > > + } else { > > + /* i == nargs1, this is the index of return value of t1 */ > > + if (get_ctx_arg_total_size(btf1, func1) != > > + get_ctx_arg_total_size(btf2, func2)) > > + return -EINVAL; > > + > > + /* check the return type of t1 and t2 */ > > + t1 = btf_type_skip_modifiers(btf1, func1->type, NULL); > > + t2 = btf_type_skip_modifiers(btf2, func2->type, NULL); > > + } > > + > > + if (t1->info != t2->info || > > + (btf_type_has_size(t1) && t1->size != t2->size)) > > + return -EINVAL; > > + if (btf_type_is_int(t1) || btf_is_any_enum(t1)) > > + goto next; > > + > > + if (btf_type_is_struct(t1)) > > + goto on_struct; > > + > > + if (!btf_type_is_ptr(t1)) > > + return -EINVAL; > > + > > + t1 = btf_type_skip_modifiers(btf1, t1->type, NULL); > > + t2 = btf_type_skip_modifiers(btf2, t2->type, NULL); > > + if (!btf_type_is_struct(t1) || !btf_type_is_struct(t2)) > > + return -EINVAL; > > + > > +on_struct: > > + s1 = btf_name_by_offset(btf1, t1->name_off); > > + s2 = btf_name_by_offset(btf2, t2->name_off); > > + if (strcmp(s1, s2)) > > + return -EINVAL; > > +next: > > + if (i < nargs1) { > > + t1 = btf_type_skip_modifiers(btf1, args1[i].type, NULL); > > + offset += btf_type_is_ptr(t1) ? 8 : roundup(t1->size, 8); > > + } > > + } > > + > > + return 0; > > +} > > + > > static bool btf_is_dynptr_ptr(const struct btf *btf, const struct btf_type *t) > > { > > const char *name; > > -- > > 2.39.2 > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2024-02-21 2:58 UTC|newest] Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top 2024-02-20 3:51 [PATCH bpf-next 0/5] bpf: make tracing program support multi-attach Menglong Dong 2024-02-20 3:51 ` Menglong Dong 2024-02-20 3:51 ` [PATCH bpf-next 1/5] bpf: tracing: add support to record and check the accessed args Menglong Dong 2024-02-20 3:51 ` Menglong Dong 2024-02-20 17:18 ` Jiri Olsa 2024-02-20 17:18 ` Jiri Olsa 2024-02-21 2:58 ` 梦龙董 [this message] 2024-02-21 2:58 ` [External] " 梦龙董 2024-02-20 18:22 ` Kui-Feng Lee 2024-02-20 18:22 ` Kui-Feng Lee 2024-02-21 3:09 ` [External] " 梦龙董 2024-02-21 3:09 ` 梦龙董 2024-02-20 3:51 ` [PATCH bpf-next 2/5] bpf: tracing: support to attach program to multi hooks Menglong Dong 2024-02-20 3:51 ` Menglong Dong 2024-02-20 17:18 ` Jiri Olsa 2024-02-20 17:18 ` Jiri Olsa 2024-02-21 5:31 ` Dan Carpenter 2024-02-21 5:31 ` Dan Carpenter 2024-02-20 3:51 ` [PATCH bpf-next 3/5] libbpf: allow to set coookie when target_btf_id is set in bpf_link_create Menglong Dong 2024-02-20 3:51 ` Menglong Dong 2024-02-20 3:51 ` [PATCH bpf-next 4/5] libbpf: add the function libbpf_find_kernel_btf_id() Menglong Dong 2024-02-20 3:51 ` Menglong Dong 2024-02-20 3:51 ` [PATCH bpf-next 5/5] selftests/bpf: add test cases for multiple attach of tracing program Menglong Dong 2024-02-20 3:51 ` Menglong Dong 2024-02-21 1:24 ` [PATCH bpf-next 0/5] bpf: make tracing program support multi-attach Alexei Starovoitov 2024-02-21 1:24 ` Alexei Starovoitov 2024-02-21 2:35 ` [External] " 梦龙董 2024-02-21 2:35 ` 梦龙董 2024-02-21 2:45 ` 梦龙董 2024-02-21 2:45 ` 梦龙董 2024-02-21 3:02 ` Alexei Starovoitov 2024-02-21 3:02 ` Alexei Starovoitov 2024-02-21 3:06 ` 梦龙董 2024-02-21 3:06 ` 梦龙董 2024-02-21 3:18 ` Alexei Starovoitov 2024-02-21 3:18 ` Alexei Starovoitov 2024-02-21 3:57 ` 梦龙董 2024-02-21 3:57 ` 梦龙董
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to='CALz3k9juJUBDV=wyCG7Ru6_OcMCpArL5MSGWrsb5xhx=u4+N2g@mail.gmail.com' \ --to=dongmenglong.8@bytedance.com \ --cc=alexandre.torgue@foss.st.com \ --cc=andrii@kernel.org \ --cc=ast@kernel.org \ --cc=bpf@vger.kernel.org \ --cc=daniel@iogearbox.net \ --cc=davemarchevsky@fb.com \ --cc=dxu@dxuuu.xyz \ --cc=eddyz87@gmail.com \ --cc=haoluo@google.com \ --cc=john.fastabend@gmail.com \ --cc=kpsingh@kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-kselftest@vger.kernel.org \ --cc=linux-stm32@st-md-mailman.stormreply.com \ --cc=martin.lau@linux.dev \ --cc=mcoquelin.stm32@gmail.com \ --cc=mykolal@fb.com \ --cc=olsajiri@gmail.com \ --cc=sdf@google.com \ --cc=shuah@kernel.org \ --cc=song@kernel.org \ --cc=thinker.li@gmail.com \ --cc=yonghong.song@linux.dev \ --cc=zhoufeng.zf@bytedance.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.