From: Frederic Weisbecker <fweisbec@gmail.com>
To: Jason Baron <jbaron@redhat.com>
Cc: linux-kernel@vger.kernel.org, mingo@elte.hu,
laijs@cn.fujitsu.com, rostedt@goodmis.org, peterz@infradead.org,
mathieu.desnoyers@polymtl.ca, jiayingz@google.com,
mbligh@google.com, lizf@cn.fujitsu.com
Subject: Re: [PATCH 09/12] add support traceopint ids
Date: Tue, 11 Aug 2009 13:28:47 +0200 [thread overview]
Message-ID: <20090811112845.GD4938@nowhere> (raw)
In-Reply-To: <996d6713d889ddf697d3d4fdbb08645fa8343dd5.1249932670.git.jbaron@redhat.com>
On Mon, Aug 10, 2009 at 04:52:53PM -0400, Jason Baron wrote:
> This patch associates an id with each syscall trace event, so that we can
> identify each syscall trace event using the 'perf' tool.
>
> Signed-off-by: Jason Baron <jbaron@redhat.com>
>
> ---
> arch/x86/kernel/ftrace.c | 10 ++++++++++
> include/linux/syscalls.h | 22 ++++++++++++++++++----
> include/trace/syscall.h | 8 ++++++++
> kernel/trace/trace.h | 6 ------
> kernel/trace/trace_syscalls.c | 26 ++++++++++++++++----------
> 5 files changed, 52 insertions(+), 20 deletions(-)
>
> diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c
> index 0d93d40..3cff121 100644
> --- a/arch/x86/kernel/ftrace.c
> +++ b/arch/x86/kernel/ftrace.c
> @@ -516,6 +516,16 @@ int syscall_name_to_nr(char *name)
> return -1;
> }
>
> +void set_syscall_enter_id(int num, int id)
> +{
> + syscalls_metadata[num]->enter_id = id;
> +}
> +
> +void set_syscall_exit_id(int num, int id)
> +{
> + syscalls_metadata[num]->exit_id = id;
> +}
> +
> static int __init arch_init_ftrace_syscalls(void)
> {
> int i;
> diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
> index 5e5b4d3..ce4b01c 100644
> --- a/include/linux/syscalls.h
> +++ b/include/linux/syscalls.h
> @@ -116,13 +116,20 @@ struct perf_counter_attr;
>
> #define SYSCALL_TRACE_ENTER_EVENT(sname) \
> static struct ftrace_event_call event_enter_##sname; \
> + struct trace_event enter_syscall_print_##sname = { \
> + .trace = print_syscall_enter, \
> + }; \
> static int init_enter_##sname(void) \
> { \
> - int num; \
> + int num, id; \
> num = syscall_name_to_nr("sys"#sname); \
> if (num < 0) \
> return -ENOSYS; \
> - register_ftrace_event(&event_syscall_enter); \
> + id = register_ftrace_event(&enter_syscall_print_##sname);\
Since kprobes also need a unique id despite a single print callback,
Because this issue is then not isolated, we need a generic event number
generator from ftrace.
IIRC Masami's kprobe patchset brought this. In this case,
we need to remember fixing this on the syscall tracing side once it's merged.
> + if (!id) \
> + return -ENODEV; \
> + event_enter_##sname.id = id; \
> + set_syscall_enter_id(num, id); \
> INIT_LIST_HEAD(&event_enter_##sname.fields); \
> init_preds(&event_enter_##sname); \
> return 0; \
> @@ -142,13 +149,20 @@ struct perf_counter_attr;
>
> #define SYSCALL_TRACE_EXIT_EVENT(sname) \
> static struct ftrace_event_call event_exit_##sname; \
> + struct trace_event exit_syscall_print_##sname = { \
> + .trace = print_syscall_exit, \
> + }; \
> static int init_exit_##sname(void) \
> { \
> - int num; \
> + int num, id; \
> num = syscall_name_to_nr("sys"#sname); \
> if (num < 0) \
> return -ENOSYS; \
> - register_ftrace_event(&event_syscall_exit); \
> + id = register_ftrace_event(&exit_syscall_print_##sname);\
> + if (!id) \
> + return -ENODEV; \
> + event_exit_##sname.id = id; \
> + set_syscall_exit_id(num, id); \
> INIT_LIST_HEAD(&event_exit_##sname.fields); \
> init_preds(&event_exit_##sname); \
> return 0; \
> diff --git a/include/trace/syscall.h b/include/trace/syscall.h
> index 73fb8b4..df62840 100644
> --- a/include/trace/syscall.h
> +++ b/include/trace/syscall.h
> @@ -32,23 +32,31 @@ DECLARE_TRACE_WITH_CALLBACK(syscall_exit,
> * @nb_args: number of parameters it takes
> * @types: list of types as strings
> * @args: list of args as strings (args[i] matches types[i])
> + * @enter_id: associated ftrace enter event id
> + * @exit_id: associated ftrace exit event id
> */
> struct syscall_metadata {
> const char *name;
> int nb_args;
> const char **types;
> const char **args;
> + int enter_id;
> + int exit_id;
> };
>
> #ifdef CONFIG_FTRACE_SYSCALLS
> extern struct syscall_metadata *syscall_nr_to_meta(int nr);
> extern int syscall_name_to_nr(char *name);
> +void set_syscall_enter_id(int num, int id);
> +void set_syscall_exit_id(int num, int id);
> extern struct trace_event event_syscall_enter;
> extern struct trace_event event_syscall_exit;
> extern int reg_event_syscall_enter(void *ptr);
> extern void unreg_event_syscall_enter(void *ptr);
> extern int reg_event_syscall_exit(void *ptr);
> extern void unreg_event_syscall_exit(void *ptr);
> +enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags);
> +enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags);
> #endif
>
> #endif /* _TRACE_SYSCALL_H */
> diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
> index 44308f3..606073c 100644
> --- a/kernel/trace/trace.h
> +++ b/kernel/trace/trace.h
> @@ -38,8 +38,6 @@ enum trace_type {
> TRACE_GRAPH_ENT,
> TRACE_USER_STACK,
> TRACE_HW_BRANCHES,
> - TRACE_SYSCALL_ENTER,
> - TRACE_SYSCALL_EXIT,
> TRACE_KMEM_ALLOC,
> TRACE_KMEM_FREE,
> TRACE_POWER,
> @@ -334,10 +332,6 @@ extern void __ftrace_bad_type(void);
> TRACE_KMEM_ALLOC); \
> IF_ASSIGN(var, ent, struct kmemtrace_free_entry, \
> TRACE_KMEM_FREE); \
> - IF_ASSIGN(var, ent, struct syscall_trace_enter, \
> - TRACE_SYSCALL_ENTER); \
> - IF_ASSIGN(var, ent, struct syscall_trace_exit, \
> - TRACE_SYSCALL_EXIT); \
> IF_ASSIGN(var, ent, struct ksym_trace_entry, TRACE_KSYM);\
> __ftrace_bad_type(); \
> } while (0)
> diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
> index c7ae25e..e58a9c1 100644
> --- a/kernel/trace/trace_syscalls.c
> +++ b/kernel/trace/trace_syscalls.c
> @@ -36,14 +36,18 @@ print_syscall_enter(struct trace_iterator *iter, int flags)
> struct syscall_metadata *entry;
> int i, ret, syscall;
>
> - trace_assign_type(trace, ent);
> -
> + trace = (typeof(trace))ent;
> syscall = trace->nr;
> -
> entry = syscall_nr_to_meta(syscall);
> +
> if (!entry)
> goto end;
>
> + if (entry->enter_id != ent->type) {
> + WARN_ON_ONCE(1);
> + goto end;
> + }
> +
> ret = trace_seq_printf(s, "%s(", entry->name);
> if (!ret)
> return TRACE_TYPE_PARTIAL_LINE;
> @@ -78,16 +82,20 @@ print_syscall_exit(struct trace_iterator *iter, int flags)
> struct syscall_metadata *entry;
> int ret;
>
> - trace_assign_type(trace, ent);
> -
> + trace = (typeof(trace))ent;
> syscall = trace->nr;
> -
> entry = syscall_nr_to_meta(syscall);
> +
> if (!entry) {
> trace_seq_printf(s, "\n");
> return TRACE_TYPE_HANDLED;
> }
>
> + if (entry->exit_id != ent->type) {
> + WARN_ON_ONCE(1);
> + return TRACE_TYPE_UNHANDLED;
> + }
> +
> ret = trace_seq_printf(s, "%s -> 0x%lx\n", entry->name,
> trace->ret);
> if (!ret)
> @@ -114,7 +122,7 @@ void ftrace_syscall_enter(struct pt_regs *regs, long id)
>
> size = sizeof(*entry) + sizeof(unsigned long) * sys_data->nb_args;
>
> - event = trace_current_buffer_lock_reserve(TRACE_SYSCALL_ENTER, size,
> + event = trace_current_buffer_lock_reserve(sys_data->enter_id, size,
> 0, 0);
> if (!event)
> return;
> @@ -142,7 +150,7 @@ void ftrace_syscall_exit(struct pt_regs *regs, long ret)
> if (!sys_data)
> return;
>
> - event = trace_current_buffer_lock_reserve(TRACE_SYSCALL_EXIT,
> + event = trace_current_buffer_lock_reserve(sys_data->exit_id,
> sizeof(*entry), 0, 0);
> if (!event)
> return;
> @@ -239,10 +247,8 @@ void unreg_event_syscall_exit(void *ptr)
>
> struct trace_event event_syscall_enter = {
> .trace = print_syscall_enter,
> - .type = TRACE_SYSCALL_ENTER
> };
>
> struct trace_event event_syscall_exit = {
> .trace = print_syscall_exit,
> - .type = TRACE_SYSCALL_EXIT
> };
Do you still need the two above now that you have defined individual
print callbacks from syscall.h ?
> --
> 1.6.2.5
>
next prev parent reply other threads:[~2009-08-11 12:38 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-10 20:52 [PATCH 00/12] add syscall tracepoints V3 Jason Baron
2009-08-10 20:52 ` [PATCH 01/12] map syscall name to number Jason Baron
2009-08-10 20:52 ` [PATCH 02/12] call arch_init_ftrace_syscalls at boot Jason Baron
2009-08-10 20:52 ` [PATCH 03/12] add DECLARE_TRACE_WITH_CALLBACK() macro Jason Baron
2009-08-10 20:52 ` [PATCH 04/12] add syscall tracepoints Jason Baron
2009-08-10 20:52 ` [PATCH 05/12] update FTRACE_SYSCALL_MAX Jason Baron
2009-08-11 11:00 ` Frederic Weisbecker
2009-08-11 19:39 ` Matt Fleming
2009-08-24 13:41 ` Paul Mundt
2009-08-24 14:06 ` Jason Baron
2009-08-24 14:15 ` Paul Mundt
2009-08-24 14:34 ` Frederic Weisbecker
2009-08-24 14:37 ` Paul Mundt
2009-08-24 14:42 ` Jason Baron
2009-08-24 14:50 ` Paul Mundt
2009-08-24 18:34 ` Ingo Molnar
2009-08-10 20:52 ` [PATCH 06/12] trace_event - raw_init bailout Jason Baron
2009-08-10 20:52 ` [PATCH 07/12] add ftrace_event_call void * 'data' field Jason Baron
2009-08-11 10:09 ` Frederic Weisbecker
2009-08-17 22:19 ` Steven Rostedt
2009-08-17 23:09 ` Frederic Weisbecker
2009-08-18 0:06 ` Steven Rostedt
2009-08-10 20:52 ` [PATCH 08/12] add trace events for each syscall entry/exit Jason Baron
2009-08-11 10:50 ` Frederic Weisbecker
2009-08-11 11:45 ` Ingo Molnar
2009-08-11 12:01 ` Frederic Weisbecker
2009-08-25 12:50 ` Hendrik Brueckner
2009-08-25 14:15 ` Frederic Weisbecker
2009-08-25 16:02 ` Hendrik Brueckner
2009-08-25 16:20 ` Mathieu Desnoyers
2009-08-25 16:59 ` Frederic Weisbecker
2009-08-25 17:31 ` Frederic Weisbecker
2009-08-25 18:31 ` Mathieu Desnoyers
2009-08-25 19:42 ` Frederic Weisbecker
2009-08-25 19:51 ` Mathieu Desnoyers
2009-08-26 0:19 ` Frederic Weisbecker
2009-08-26 0:42 ` Mathieu Desnoyers
2009-08-26 7:28 ` Ingo Molnar
2009-08-26 17:11 ` Mathieu Desnoyers
2009-08-26 6:48 ` Peter Zijlstra
2009-08-25 22:04 ` Martin Schwidefsky
2009-08-26 7:38 ` Heiko Carstens
2009-08-26 12:32 ` Frederic Weisbecker
2009-08-26 6:21 ` Peter Zijlstra
2009-08-26 17:08 ` Mathieu Desnoyers
2009-08-26 18:41 ` Christoph Hellwig
2009-08-26 18:42 ` Christoph Hellwig
2009-08-26 19:01 ` Mathieu Desnoyers
2009-08-26 7:10 ` Peter Zijlstra
2009-08-26 17:10 ` Mathieu Desnoyers
2009-08-26 17:24 ` H. Peter Anvin
2009-08-25 17:04 ` Jason Baron
2009-08-25 18:15 ` Mathieu Desnoyers
2009-08-26 12:35 ` Frederic Weisbecker
2009-08-26 12:59 ` Heiko Carstens
2009-08-26 13:30 ` Frederic Weisbecker
2009-08-26 13:48 ` Steven Rostedt
2009-08-26 13:53 ` Frederic Weisbecker
2009-08-26 14:44 ` Steven Rostedt
2009-08-26 13:56 ` Peter Zijlstra
2009-08-26 14:41 ` Steven Rostedt
2009-08-26 14:10 ` Heiko Carstens
2009-08-26 14:27 ` Frederic Weisbecker
2009-08-26 14:43 ` Steven Rostedt
2009-08-26 16:14 ` Frederic Weisbecker
2009-08-26 14:43 ` Steven Rostedt
2009-08-26 14:41 ` Hendrik Brueckner
2009-08-28 12:28 ` [tip:tracing/core] tracing: Don't trace kernel thread syscalls tip-bot for Hendrik Brueckner
2009-08-25 21:40 ` [PATCH 08/12] add trace events for each syscall entry/exit Frederic Weisbecker
2009-08-25 22:09 ` Frederic Weisbecker
2009-08-26 7:47 ` Heiko Carstens
2009-08-28 12:27 ` [tip:tracing/core] tracing: Check invalid syscall nr while tracing syscalls tip-bot for Hendrik Brueckner
2009-08-10 20:52 ` [PATCH 09/12] add support traceopint ids Jason Baron
2009-08-11 11:28 ` Frederic Weisbecker [this message]
2009-08-10 20:53 ` [PATCH 10/12] add perf counter support Jason Baron
2009-08-11 12:12 ` Frederic Weisbecker
2009-08-11 12:17 ` Ingo Molnar
2009-08-11 12:25 ` Frederic Weisbecker
2009-08-10 20:53 ` [PATCH 11/12] add more namespace area to 'perf list' output Jason Baron
2009-08-10 20:53 ` [PATCH 12/12] convert x86_64 mmap and uname to use DEFINE_SYSCALL Jason Baron
2009-08-25 12:31 ` [PATCH 00/12] add syscall tracepoints V3 - s390 arch update Hendrik Brueckner
2009-08-25 13:52 ` Frederic Weisbecker
2009-08-25 14:39 ` Heiko Carstens
2009-08-25 19:52 ` Frederic Weisbecker
2009-08-25 15:38 ` Hendrik Brueckner
2009-08-26 16:53 ` Frederic Weisbecker
2009-08-27 7:27 ` [PATCH]: tracing: s390 arch updates for tracing syscalls Hendrik Brueckner
2009-08-28 12:27 ` [tip:tracing/core] tracing: Add syscall tracepoints - s390 arch update tip-bot for Hendrik Brueckner
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=20090811112845.GD4938@nowhere \
--to=fweisbec@gmail.com \
--cc=jbaron@redhat.com \
--cc=jiayingz@google.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lizf@cn.fujitsu.com \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=mbligh@google.com \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox