From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-kernel@vger.kernel.org, Ingo Molnar <mingo@kernel.org>,
Andi Kleen <andi@firstfloor.org>,
Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
Sandeepa Prabhu <sandeepa.prabhu@linaro.org>,
Frederic Weisbecker <fweisbec@gmail.com>,
x86@kernel.org, fche@redhat.com, mingo@redhat.com,
systemtap@sourceware.org, "H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: Re: [PATCH -tip v10 7/7] ftrace: Introduce FTRACE_OPS_FL_SELF_FILTER for ftrace-kprobe
Date: Fri, 09 May 2014 12:11:29 +0900 [thread overview]
Message-ID: <536C4761.9050609@hitachi.com> (raw)
In-Reply-To: <20140508065947.214f4951@gandalf.local.home>
(2014/05/08 19:59), Steven Rostedt wrote:
> On Thu, 08 May 2014 18:39:30 +0900
> Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> wrote:
>
>> Since the kprobes itself owns a hash table to get a kprobe
>> data structure corresponding to the given ip address, there
>> is no need to test ftrace hash in ftrace side.
>> To achive better performance on ftrace-based kprobe,
>> FTRACE_OPS_FL_SELF_FILTER flag to ftrace_ops which means
>> that ftrace skips testing its own hash table.
>>
>> Without this patch, ftrace_lookup_ip() is biggest cycles
>> consumer when 20,000 kprobes are enabled.
>> ----
>> Samples: 1K of event 'cycles', Event count (approx.): 340068894
>> + 20.77% [k] ftrace_lookup_ip
>> + 8.33% [k] kprobe_trace_func
>> + 4.83% [k] get_kprobe_cached
>> ----
>>
>> With this patch, ftrace_lookup_ip() vanished from the
>> cycles consumer list (of course, there is no caller on
>> hotpath anymore :))
>> ----
>> Samples: 1K of event 'cycles', Event count (approx.): 186861492
>> + 9.95% [k] kprobe_trace_func
>> + 6.00% [k] kprobe_ftrace_handler
>> + 5.53% [k] get_kprobe_cached
>
> I should look at your filtering methods, maybe it can make ftrace
> filtering better?
Ah! Yes, it could be better :) At least the hash-table cache is good
for ftrace too. Currently it is just for fixed-size hash-table, but
is easy to expand for resizable one. (however, I guess with the cache
we don't need to resize that anymore.)
>
>> ----
>>
>> Changes from v7:
>> - Re-evaluate the performance improvement.
>>
>> Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
>> Cc: Steven Rostedt <rostedt@goodmis.org>
>> Cc: Frederic Weisbecker <fweisbec@gmail.com>
>> Cc: Ingo Molnar <mingo@redhat.com>
>> ---
>> include/linux/ftrace.h | 3 +++
>> kernel/kprobes.c | 2 +-
>> kernel/trace/ftrace.c | 3 ++-
>> 3 files changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
>> index ae9504b..f1fa7d27 100644
>> --- a/include/linux/ftrace.h
>> +++ b/include/linux/ftrace.h
>> @@ -93,6 +93,8 @@ typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip,
>> * INITIALIZED - The ftrace_ops has already been initialized (first use time
>> * register_ftrace_function() is called, it will initialized the ops)
>> * DELETED - The ops are being deleted, do not let them be registered again.
>> + * SELF_FILTER - The ftrace_ops function filters ip by itself. Do not need to
>> + * check hash table on each hit.
>
> - The ftrace_ops function has its own ip filter and does not need to
> rely on the ftrace internal ip filtering.
OK, I'll update that.
>
>
>> */
>> enum {
>> FTRACE_OPS_FL_ENABLED = 1 << 0,
>> @@ -105,6 +107,7 @@ enum {
>> FTRACE_OPS_FL_STUB = 1 << 7,
>> FTRACE_OPS_FL_INITIALIZED = 1 << 8,
>> FTRACE_OPS_FL_DELETED = 1 << 9,
>> + FTRACE_OPS_FL_SELF_FILTER = 1 << 10,
>> };
>>
>> /*
>> diff --git a/kernel/kprobes.c b/kernel/kprobes.c
>> index 0f5f23c..5c6e410 100644
>> --- a/kernel/kprobes.c
>> +++ b/kernel/kprobes.c
>> @@ -1027,7 +1027,7 @@ static struct kprobe *alloc_aggr_kprobe(struct kprobe *p)
>> #ifdef CONFIG_KPROBES_ON_FTRACE
>> static struct ftrace_ops kprobe_ftrace_ops __read_mostly = {
>> .func = kprobe_ftrace_handler,
>> - .flags = FTRACE_OPS_FL_SAVE_REGS,
>> + .flags = FTRACE_OPS_FL_SAVE_REGS | FTRACE_OPS_FL_SELF_FILTER,
>> };
>> static int kprobe_ftrace_enabled;
>>
>> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
>> index 4a54a25..062ca20 100644
>> --- a/kernel/trace/ftrace.c
>> +++ b/kernel/trace/ftrace.c
>> @@ -4501,7 +4501,8 @@ __ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip,
>> */
>> preempt_disable_notrace();
>> do_for_each_ftrace_op(op, ftrace_ops_list) {
>> - if (ftrace_ops_test(op, ip, regs))
>> + if (op->flags & FTRACE_OPS_FL_SELF_FILTER ||
>> + ftrace_ops_test(op, ip, regs))
>
> Hmm, I wonder if I should add the check for:
>
> !(op->flags & FTRACE_OPS_FL_STUB)
>
> here too? But that's another change that I'll do.
Indeed. BTW, should I change ftrace_ops_control_func() too?
>
> Just update the flag description as I commented and the rest looks good.
OK, thanks!
--
Masami HIRAMATSU
Software Platform Research Dept. Linux Technology Research Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@hitachi.com
next prev parent reply other threads:[~2014-05-09 3:11 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-08 9:38 [PATCH -tip v10 0/7] kprobes: NOKPROBE_SYMBOL for modules, and scalbility efforts Masami Hiramatsu
2014-05-08 9:38 ` [PATCH -tip v10 1/7] kprobes: Support blacklist functions in module Masami Hiramatsu
2014-05-08 9:38 ` [PATCH -tip v10 2/7] kprobes: Use NOKPROBE_SYMBOL() in sample modules Masami Hiramatsu
2014-05-08 9:39 ` [PATCH -tip v10 3/7] kprobes/x86: Use kprobe_blacklist for .kprobes.text and .entry.text Masami Hiramatsu
2014-05-08 9:39 ` [PATCH -tip v10 4/7] kprobes/x86: Remove unneeded preempt_disable/enable in interrupt handlers Masami Hiramatsu
2014-05-08 9:39 ` [PATCH -tip v10 5/7] kprobes: Enlarge hash table to 512 entries Masami Hiramatsu
2014-05-08 9:39 ` [PATCH -tip v10 6/7] kprobes: Introduce kprobe cache to reduce cache misshits Masami Hiramatsu
2014-05-08 9:39 ` [PATCH -tip v10 7/7] ftrace: Introduce FTRACE_OPS_FL_SELF_FILTER for ftrace-kprobe Masami Hiramatsu
2014-05-08 10:59 ` Steven Rostedt
2014-05-09 3:11 ` Masami Hiramatsu [this message]
2014-05-09 3:43 ` Steven Rostedt
2014-05-09 10:04 ` [PATCH -tip v10.1] " 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=536C4761.9050609@hitachi.com \
--to=masami.hiramatsu.pt@hitachi.com \
--cc=ananth@in.ibm.com \
--cc=andi@firstfloor.org \
--cc=fche@redhat.com \
--cc=fweisbec@gmail.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=mingo@redhat.com \
--cc=rostedt@goodmis.org \
--cc=sandeepa.prabhu@linaro.org \
--cc=systemtap@sourceware.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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.