From: Steven Rostedt <rostedt@goodmis.org>
To: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>, Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>,
netdev@vger.kernel.org, bpf@vger.kernel.org,
lkml <linux-kernel@vger.kernel.org>,
Martin KaFai Lau <kafai@fb.com>, Song Liu <songliubraving@fb.com>,
Yonghong Song <yhs@fb.com>,
John Fastabend <john.fastabend@gmail.com>,
KP Singh <kpsingh@chromium.org>,
"Naveen N . Rao" <naveen.n.rao@linux.ibm.com>,
Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>,
"David S . Miller" <davem@davemloft.net>
Subject: Re: [PATCH v5 1/9] ftrace: Add ftrace_set_filter_ips function
Date: Tue, 25 Jan 2022 11:06:59 -0500 [thread overview]
Message-ID: <20220125110659.2cc8df29@gandalf.local.home> (raw)
In-Reply-To: <164311270629.1933078.4596694198103138848.stgit@devnote2>
On Tue, 25 Jan 2022 21:11:46 +0900
Masami Hiramatsu <mhiramat@kernel.org> wrote:
> From: Jiri Olsa <jolsa@redhat.com>
>
> Adding ftrace_set_filter_ips function to be able to set filter on
> multiple ip addresses at once.
>
> With the kprobe multi attach interface we have cases where we need to
> initialize ftrace_ops object with thousands of functions, so having
> single function diving into ftrace_hash_move_and_update_ops with
> ftrace_lock is faster.
>
> The functions ips are passed as unsigned long array with count.
>
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
> include/linux/ftrace.h | 3 +++
> kernel/trace/ftrace.c | 53 ++++++++++++++++++++++++++++++++++++++++--------
> 2 files changed, 47 insertions(+), 9 deletions(-)
>
> diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
> index 9999e29187de..60847cbce0da 100644
> --- a/include/linux/ftrace.h
> +++ b/include/linux/ftrace.h
> @@ -512,6 +512,8 @@ struct dyn_ftrace {
>
> int ftrace_set_filter_ip(struct ftrace_ops *ops, unsigned long ip,
> int remove, int reset);
> +int ftrace_set_filter_ips(struct ftrace_ops *ops, unsigned long *ips,
> + unsigned int cnt, int remove, int reset);
> int ftrace_set_filter(struct ftrace_ops *ops, unsigned char *buf,
> int len, int reset);
> int ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf,
> @@ -802,6 +804,7 @@ static inline unsigned long ftrace_location(unsigned long ip)
> #define ftrace_regex_open(ops, flag, inod, file) ({ -ENODEV; })
> #define ftrace_set_early_filter(ops, buf, enable) do { } while (0)
> #define ftrace_set_filter_ip(ops, ip, remove, reset) ({ -ENODEV; })
> +#define ftrace_set_filter_ips(ops, ips, cnt, remove, reset) ({ -ENODEV; })
> #define ftrace_set_filter(ops, buf, len, reset) ({ -ENODEV; })
> #define ftrace_set_notrace(ops, buf, len, reset) ({ -ENODEV; })
> #define ftrace_free_filter(ops) do { } while (0)
> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
> index be5f6b32a012..39350aa38649 100644
> --- a/kernel/trace/ftrace.c
> +++ b/kernel/trace/ftrace.c
> @@ -4958,7 +4958,7 @@ ftrace_notrace_write(struct file *file, const char __user *ubuf,
> }
>
> static int
> -ftrace_match_addr(struct ftrace_hash *hash, unsigned long ip, int remove)
> +__ftrace_match_addr(struct ftrace_hash *hash, unsigned long ip, int remove)
> {
> struct ftrace_func_entry *entry;
>
> @@ -4976,9 +4976,25 @@ ftrace_match_addr(struct ftrace_hash *hash, unsigned long ip, int remove)
> return add_hash_entry(hash, ip);
> }
>
> +static int
> +ftrace_match_addr(struct ftrace_hash *hash, unsigned long *ips,
> + unsigned int cnt, int remove)
> +{
> + unsigned int i;
> + int err;
> +
> + for (i = 0; i < cnt; i++) {
> + err = __ftrace_match_addr(hash, ips[i], remove);
> + if (err)
> + return err;
On error should we revert what was done?
goto err;
> + }
> + return 0;
err:
for (i--; i >= 0; i--)
__ftrace_match_addr(hash, ips[i], !remove);
return err;
Although it may not matter as it looks like it is only used on a temporary
hash. But either it should be commented that is the case, or we do the above
just to be more robust.
> +}
> +
> static int
> ftrace_set_hash(struct ftrace_ops *ops, unsigned char *buf, int len,
> - unsigned long ip, int remove, int reset, int enable)
> + unsigned long *ips, unsigned int cnt,
> + int remove, int reset, int enable)
> {
> struct ftrace_hash **orig_hash;
> struct ftrace_hash *hash;
> @@ -5008,8 +5024,8 @@ ftrace_set_hash(struct ftrace_ops *ops, unsigned char *buf, int len,
> ret = -EINVAL;
> goto out_regex_unlock;
> }
> - if (ip) {
> - ret = ftrace_match_addr(hash, ip, remove);
> + if (ips) {
> + ret = ftrace_match_addr(hash, ips, cnt, remove);
> if (ret < 0)
> goto out_regex_unlock;
> }
> @@ -5026,10 +5042,10 @@ ftrace_set_hash(struct ftrace_ops *ops, unsigned char *buf, int len,
> }
>
> static int
> -ftrace_set_addr(struct ftrace_ops *ops, unsigned long ip, int remove,
> - int reset, int enable)
> +ftrace_set_addr(struct ftrace_ops *ops, unsigned long *ips, unsigned int cnt,
> + int remove, int reset, int enable)
> {
> - return ftrace_set_hash(ops, NULL, 0, ip, remove, reset, enable);
> + return ftrace_set_hash(ops, NULL, 0, ips, cnt, remove, reset, enable);
> }
>
> #ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
> @@ -5634,10 +5650,29 @@ int ftrace_set_filter_ip(struct ftrace_ops *ops, unsigned long ip,
> int remove, int reset)
> {
> ftrace_ops_init(ops);
> - return ftrace_set_addr(ops, ip, remove, reset, 1);
> + return ftrace_set_addr(ops, &ip, 1, remove, reset, 1);
> }
> EXPORT_SYMBOL_GPL(ftrace_set_filter_ip);
>
> +/**
> + * ftrace_set_filter_ips - set a functions to filter on in ftrace by addresses
- set functions to filter on ...
-- Steve
> + * @ops - the ops to set the filter with
> + * @ips - the array of addresses to add to or remove from the filter.
> + * @cnt - the number of addresses in @ips
> + * @remove - non zero to remove ips from the filter
> + * @reset - non zero to reset all filters before applying this filter.
> + *
> + * Filters denote which functions should be enabled when tracing is enabled
> + * If @ips array or any ip specified within is NULL , it fails to update filter.
> + */
> +int ftrace_set_filter_ips(struct ftrace_ops *ops, unsigned long *ips,
> + unsigned int cnt, int remove, int reset)
> +{
> + ftrace_ops_init(ops);
> + return ftrace_set_addr(ops, ips, cnt, remove, reset, 1);
> +}
> +EXPORT_SYMBOL_GPL(ftrace_set_filter_ips);
> +
> /**
> * ftrace_ops_set_global_filter - setup ops to use global filters
> * @ops - the ops which will use the global filters
> @@ -5659,7 +5694,7 @@ static int
> ftrace_set_regex(struct ftrace_ops *ops, unsigned char *buf, int len,
> int reset, int enable)
> {
> - return ftrace_set_hash(ops, buf, len, 0, 0, reset, enable);
> + return ftrace_set_hash(ops, buf, len, NULL, 0, 0, reset, enable);
> }
>
> /**
next prev parent reply other threads:[~2022-01-25 16:08 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-25 12:11 [PATCH v5 0/9] fprobe: Introduce fprobe function entry/exit probe Masami Hiramatsu
2022-01-25 12:11 ` [PATCH v5 1/9] ftrace: Add ftrace_set_filter_ips function Masami Hiramatsu
2022-01-25 16:06 ` Steven Rostedt [this message]
2022-01-25 16:46 ` Jiri Olsa
2022-01-28 2:05 ` Masami Hiramatsu
2022-01-28 9:37 ` Jiri Olsa
2022-01-25 12:11 ` [PATCH v5 2/9] fprobe: Add ftrace based probe APIs Masami Hiramatsu
2022-01-25 16:21 ` Steven Rostedt
2022-01-26 9:06 ` Masami Hiramatsu
2022-01-25 16:41 ` Jiri Olsa
2022-01-25 18:11 ` Jiri Olsa
2022-01-26 2:50 ` Masami Hiramatsu
2022-01-26 15:59 ` Masami Hiramatsu
2022-01-26 18:39 ` Jiri Olsa
2022-01-25 12:12 ` [PATCH v5 3/9] rethook: Add a generic return hook Masami Hiramatsu
2022-01-25 16:46 ` Steven Rostedt
2022-01-26 0:10 ` Masami Hiramatsu
2022-01-26 5:29 ` Masami Hiramatsu
2022-01-25 12:12 ` [PATCH v5 4/9] rethook: x86: Add rethook x86 implementation Masami Hiramatsu
2022-01-25 12:12 ` [PATCH v5 5/9] ARM: rethook: Add rethook arm implementation Masami Hiramatsu
2022-01-25 12:12 ` [PATCH v5 6/9] arm64: rethook: Add arm64 rethook implementation Masami Hiramatsu
2022-01-25 12:12 ` [PATCH v5 7/9] fprobe: Add exit_handler support Masami Hiramatsu
2022-01-25 17:08 ` Steven Rostedt
2022-01-25 12:13 ` [PATCH v5 8/9] fprobe: Add sample program for fprobe Masami Hiramatsu
2022-01-25 12:13 ` [PATCH v5 9/9] docs: fprobe: Add fprobe description to ftrace-use.rst Masami Hiramatsu
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=20220125110659.2cc8df29@gandalf.local.home \
--to=rostedt@goodmis.org \
--cc=andrii@kernel.org \
--cc=anil.s.keshavamurthy@intel.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=john.fastabend@gmail.com \
--cc=jolsa@redhat.com \
--cc=kafai@fb.com \
--cc=kpsingh@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=naveen.n.rao@linux.ibm.com \
--cc=netdev@vger.kernel.org \
--cc=songliubraving@fb.com \
--cc=yhs@fb.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: link
Be 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.