Message ID | 169037642351.607919.10234149030120807556.stgit@devnote2 |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a985:0:b0:3e4:2afc:c1 with SMTP id t5csp410580vqo; Wed, 26 Jul 2023 06:40:49 -0700 (PDT) X-Google-Smtp-Source: APBJJlEJLUvA1xa6ogX6O+O4wHEU/s6oTRMGHPt4lZPaXqcXyE4YFonWgJ2lZf3a+J4Z4pFOC5fX X-Received: by 2002:a05:6a20:7286:b0:133:dd1b:aa57 with SMTP id o6-20020a056a20728600b00133dd1baa57mr1857283pzk.18.1690378849281; Wed, 26 Jul 2023 06:40:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690378849; cv=none; d=google.com; s=arc-20160816; b=TZcMU4CrHdZgGX7jzZgCq0IqxAs+xhiFzeiRBPduLZuRDzGDO8eYAYR48k346xPMYB +ZBTM6Tm4FQiT3M4/E6GnIJqsh39/RfNQpxv2d7+FZWPt43qKrD0WBvQ4+NUdPXgZtUE 2YFbxZ0M44CRxL7CG66cmzyGtWm3qV+n4qYhHAJHRoy5MyIQqbiyvVJLL+t7goTzNAkJ RjDWKT30OVRDa1bwYACA4XmWhgrWY3jvrSI8tHkxrfHq+XIIxwOM71ftHsyYFOvjJiDY LVV8PVhl8vDQVcapFMRw+uDOdUv8ChOe1sqhmFtiXkSLQdcYdRQkAEG6R1sNiEDSEF8k KzgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=cEGwK1Km35jMNVmsD9RxNew+6KHbYc9Z6g2VSX5SFuM=; fh=raxTTJvC+dSJYbgfX5JG5gvrVjxTZXczN0HF8iDayLY=; b=0UtX1cwxyicTYt92XGhXj/f4yA/mLOu6xFAT/nfRvVeOxsbOD32c2sSXmXA//jezmr SUZk1w0CWLgNLb6MQNpbIpLg4tTiw2dQhEBG3Xprn8WODcR+uNIBE/xckg10GfWP3vUX niJs33DQ/GRnxQmFrcn1Plv0FPBX9obvUipbk9eq+eMQqfgDyA0DWFPRPe4UmBCqW/am OLqBJkvyX6yYDBK8DMg//ld5rhH5RqI4LL9E2zXpI4TNkrZSt1w0feD4+v0w9ZGj9rwv H+JYuhRDnD6NLrcZib5TsIp7lazRQKQh/kLf+Q1Xh+a/aRAG9u7m66CjIbVdllBTYH1J rbzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=u2bN3agz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id bs125-20020a632883000000b00543cba6043asi12337824pgb.151.2023.07.26.06.40.35; Wed, 26 Jul 2023 06:40:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=u2bN3agz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233279AbjGZNAh (ORCPT <rfc822;kloczko.tomasz@gmail.com> + 99 others); Wed, 26 Jul 2023 09:00:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58862 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233064AbjGZNAc (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 26 Jul 2023 09:00:32 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B53A31BD6; Wed, 26 Jul 2023 06:00:28 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 4FF8661A1D; Wed, 26 Jul 2023 13:00:28 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E1FD9C433CA; Wed, 26 Jul 2023 13:00:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1690376427; bh=DWqlMr8roXaG6O8LFsOi9Etaux6ORDbs/Xvw8dSo2Lk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u2bN3agznoFdF/wMEce7jdyTpYWz8GBbGxgTIcPZJqydyJAektpDOCPqIQh0fJlC4 JWlE1IunzI4uieM1xAE+O0/u3s0QeVPagK9RLHm5vFErscdIxVLqPFFqEmG/smokX4 hDrNXUQtTs9ImiQC3NF24CZboALsPDHqEhyP4nQ/qst8XE5mmb7qkdzvCb4br6hhXa O3afaZZTfvoWkcQztesj3DfKP6od9+IjCDOIZxTCAqCVWbCq5DG6ZkjWkwRqW6wU++ nDft2uFtZTAkq8v9AMK5UHhXTXeV2nIP1eE+PM5xCqZrvEcHuYY6fVYFrORF26EZfd zxsBJSo+9+yQA== From: "Masami Hiramatsu (Google)" <mhiramat@kernel.org> To: linux-trace-kernel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Steven Rostedt <rostedt@goodmis.org>, mhiramat@kernel.org, Martin KaFai Lau <martin.lau@linux.dev>, bpf@vger.kernel.org, Sven Schnelle <svens@linux.ibm.com>, Alexei Starovoitov <ast@kernel.org> Subject: [PATCH v3 3/9] bpf/btf: Add a function to search a member of a struct/union Date: Wed, 26 Jul 2023 22:00:23 +0900 Message-Id: <169037642351.607919.10234149030120807556.stgit@devnote2> X-Mailer: git-send-email 2.34.1 In-Reply-To: <169037639315.607919.2613476171148037242.stgit@devnote2> References: <169037639315.607919.2613476171148037242.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1772490692206556473 X-GMAIL-MSGID: 1772490692206556473 |
Series |
tracing: Improbe BTF support on probe events
|
|
Commit Message
Masami Hiramatsu (Google)
July 26, 2023, 1 p.m. UTC
From: Masami Hiramatsu (Google) <mhiramat@kernel.org> Add btf_find_struct_member() API to search a member of a given data structure or union from the member's name. Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Reviewed-by: Alan Maguire <alan.maguire@oracle.com> --- Changes in v3: - Remove simple input check. - Fix unneeded IS_ERR_OR_NULL() check for btf_type_by_id(). - Move the code next to btf_get_func_param(). - Use for_each_member() macro instead of for-loop. - Use btf_type_skip_modifiers() instead of btf_type_by_id(). --- include/linux/btf.h | 3 +++ kernel/bpf/btf.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+)
Comments
On Wed, Jul 26, 2023 at 6:00 AM Masami Hiramatsu (Google) <mhiramat@kernel.org> wrote: > > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > Add btf_find_struct_member() API to search a member of a given data structure > or union from the member's name. > > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > Reviewed-by: Alan Maguire <alan.maguire@oracle.com> > --- > Changes in v3: > - Remove simple input check. > - Fix unneeded IS_ERR_OR_NULL() check for btf_type_by_id(). > - Move the code next to btf_get_func_param(). > - Use for_each_member() macro instead of for-loop. > - Use btf_type_skip_modifiers() instead of btf_type_by_id(). > --- > include/linux/btf.h | 3 +++ > kernel/bpf/btf.c | 35 +++++++++++++++++++++++++++++++++++ > 2 files changed, 38 insertions(+) > > diff --git a/include/linux/btf.h b/include/linux/btf.h > index 20e3a07eef8f..4b10d57ceee0 100644 > --- a/include/linux/btf.h > +++ b/include/linux/btf.h > @@ -226,6 +226,9 @@ const struct btf_type *btf_find_func_proto(const char *func_name, > struct btf **btf_p); > const struct btf_param *btf_get_func_param(const struct btf_type *func_proto, > s32 *nr); > +const struct btf_member *btf_find_struct_member(struct btf *btf, > + const struct btf_type *type, > + const char *member_name); > > #define for_each_member(i, struct_type, member) \ > for (i = 0, member = btf_type_member(struct_type); \ > diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c > index f7b25c615269..5258870030fc 100644 > --- a/kernel/bpf/btf.c > +++ b/kernel/bpf/btf.c > @@ -958,6 +958,41 @@ const struct btf_param *btf_get_func_param(const struct btf_type *func_proto, s3 > return NULL; > } > > +/* > + * Find a member of data structure/union by name and return it. > + * Return NULL if not found, or -EINVAL if parameter is invalid. > + */ > +const struct btf_member *btf_find_struct_member(struct btf *btf, > + const struct btf_type *type, > + const char *member_name) > +{ > + const struct btf_member *member, *ret; > + const char *name; > + int i; > + > + if (!btf_type_is_struct(type)) > + return ERR_PTR(-EINVAL); > + > + for_each_member(i, type, member) { > + if (!member->name_off) { > + /* unnamed member: dig deeper */ > + type = btf_type_skip_modifiers(btf, member->type, NULL); > + if (type) { > + ret = btf_find_struct_member(btf, type, > + member_name); Unbounded recursion in the kernel? Ouch. That might cause issues. Please convert it to a loop. It doesn't have to be recursive. > + if (!IS_ERR_OR_NULL(ret)) > + return ret; > + } > + } else { > + name = btf_name_by_offset(btf, member->name_off); > + if (name && !strcmp(member_name, name)) > + return member; > + } > + } > + > + return NULL; > +} > + > #define BTF_SHOW_MAX_ITER 10 > > #define BTF_KIND_BIT(kind) (1ULL << kind) >
On Thu, 27 Jul 2023 08:39:02 -0700 Alexei Starovoitov <alexei.starovoitov@gmail.com> wrote: > On Wed, Jul 26, 2023 at 6:00 AM Masami Hiramatsu (Google) > <mhiramat@kernel.org> wrote: > > > > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > > > Add btf_find_struct_member() API to search a member of a given data structure > > or union from the member's name. > > > > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > Reviewed-by: Alan Maguire <alan.maguire@oracle.com> > > --- > > Changes in v3: > > - Remove simple input check. > > - Fix unneeded IS_ERR_OR_NULL() check for btf_type_by_id(). > > - Move the code next to btf_get_func_param(). > > - Use for_each_member() macro instead of for-loop. > > - Use btf_type_skip_modifiers() instead of btf_type_by_id(). > > --- > > include/linux/btf.h | 3 +++ > > kernel/bpf/btf.c | 35 +++++++++++++++++++++++++++++++++++ > > 2 files changed, 38 insertions(+) > > > > diff --git a/include/linux/btf.h b/include/linux/btf.h > > index 20e3a07eef8f..4b10d57ceee0 100644 > > --- a/include/linux/btf.h > > +++ b/include/linux/btf.h > > @@ -226,6 +226,9 @@ const struct btf_type *btf_find_func_proto(const char *func_name, > > struct btf **btf_p); > > const struct btf_param *btf_get_func_param(const struct btf_type *func_proto, > > s32 *nr); > > +const struct btf_member *btf_find_struct_member(struct btf *btf, > > + const struct btf_type *type, > > + const char *member_name); > > > > #define for_each_member(i, struct_type, member) \ > > for (i = 0, member = btf_type_member(struct_type); \ > > diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c > > index f7b25c615269..5258870030fc 100644 > > --- a/kernel/bpf/btf.c > > +++ b/kernel/bpf/btf.c > > @@ -958,6 +958,41 @@ const struct btf_param *btf_get_func_param(const struct btf_type *func_proto, s3 > > return NULL; > > } > > > > +/* > > + * Find a member of data structure/union by name and return it. > > + * Return NULL if not found, or -EINVAL if parameter is invalid. > > + */ > > +const struct btf_member *btf_find_struct_member(struct btf *btf, > > + const struct btf_type *type, > > + const char *member_name) > > +{ > > + const struct btf_member *member, *ret; > > + const char *name; > > + int i; > > + > > + if (!btf_type_is_struct(type)) > > + return ERR_PTR(-EINVAL); > > + > > + for_each_member(i, type, member) { > > + if (!member->name_off) { > > + /* unnamed member: dig deeper */ > > + type = btf_type_skip_modifiers(btf, member->type, NULL); > > + if (type) { > > + ret = btf_find_struct_member(btf, type, > > + member_name); > > Unbounded recursion in the kernel? Ouch. That might cause issues. > Please convert it to a loop. It doesn't have to be recursive. Oh, I thought non-name union will not be nested so much. But yes, if there is any issue on BTF itself, it is not safe. Let me make it fixed stacked loop. Thank you! > > > + if (!IS_ERR_OR_NULL(ret)) > > + return ret; > > + } > > + } else { > > + name = btf_name_by_offset(btf, member->name_off); > > + if (name && !strcmp(member_name, name)) > > + return member; > > + } > > + } > > + > > + return NULL; > > +} > > + > > #define BTF_SHOW_MAX_ITER 10 > > > > #define BTF_KIND_BIT(kind) (1ULL << kind) > >
diff --git a/include/linux/btf.h b/include/linux/btf.h index 20e3a07eef8f..4b10d57ceee0 100644 --- a/include/linux/btf.h +++ b/include/linux/btf.h @@ -226,6 +226,9 @@ const struct btf_type *btf_find_func_proto(const char *func_name, struct btf **btf_p); const struct btf_param *btf_get_func_param(const struct btf_type *func_proto, s32 *nr); +const struct btf_member *btf_find_struct_member(struct btf *btf, + const struct btf_type *type, + const char *member_name); #define for_each_member(i, struct_type, member) \ for (i = 0, member = btf_type_member(struct_type); \ diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index f7b25c615269..5258870030fc 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -958,6 +958,41 @@ const struct btf_param *btf_get_func_param(const struct btf_type *func_proto, s3 return NULL; } +/* + * Find a member of data structure/union by name and return it. + * Return NULL if not found, or -EINVAL if parameter is invalid. + */ +const struct btf_member *btf_find_struct_member(struct btf *btf, + const struct btf_type *type, + const char *member_name) +{ + const struct btf_member *member, *ret; + const char *name; + int i; + + if (!btf_type_is_struct(type)) + return ERR_PTR(-EINVAL); + + for_each_member(i, type, member) { + if (!member->name_off) { + /* unnamed member: dig deeper */ + type = btf_type_skip_modifiers(btf, member->type, NULL); + if (type) { + ret = btf_find_struct_member(btf, type, + member_name); + if (!IS_ERR_OR_NULL(ret)) + return ret; + } + } else { + name = btf_name_by_offset(btf, member->name_off); + if (name && !strcmp(member_name, name)) + return member; + } + } + + return NULL; +} + #define BTF_SHOW_MAX_ITER 10 #define BTF_KIND_BIT(kind) (1ULL << kind)