tracing/syscalls: Add filtering support
cover tracing/syscalls: Add filtering support
This patchset adds filtering support for syscall events
For syscall enter events, we can do filtering on syscall parameters, and for exit events, filter on syscall return value.
For example, we set 'mode == 0666' (0666 == 0x1b6) to sys_enter_open, and set 'ret == 0' to sys_exit_open, and here's the output:
# echo 'mode == 0666' > events/syscalls/sys_enter_open
# echo 'ret == 0' > events/syscalls/sys_exit_open
# echo 1 > events/syscalls/sys_enter_open
# echo 1 > events/syscalls/sys_exit_open
# cat trace
...
modprobe-3084 [001] 117.463140: sys_open(filename: 917d3e8, flags: 0, mode: 1b6)
modprobe-3084 [001] 117.463176: sys_open -> 0x0
less-3086 [001] 117.510455: sys_open(filename: 9c6bdb8, flags: 8000, mode: 1b6)
sendmail-2574 [001] 122.145840: sys_open(filename: b807a365, flags: 0, mode: 1b6)
...[PATCH 1/5] tracing/syscalls: Fix fields format for enter events [PATCH 2/5] tracing/syscalls: Add fields format for exit events [PATCH 3/5] tracing/events: Add ftrace_event_call param to define_fields() [PATCH 4/5] tracing/events: Add trace_define_common_fields() [PATCH 5/5] tracing/syscalls: Add filtering support
--- include/linux/ftrace_event.h | 15 ++---- include/linux/syscalls.h | 19 +++++-- include/trace/ftrace.h | 11 ++--- include/trace/syscall.h | 13 ++++- kernel/trace/trace_events.c | 29 +++++++++- kernel/trace/trace_export.c | 13 ++--- kernel/trace/trace_syscalls.c | 120 +++++++++++++++++++++++++++++++---------- 7 files changed, 156 insertions(+), 64 deletions(-)
PATCH 1/5 tracing/syscalls: Fix fields format for enter events
The "format" file of a trace event is originally for parsers to parse ftrace binary output.
But the "format" file of a syscall event can only be used by perfcounter, because it describes the format of struct syscall_enter_record not struct syscall_trace_enter.
To fix this, we remove struct syscall_enter_record, and then struct syscall_trace_enter will be used by both perf profile and ftrace.
--- kernel/trace/trace_syscalls.c | 51 ++++++++++++++++++++++------------------ 1 files changed, 28 insertions(+), 23 deletions(-)
kernel/trace/trace_syscalls.c +28 -23
@@ -90,26 +90,39 @@ print_syscall_exit(struct trace_iterator *iter, int flags)return TRACE_TYPE_HANDLED ; } +extern char *__bad_type_size (void ); + +#define SYSCALL_FIELD (type, name) \ + sizeof(type) != sizeof(trace.name) ? \ + __bad_type_size() : \ + #type, #name, offsetof(typeof(trace), name), sizeof(trace.name) +int ftrace_format_syscall (struct ftrace_event_call *call,struct trace_seq *s) {int i;int nr; -int ret =0 ; +int ret;struct syscall_metadata *entry; -int offset =sizeof (struct trace_entry ); +struct syscall_trace_enter trace; +int offset = offsetof(struct syscall_trace_enter , args); - nr =syscall_name_to_nr ((char *)call->data); + nr =syscall_name_to_nr (call->data); entry =syscall_nr_to_meta (nr);if (!entry) -return ret; +return 0 ; + + ret =trace_seq_printf (s,"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" , +SYSCALL_FIELD (int, nr)); +if (!ret) +return 0 ;for (i =0 ; i < entry->nb_args; i++) { ret =trace_seq_printf (s,"\tfield:%s %s;" , entry->types[i], entry->args[i]);if (!ret)return 0 ; - ret =trace_seq_printf (s,"\toffset:%d;\tsize:%lu;\n" , offset, + ret =trace_seq_printf (s,"\toffset:%d;\tsize:%zu;\n" , offset,sizeof (unsigned long ));if (!ret)return 0 ;
@@ -118,7 +131,7 @@ int ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s)trace_seq_printf (s,"\nprint fmt: \"" );for (i =0 ; i < entry->nb_args; i++) { - ret =trace_seq_printf (s,"%s: 0x%%0%lulx%s" , entry->args[i], + ret =trace_seq_printf (s,"%s: 0x%%0%zulx%s" , entry->args[i],sizeof (unsigned long ), i == entry->nb_args -1 ?"\", " :", " );if (!ret)
@@ -287,16 +300,6 @@ struct trace_event event_syscall_exit = {#ifdef CONFIG_EVENT_PROFILE -struct syscall_enter_record { -struct trace_entry entry; -unsigned long args[0 ]; -}; - -struct syscall_exit_record { -struct trace_entry entry; -unsigned long ret; -}; - static DECLARE_BITMAP(enabled_prof_enter_syscalls, FTRACE_SYSCALL_MAX); static DECLARE_BITMAP(enabled_prof_exit_syscalls, FTRACE_SYSCALL_MAX);static int sys_prof_refcount_enter;
@@ -304,7 +307,7 @@ static int sys_prof_refcount_exit;static void prof_syscall_enter (struct pt_regs *regs,long id) { -struct syscall_enter_record *rec; +struct syscall_trace_enter *rec;struct syscall_metadata *sys_data;int syscall_nr;int size;
@@ -328,9 +331,10 @@ static void prof_syscall_enter(struct pt_regs *regs, long id)/* zero the dead bytes from align to not leak stack to user */ *(u64 *)(&raw_data[size -sizeof (u64)]) =0ULL ; - rec = (struct syscall_enter_record *) raw_data; -tracing_generic_entry_update (&rec->entry,0 ,0 ); - rec->entry.type = sys_data->enter_id; + rec = (struct syscall_trace_enter *) raw_data; +tracing_generic_entry_update (&rec->ent,0 ,0 ); + rec->ent.type = sys_data->enter_id; + rec->nr = syscall_nr;syscall_get_arguments (current, regs,0 , sys_data->nb_args, (unsigned long *)&rec->args);perf_tpcounter_event (sys_data->enter_id,0 ,1 , rec, size);
@@ -379,7 +383,7 @@ void unreg_prof_syscall_enter(char *name)static void prof_syscall_exit (struct pt_regs *regs,long ret) {struct syscall_metadata *sys_data; -struct syscall_exit_record rec; +struct syscall_trace_exit rec;int syscall_nr; syscall_nr =syscall_get_nr (current, regs);
@@ -390,8 +394,9 @@ static void prof_syscall_exit(struct pt_regs *regs, long ret)if (!sys_data)return ; -tracing_generic_entry_update (&rec.entry,0 ,0 ); - rec.entry.type = sys_data->exit_id; +tracing_generic_entry_update (&rec.ent,0 ,0 ); + rec.ent.type = sys_data->exit_id; + rec.nr = syscall_nr; rec.ret =syscall_get_return_value (current, regs);perf_tpcounter_event (sys_data->exit_id,0 ,1 , &rec,sizeof (rec));
Signature · 1 line
1.6.3
[tip:tracing/core] tracing/syscalls: Fix fields format for enter events
Commit-ID: e6971969c331caa5c3c88cbd1be4f465b3355452 Gitweb: http://git.kernel.org/tip/e6971969c331caa5c3c88cbd1be4f465b3355452 Author: Li Zefan <[email protected]> AuthorDate: Wed, 19 Aug 2009 15:52:25 +0800 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 19 Aug 2009 15:02:22 +0200
tracing/syscalls: Fix fields format for enter events
The "format" file of a trace event is originally for parsers to parse ftrace binary output.
But the "format" file of a syscall event can only be used by perfcounter, because it describes the format of struct syscall_enter_record not struct syscall_trace_enter.
To fix this, we remove struct syscall_enter_record, and then struct syscall_trace_enter will be used by both perf profile and ftrace.
LKML-Reference: <[email protected]>
--- kernel/trace/trace_syscalls.c | 51 ++++++++++++++++++++++------------------ 1 files changed, 28 insertions(+), 23 deletions(-)
kernel/trace/trace_syscalls.c +28 -23
@@ -90,26 +90,39 @@ print_syscall_exit(struct trace_iterator *iter, int flags)return TRACE_TYPE_HANDLED ; } +extern char *__bad_type_size (void ); + +#define SYSCALL_FIELD (type, name) \ + sizeof(type) != sizeof(trace.name) ? \ + __bad_type_size() : \ + #type, #name, offsetof(typeof(trace), name), sizeof(trace.name) +int ftrace_format_syscall (struct ftrace_event_call *call,struct trace_seq *s) {int i;int nr; -int ret =0 ; +int ret;struct syscall_metadata *entry; -int offset =sizeof (struct trace_entry ); +struct syscall_trace_enter trace; +int offset = offsetof(struct syscall_trace_enter , args); - nr =syscall_name_to_nr ((char *)call->data); + nr =syscall_name_to_nr (call->data); entry =syscall_nr_to_meta (nr);if (!entry) -return ret; +return 0 ; + + ret =trace_seq_printf (s,"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" , +SYSCALL_FIELD (int, nr)); +if (!ret) +return 0 ;for (i =0 ; i < entry->nb_args; i++) { ret =trace_seq_printf (s,"\tfield:%s %s;" , entry->types[i], entry->args[i]);if (!ret)return 0 ; - ret =trace_seq_printf (s,"\toffset:%d;\tsize:%lu;\n" , offset, + ret =trace_seq_printf (s,"\toffset:%d;\tsize:%zu;\n" , offset,sizeof (unsigned long ));if (!ret)return 0 ;
@@ -118,7 +131,7 @@ int ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s)trace_seq_printf (s,"\nprint fmt: \"" );for (i =0 ; i < entry->nb_args; i++) { - ret =trace_seq_printf (s,"%s: 0x%%0%lulx%s" , entry->args[i], + ret =trace_seq_printf (s,"%s: 0x%%0%zulx%s" , entry->args[i],sizeof (unsigned long ), i == entry->nb_args -1 ?"\", " :", " );if (!ret)
@@ -287,16 +300,6 @@ struct trace_event event_syscall_exit = {#ifdef CONFIG_EVENT_PROFILE -struct syscall_enter_record { -struct trace_entry entry; -unsigned long args[0 ]; -}; - -struct syscall_exit_record { -struct trace_entry entry; -unsigned long ret; -}; - static DECLARE_BITMAP(enabled_prof_enter_syscalls, FTRACE_SYSCALL_MAX); static DECLARE_BITMAP(enabled_prof_exit_syscalls, FTRACE_SYSCALL_MAX);static int sys_prof_refcount_enter;
@@ -304,7 +307,7 @@ static int sys_prof_refcount_exit;static void prof_syscall_enter (struct pt_regs *regs,long id) { -struct syscall_enter_record *rec; +struct syscall_trace_enter *rec;struct syscall_metadata *sys_data;int syscall_nr;int size;
@@ -328,9 +331,10 @@ static void prof_syscall_enter(struct pt_regs *regs, long id)/* zero the dead bytes from align to not leak stack to user */ *(u64 *)(&raw_data[size -sizeof (u64)]) =0ULL ; - rec = (struct syscall_enter_record *) raw_data; -tracing_generic_entry_update (&rec->entry,0 ,0 ); - rec->entry.type = sys_data->enter_id; + rec = (struct syscall_trace_enter *) raw_data; +tracing_generic_entry_update (&rec->ent,0 ,0 ); + rec->ent.type = sys_data->enter_id; + rec->nr = syscall_nr;syscall_get_arguments (current, regs,0 , sys_data->nb_args, (unsigned long *)&rec->args);perf_tpcounter_event (sys_data->enter_id,0 ,1 , rec, size);
@@ -379,7 +383,7 @@ void unreg_prof_syscall_enter(char *name)static void prof_syscall_exit (struct pt_regs *regs,long ret) {struct syscall_metadata *sys_data; -struct syscall_exit_record rec; +struct syscall_trace_exit rec;int syscall_nr; syscall_nr =syscall_get_nr (current, regs);
@@ -390,8 +394,9 @@ static void prof_syscall_exit(struct pt_regs *regs, long ret)if (!sys_data)return ; -tracing_generic_entry_update (&rec.entry,0 ,0 ); - rec.entry.type = sys_data->exit_id; +tracing_generic_entry_update (&rec.ent,0 ,0 ); + rec.ent.type = sys_data->exit_id; + rec.nr = syscall_nr; rec.ret =syscall_get_return_value (current, regs);perf_tpcounter_event (sys_data->exit_id,0 ,1 , &rec,sizeof (rec));
PATCH 2/5 tracing/syscalls: Add fields format for exit events
In reply to Li ZefanAdd "format" file for syscall exit events:
# cat events/syscalls/sys_exit_open/format
name: sys_exit_open
ID: 344
format:
field:unsigned short common_type; offset:0; size:2;
field:unsigned char common_flags; offset:2; size:1;
field:unsigned char common_preempt_count; offset:3; size:1;
field:int common_pid; offset:4; size:4;
field:int common_tgid; offset:8; size:4; field:int nr; offset:12; size:4;
field:unsigned long ret; offset:16; size:4;--- include/linux/syscalls.h | 3 ++- include/trace/syscall.h | 6 ++++-- kernel/trace/trace_syscalls.c | 18 +++++++++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-)
include/linux/syscalls.h +2 -1
@@ -189,7 +189,7 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .system = "syscalls", \ .event = &event_syscall_enter, \ .raw_init = init_enter_##sname, \ - .show_format = ftrace_format_syscall, \ + .show_format = syscall_enter_format, \ .regfunc = reg_event_syscall_enter, \ .unregfunc = unreg_event_syscall_enter, \ .data = "sys"#sname, \
@@ -225,6 +225,7 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .system = "syscalls", \ .event = &event_syscall_exit, \ .raw_init = init_exit_##sname, \ + .show_format = syscall_exit_format, \ .regfunc = reg_event_syscall_exit, \ .unregfunc = unreg_event_syscall_exit, \ .data = "sys"#sname, \
include/trace/syscall.h +4 -2
@@ -55,8 +55,10 @@ 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); -extern int -ftrace_format_syscall (struct ftrace_event_call *call,struct trace_seq *s); +extern int syscall_enter_format (struct ftrace_event_call *call, +struct trace_seq *s); +extern int syscall_exit_format (struct ftrace_event_call *call, +struct trace_seq *s);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
kernel/trace/trace_syscalls.c +17 -1
@@ -97,7 +97,7 @@ extern char *__bad_type_size(void); __bad_type_size() : \#type , #name, offsetof(typeof(trace), name), sizeof(trace.name) -int ftrace_format_syscall (struct ftrace_event_call *call,struct trace_seq *s) +int syscall_enter_format (struct ftrace_event_call *call,struct trace_seq *s) {int i;int nr;
@@ -149,6 +149,22 @@ int ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s)return ret; } +int syscall_exit_format (struct ftrace_event_call *call,struct trace_seq *s) +{ +int ret; +struct syscall_trace_exit trace; + + ret =trace_seq_printf (s, +"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" +"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" , +SYSCALL_FIELD (int, nr), + SYSCALL_FIELD(unsigned long, ret)); +if (!ret) +return 0 ; + +return trace_seq_printf (s,"\nprint fmt: \"0x%%lx\", REC->ret\n" ); +} +void ftrace_syscall_enter (struct pt_regs *regs,long id) {struct syscall_trace_enter *entry;
Signature · 1 line
1.6.3
[tip:tracing/core] tracing/syscalls: Add fields format for exit events
Commit-ID: 10a5b66f625904ad5a2867cf7a28073e1236ff32 Gitweb: http://git.kernel.org/tip/10a5b66f625904ad5a2867cf7a28073e1236ff32 Author: Li Zefan <[email protected]> AuthorDate: Wed, 19 Aug 2009 15:53:05 +0800 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 19 Aug 2009 15:02:23 +0200
tracing/syscalls: Add fields format for exit events
Add "format" file for syscall exit events:
# cat events/syscalls/sys_exit_open/format
name: sys_exit_open
ID: 344
format:
field:unsigned short common_type; offset:0; size:2;
field:unsigned char common_flags; offset:2; size:1;
field:unsigned char common_preempt_count; offset:3; size:1;
field:int common_pid; offset:4; size:4;
field:int common_tgid; offset:8; size:4; field:int nr; offset:12; size:4;
field:unsigned long ret; offset:16; size:4;LKML-Reference: <[email protected]>
--- include/linux/syscalls.h | 3 ++- include/trace/syscall.h | 6 ++++-- kernel/trace/trace_syscalls.c | 18 +++++++++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-)
include/linux/syscalls.h +2 -1
@@ -189,7 +189,7 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .system = "syscalls", \ .event = &event_syscall_enter, \ .raw_init = init_enter_##sname, \ - .show_format = ftrace_format_syscall, \ + .show_format = syscall_enter_format, \ .regfunc = reg_event_syscall_enter, \ .unregfunc = unreg_event_syscall_enter, \ .data = "sys"#sname, \
@@ -225,6 +225,7 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .system = "syscalls", \ .event = &event_syscall_exit, \ .raw_init = init_exit_##sname, \ + .show_format = syscall_exit_format, \ .regfunc = reg_event_syscall_exit, \ .unregfunc = unreg_event_syscall_exit, \ .data = "sys"#sname, \
include/trace/syscall.h +4 -2
@@ -55,8 +55,10 @@ 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); -extern int -ftrace_format_syscall (struct ftrace_event_call *call,struct trace_seq *s); +extern int syscall_enter_format (struct ftrace_event_call *call, +struct trace_seq *s); +extern int syscall_exit_format (struct ftrace_event_call *call, +struct trace_seq *s);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
kernel/trace/trace_syscalls.c +17 -1
@@ -97,7 +97,7 @@ extern char *__bad_type_size(void); __bad_type_size() : \#type , #name, offsetof(typeof(trace), name), sizeof(trace.name) -int ftrace_format_syscall (struct ftrace_event_call *call,struct trace_seq *s) +int syscall_enter_format (struct ftrace_event_call *call,struct trace_seq *s) {int i;int nr;
@@ -149,6 +149,22 @@ int ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s)return ret; } +int syscall_exit_format (struct ftrace_event_call *call,struct trace_seq *s) +{ +int ret; +struct syscall_trace_exit trace; + + ret =trace_seq_printf (s, +"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" +"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" , +SYSCALL_FIELD (int, nr), + SYSCALL_FIELD(unsigned long, ret)); +if (!ret) +return 0 ; + +return trace_seq_printf (s,"\nprint fmt: \"0x%%lx\", REC->ret\n" ); +} +void ftrace_syscall_enter (struct pt_regs *regs,long id) {struct syscall_trace_enter *entry;
PATCH 3/5 tracing/events: Add ftrace_event_call param to define_fields()
In reply to Li ZefanThis parameter is needed by syscall events to add define_fields() handler.
--- include/linux/ftrace_event.h | 2 +- include/trace/ftrace.h | 3 +-- kernel/trace/trace_events.c | 2 +- kernel/trace/trace_export.c | 5 ++--- 4 files changed, 5 insertions(+), 7 deletions(-)
include/linux/ftrace_event.h +1 -1
@@ -118,7 +118,7 @@ struct ftrace_event_call {int (*raw_init)(void );int (*show_format)(struct ftrace_event_call *call,struct trace_seq *s); -int (*define_fields)(void ); +int (*define_fields)(struct ftrace_event_call *);struct list_head fields;int filter_active;struct event_filter *filter;
include/trace/ftrace.h +1 -2
@@ -294,10 +294,9 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \#undef TRACE_EVENT#define TRACE_EVENT (call, proto, args, tstruct, func, print) \ int \ -ftrace_define_fields_##call(void) \ +ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ { \ struct ftrace_raw_##call field; \ - struct ftrace_event_call *event_call = &event_##call; \ int ret; \ \ __common_field(int, type, 1); \
kernel/trace/trace_events.c +1 -1
@@ -941,7 +941,7 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events, id);if (call->define_fields) { - ret = call->define_fields (); + ret = call->define_fields (call);if (ret <0 ) {pr_warning ("Could not initialize trace point" " events/%s\n" , call->name);
kernel/trace/trace_export.c +2 -3
@@ -119,7 +119,7 @@ ftrace_format_##call(struct ftrace_event_call *unused, \#undef TRACE_EVENT_FORMAT#define TRACE_EVENT_FORMAT (call, proto, args, fmt, tstruct, tpfmt) \ -int ftrace_define_fields_##call(void); \ +int ftrace_define_fields_##call(struct ftrace_event_call *event_call); \ static int ftrace_raw_init_event_##call(void); \ \ struct ftrace_event_call __used \
@@ -184,9 +184,8 @@ __attribute__((section("_ftrace_events"))) event_##call = { \#undef TRACE_EVENT_FORMAT#define TRACE_EVENT_FORMAT (call, proto, args, fmt, tstruct, tpfmt) \ int \ -ftrace_define_fields_##call(void) \ +ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ { \ - struct ftrace_event_call *event_call = &event_##call; \ struct args field; \ int ret; \ \
Signature · 1 line
1.6.3
[tip:tracing/core] tracing/events: Add ftrace_event_call param to define_fields()
Commit-ID: 14be96c9716cb8c46dca94bd890defd7856e0734 Gitweb: http://git.kernel.org/tip/14be96c9716cb8c46dca94bd890defd7856e0734 Author: Li Zefan <[email protected]> AuthorDate: Wed, 19 Aug 2009 15:53:52 +0800 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 19 Aug 2009 15:02:23 +0200
tracing/events: Add ftrace_event_call param to define_fields()
This parameter is needed by syscall events to add define_fields() handler.
LKML-Reference: <[email protected]>
--- include/linux/ftrace_event.h | 2 +- include/trace/ftrace.h | 3 +-- kernel/trace/trace_events.c | 2 +- kernel/trace/trace_export.c | 5 ++--- 4 files changed, 5 insertions(+), 7 deletions(-)
include/linux/ftrace_event.h +1 -1
@@ -118,7 +118,7 @@ struct ftrace_event_call {int (*raw_init)(void );int (*show_format)(struct ftrace_event_call *call,struct trace_seq *s); -int (*define_fields)(void ); +int (*define_fields)(struct ftrace_event_call *);struct list_head fields;int filter_active;struct event_filter *filter;
include/trace/ftrace.h +1 -2
@@ -294,10 +294,9 @@ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \#undef TRACE_EVENT#define TRACE_EVENT (call, proto, args, tstruct, func, print) \ int \ -ftrace_define_fields_##call(void) \ +ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ { \ struct ftrace_raw_##call field; \ - struct ftrace_event_call *event_call = &event_##call; \ int ret; \ \ __common_field(int, type, 1); \
kernel/trace/trace_events.c +1 -1
@@ -941,7 +941,7 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events, id);if (call->define_fields) { - ret = call->define_fields (); + ret = call->define_fields (call);if (ret <0 ) {pr_warning ("Could not initialize trace point" " events/%s\n" , call->name);
kernel/trace/trace_export.c +2 -3
@@ -119,7 +119,7 @@ ftrace_format_##call(struct ftrace_event_call *unused, \#undef TRACE_EVENT_FORMAT#define TRACE_EVENT_FORMAT (call, proto, args, fmt, tstruct, tpfmt) \ -int ftrace_define_fields_##call(void); \ +int ftrace_define_fields_##call(struct ftrace_event_call *event_call); \ static int ftrace_raw_init_event_##call(void); \ \ struct ftrace_event_call __used \
@@ -184,9 +184,8 @@ __attribute__((section("_ftrace_events"))) event_##call = { \#undef TRACE_EVENT_FORMAT#define TRACE_EVENT_FORMAT (call, proto, args, fmt, tstruct, tpfmt) \ int \ -ftrace_define_fields_##call(void) \ +ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ { \ - struct ftrace_event_call *event_call = &event_##call; \ struct args field; \ int ret; \ \
PATCH 4/5 tracing/events: Add trace_define_common_fields()
In reply to Li ZefanExtract duplicate code. Also prepare for the later patch.
--- include/linux/ftrace_event.h | 8 +------- include/trace/ftrace.h | 8 +++----- kernel/trace/trace_events.c | 22 ++++++++++++++++++++++ kernel/trace/trace_export.c | 8 +++----- 4 files changed, 29 insertions(+), 17 deletions(-)
include/linux/ftrace_event.h +1 -7
@@ -142,6 +142,7 @@ extern int filter_current_check_discard(struct ftrace_event_call *call,extern int trace_define_field (struct ftrace_event_call *call,char *type,char *name,int offset,int size,int is_signed); +extern int trace_define_common_fields (struct ftrace_event_call *call);#define is_signed_type (type) (((type)(-1)) < 0)
@@ -166,11 +167,4 @@ do { \ __trace_printk(ip, fmt, ##args); \ } while (0) -#define __common_field (type, item, is_signed) \ - ret = trace_define_field(event_call, #type, "common_" #item, \ - offsetof(typeof(field.ent), item), \ - sizeof(field.ent.item), is_signed); \ - if (ret) \ - return ret; -#endif /* _LINUX_FTRACE_EVENT_H */
include/trace/ftrace.h +3 -5
@@ -299,11 +299,9 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ struct ftrace_raw_##call field; \int ret; \ \ - __common_field(int, type, 1); \ - __common_field(unsigned char, flags, 0); \ - __common_field(unsigned char, preempt_count, 0); \ - __common_field(int, pid, 1); \ - __common_field(int, tgid, 1); \ + ret =trace_define_common_fields (event_call); \ +if (ret) \ +return ret; \ \ tstruct; \ \
kernel/trace/trace_events.c +22 -0
@@ -62,6 +62,28 @@ err: }EXPORT_SYMBOL_GPL (trace_define_field); +#define __common_field (type, item) \ + ret = trace_define_field(call, #type, "common_" #item, \ + offsetof(typeof(ent), item), \ + sizeof(ent.item), \ + is_signed_type(type)); \ + if (ret) \ + return ret; + +int trace_define_common_fields (struct ftrace_event_call *call) +{ +int ret; +struct trace_entry ent; + + __common_field(unsigned short, type); + __common_field(unsigned char, flags); + __common_field(unsigned char, preempt_count); +__common_field (int, pid); +__common_field (int, tgid); + +return ret; +} +#ifdef CONFIG_MODULES static void trace_destroy_fields (struct ftrace_event_call *call)
kernel/trace/trace_export.c +3 -5
@@ -189,11 +189,9 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \struct args field; \int ret; \ \ - __common_field(unsigned char, type, 0); \ - __common_field(unsigned char, flags, 0); \ - __common_field(unsigned char, preempt_count, 0); \ -__common_field (int, pid,1 ); \ -__common_field (int, tgid,1 ); \ + ret =trace_define_common_fields (event_call); \ +if (ret) \ +return ret; \ \ tstruct; \ \
Signature · 1 line
1.6.3
[tip:tracing/core] tracing/events: Add trace_define_common_fields()
Commit-ID: e647d6b314266adb904d4b84973eda0afa856946 Gitweb: http://git.kernel.org/tip/e647d6b314266adb904d4b84973eda0afa856946 Author: Li Zefan <[email protected]> AuthorDate: Wed, 19 Aug 2009 15:54:32 +0800 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 19 Aug 2009 15:02:24 +0200
tracing/events: Add trace_define_common_fields()
Extract duplicate code. Also prepare for the later patch.
LKML-Reference: <[email protected]>
--- include/linux/ftrace_event.h | 8 +------- include/trace/ftrace.h | 8 +++----- kernel/trace/trace_events.c | 22 ++++++++++++++++++++++ kernel/trace/trace_export.c | 8 +++----- 4 files changed, 29 insertions(+), 17 deletions(-)
include/linux/ftrace_event.h +1 -7
@@ -142,6 +142,7 @@ extern int filter_current_check_discard(struct ftrace_event_call *call,extern int trace_define_field (struct ftrace_event_call *call,char *type,char *name,int offset,int size,int is_signed); +extern int trace_define_common_fields (struct ftrace_event_call *call);#define is_signed_type (type) (((type)(-1)) < 0)
@@ -166,11 +167,4 @@ do { \ __trace_printk(ip, fmt, ##args); \ } while (0) -#define __common_field (type, item, is_signed) \ - ret = trace_define_field(event_call, #type, "common_" #item, \ - offsetof(typeof(field.ent), item), \ - sizeof(field.ent.item), is_signed); \ - if (ret) \ - return ret; -#endif /* _LINUX_FTRACE_EVENT_H */
include/trace/ftrace.h +3 -5
@@ -299,11 +299,9 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ struct ftrace_raw_##call field; \int ret; \ \ - __common_field(int, type, 1); \ - __common_field(unsigned char, flags, 0); \ - __common_field(unsigned char, preempt_count, 0); \ - __common_field(int, pid, 1); \ - __common_field(int, tgid, 1); \ + ret =trace_define_common_fields (event_call); \ +if (ret) \ +return ret; \ \ tstruct; \ \
kernel/trace/trace_events.c +22 -0
@@ -62,6 +62,28 @@ err: }EXPORT_SYMBOL_GPL (trace_define_field); +#define __common_field (type, item) \ + ret = trace_define_field(call, #type, "common_" #item, \ + offsetof(typeof(ent), item), \ + sizeof(ent.item), \ + is_signed_type(type)); \ + if (ret) \ + return ret; + +int trace_define_common_fields (struct ftrace_event_call *call) +{ +int ret; +struct trace_entry ent; + + __common_field(unsigned short, type); + __common_field(unsigned char, flags); + __common_field(unsigned char, preempt_count); +__common_field (int, pid); +__common_field (int, tgid); + +return ret; +} +#ifdef CONFIG_MODULES static void trace_destroy_fields (struct ftrace_event_call *call)
kernel/trace/trace_export.c +3 -5
@@ -189,11 +189,9 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \struct args field; \int ret; \ \ - __common_field(unsigned char, type, 0); \ - __common_field(unsigned char, flags, 0); \ - __common_field(unsigned char, preempt_count, 0); \ -__common_field (int, pid,1 ); \ -__common_field (int, tgid,1 ); \ + ret =trace_define_common_fields (event_call); \ +if (ret) \ +return ret; \ \ tstruct; \ \
PATCH 5/5 tracing/syscalls: Add filtering support
In reply to Li ZefanAdd filtering support for syscall events:
# echo 'mode == 0666' > events/syscalls/sys_enter_open
# echo 'ret == 0' > events/syscalls/sys_exit_open
# echo 1 > events/syscalls/sys_enter_open
# echo 1 > events/syscalls/sys_exit_open
# cat trace
...
modprobe-3084 [001] 117.463140: sys_open(filename: 917d3e8, flags: 0, mode: 1b6)
modprobe-3084 [001] 117.463176: sys_open -> 0x0
less-3086 [001] 117.510455: sys_open(filename: 9c6bdb8, flags: 8000, mode: 1b6)
sendmail-2574 [001] 122.145840: sys_open(filename: b807a365, flags: 0, mode: 1b6)
...--- include/linux/ftrace_event.h | 5 ++- include/linux/syscalls.h | 16 +++++++++---- include/trace/syscall.h | 7 +++++ kernel/trace/trace_events.c | 5 ++- kernel/trace/trace_syscalls.c | 51 +++++++++++++++++++++++++++++++++++++--- 5 files changed, 71 insertions(+), 13 deletions(-)
include/linux/ftrace_event.h +3 -2
@@ -140,8 +140,9 @@ extern int filter_current_check_discard(struct ftrace_event_call *call,void *rec, struct ring_buffer_event *event); -extern int trace_define_field (struct ftrace_event_call *call,char *type, -char *name,int offset,int size,int is_signed); +extern int trace_define_field (struct ftrace_event_call *call, +const char *type,const char *name, +int offset,int size,int is_signed);extern int trace_define_common_fields (struct ftrace_event_call *call);#define is_signed_type (type) (((type)(-1)) < 0)
include/linux/syscalls.h +11 -5
@@ -190,6 +190,7 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .event = &event_syscall_enter, \ .raw_init = init_enter_##sname, \ .show_format = syscall_enter_format, \ + .define_fields = syscall_enter_define_fields, \ .regfunc = reg_event_syscall_enter, \ .unregfunc = unreg_event_syscall_enter, \ .data = "sys"#sname, \
@@ -226,6 +227,7 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .event = &event_syscall_exit, \ .raw_init = init_exit_##sname, \ .show_format = syscall_exit_format, \ + .define_fields = syscall_exit_define_fields, \ .regfunc = reg_event_syscall_exit, \ .unregfunc = unreg_event_syscall_exit, \ .data = "sys"#sname, \
@@ -233,6 +235,8 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ }#define SYSCALL_METADATA (sname, nb) \ + SYSCALL_TRACE_ENTER_EVENT(sname); \ + SYSCALL_TRACE_EXIT_EVENT(sname); \ static const struct syscall_metadata __used \ __attribute__((__aligned__(4))) \ __attribute__((section("__syscalls_metadata"))) \
@@ -241,20 +245,22 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .nb_args = nb, \ .types = types_##sname, \ .args = args_##sname, \ - }; \ - SYSCALL_TRACE_ENTER_EVENT(sname); \ - SYSCALL_TRACE_EXIT_EVENT(sname); + .enter_event = &event_enter_##sname, \ + .exit_event = &event_exit_##sname, \ + };#define SYSCALL_DEFINE0 (sname) \ + SYSCALL_TRACE_ENTER_EVENT(_##sname); \ + SYSCALL_TRACE_EXIT_EVENT(_##sname); \ static const struct syscall_metadata __used \ __attribute__((__aligned__(4))) \ __attribute__((section("__syscalls_metadata"))) \ __syscall_meta_##sname = { \ .name = "sys_"#sname, \ .nb_args = 0, \ + .enter_event = &event_enter__##sname, \ + .exit_event = &event_exit__##sname, \ }; \ - SYSCALL_TRACE_ENTER_EVENT(_##sname); \ - SYSCALL_TRACE_EXIT_EVENT(_##sname); \ asmlinkage long sys_##sname(void)#else #define SYSCALL_DEFINE0 (name) asmlinkage long sys_##name(void)
include/trace/syscall.h +7 -0
@@ -34,6 +34,8 @@ DECLARE_TRACE_WITH_CALLBACK(syscall_exit,* @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 +* @enter_event: associated syscall_enter trace event +* @exit_event: associated syscall_exit trace event */ struct syscall_metadata {const char *name;
@@ -42,6 +44,9 @@ struct syscall_metadata {const char **args;int enter_id;int exit_id; + +struct ftrace_event_call *enter_event; +struct ftrace_event_call *exit_event; };#ifdef CONFIG_FTRACE_SYSCALLS
@@ -59,6 +64,8 @@ extern int syscall_enter_format(struct ftrace_event_call *call, struct trace_seq *s);extern int syscall_exit_format (struct ftrace_event_call *call,struct trace_seq *s); +extern int syscall_enter_define_fields (struct ftrace_event_call *call); +extern int syscall_exit_define_fields (struct ftrace_event_call *call);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
kernel/trace/trace_events.c +3 -2
@@ -27,8 +27,8 @@ DEFINE_MUTEX(event_mutex);LIST_HEAD (ftrace_events); -int trace_define_field (struct ftrace_event_call *call,char *type, -char *name,int offset,int size,int is_signed) +int trace_define_field (struct ftrace_event_call *call,const char *type, +const char *name,int offset,int size,int is_signed) {struct ftrace_event_field *field;
@@ -83,6 +83,7 @@ int trace_define_common_fields(struct ftrace_event_call *call)return ret; } +EXPORT_SYMBOL_GPL (trace_define_common_fields);#ifdef CONFIG_MODULES
kernel/trace/trace_syscalls.c +47 -4
69 lines not on this page · raw message
Signature · 1 line
1.6.3
Commit-ID: 540b7b8d65575c80162f2a0f38e1d313c92a6042 Gitweb: http://git.kernel.org/tip/540b7b8d65575c80162f2a0f38e1d313c92a6042 Author: Li Zefan <[email protected]> AuthorDate: Wed, 19 Aug 2009 15:54:51 +0800 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 19 Aug 2009 15:02:24 +0200
tracing/syscalls: Add filtering support
Add filtering support for syscall events:
# echo 'mode == 0666' > events/syscalls/sys_enter_open
# echo 'ret == 0' > events/syscalls/sys_exit_open
# echo 1 > events/syscalls/sys_enter_open
# echo 1 > events/syscalls/sys_exit_open
# cat trace
...
modprobe-3084 [001] 117.463140: sys_open(filename: 917d3e8, flags: 0, mode: 1b6)
modprobe-3084 [001] 117.463176: sys_open -> 0x0
less-3086 [001] 117.510455: sys_open(filename: 9c6bdb8, flags: 8000, mode: 1b6)
sendmail-2574 [001] 122.145840: sys_open(filename: b807a365, flags: 0, mode: 1b6)
...LKML-Reference: <[email protected]>
--- include/linux/ftrace_event.h | 5 ++- include/linux/syscalls.h | 16 +++++++++---- include/trace/syscall.h | 7 +++++ kernel/trace/trace_events.c | 5 ++- kernel/trace/trace_syscalls.c | 51 +++++++++++++++++++++++++++++++++++++--- 5 files changed, 71 insertions(+), 13 deletions(-)
include/linux/ftrace_event.h +3 -2
@@ -140,8 +140,9 @@ extern int filter_current_check_discard(struct ftrace_event_call *call,void *rec, struct ring_buffer_event *event); -extern int trace_define_field (struct ftrace_event_call *call,char *type, -char *name,int offset,int size,int is_signed); +extern int trace_define_field (struct ftrace_event_call *call, +const char *type,const char *name, +int offset,int size,int is_signed);extern int trace_define_common_fields (struct ftrace_event_call *call);#define is_signed_type (type) (((type)(-1)) < 0)
include/linux/syscalls.h +11 -5
@@ -190,6 +190,7 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .event = &event_syscall_enter, \ .raw_init = init_enter_##sname, \ .show_format = syscall_enter_format, \ + .define_fields = syscall_enter_define_fields, \ .regfunc = reg_event_syscall_enter, \ .unregfunc = unreg_event_syscall_enter, \ .data = "sys"#sname, \
@@ -226,6 +227,7 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .event = &event_syscall_exit, \ .raw_init = init_exit_##sname, \ .show_format = syscall_exit_format, \ + .define_fields = syscall_exit_define_fields, \ .regfunc = reg_event_syscall_exit, \ .unregfunc = unreg_event_syscall_exit, \ .data = "sys"#sname, \
@@ -233,6 +235,8 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ }#define SYSCALL_METADATA (sname, nb) \ + SYSCALL_TRACE_ENTER_EVENT(sname); \ + SYSCALL_TRACE_EXIT_EVENT(sname); \ static const struct syscall_metadata __used \ __attribute__((__aligned__(4))) \ __attribute__((section("__syscalls_metadata"))) \
@@ -241,20 +245,22 @@ static void prof_sysexit_disable_##sname(struct ftrace_event_call *event_call) \ .nb_args = nb, \ .types = types_##sname, \ .args = args_##sname, \ - }; \ - SYSCALL_TRACE_ENTER_EVENT(sname); \ - SYSCALL_TRACE_EXIT_EVENT(sname); + .enter_event = &event_enter_##sname, \ + .exit_event = &event_exit_##sname, \ + };#define SYSCALL_DEFINE0 (sname) \ + SYSCALL_TRACE_ENTER_EVENT(_##sname); \ + SYSCALL_TRACE_EXIT_EVENT(_##sname); \ static const struct syscall_metadata __used \ __attribute__((__aligned__(4))) \ __attribute__((section("__syscalls_metadata"))) \ __syscall_meta_##sname = { \ .name = "sys_"#sname, \ .nb_args = 0, \ + .enter_event = &event_enter__##sname, \ + .exit_event = &event_exit__##sname, \ }; \ - SYSCALL_TRACE_ENTER_EVENT(_##sname); \ - SYSCALL_TRACE_EXIT_EVENT(_##sname); \ asmlinkage long sys_##sname(void)#else #define SYSCALL_DEFINE0 (name) asmlinkage long sys_##name(void)
include/trace/syscall.h +7 -0
@@ -34,6 +34,8 @@ DECLARE_TRACE_WITH_CALLBACK(syscall_exit,* @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 +* @enter_event: associated syscall_enter trace event +* @exit_event: associated syscall_exit trace event */ struct syscall_metadata {const char *name;
@@ -42,6 +44,9 @@ struct syscall_metadata {const char **args;int enter_id;int exit_id; + +struct ftrace_event_call *enter_event; +struct ftrace_event_call *exit_event; };#ifdef CONFIG_FTRACE_SYSCALLS
@@ -59,6 +64,8 @@ extern int syscall_enter_format(struct ftrace_event_call *call, struct trace_seq *s);extern int syscall_exit_format (struct ftrace_event_call *call,struct trace_seq *s); +extern int syscall_enter_define_fields (struct ftrace_event_call *call); +extern int syscall_exit_define_fields (struct ftrace_event_call *call);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
kernel/trace/trace_events.c +3 -2
@@ -27,8 +27,8 @@ DEFINE_MUTEX(event_mutex);LIST_HEAD (ftrace_events); -int trace_define_field (struct ftrace_event_call *call,char *type, -char *name,int offset,int size,int is_signed) +int trace_define_field (struct ftrace_event_call *call,const char *type, +const char *name,int offset,int size,int is_signed) {struct ftrace_event_field *field;
@@ -83,6 +83,7 @@ int trace_define_common_fields(struct ftrace_event_call *call)return ret; } +EXPORT_SYMBOL_GPL (trace_define_common_fields);#ifdef CONFIG_MODULES
kernel/trace/trace_syscalls.c +47 -4
69 lines not on this page · raw message
Quoted 10 lines · Li Zefan
This patchset adds filtering support for syscall events
For syscall enter events, we can do filtering on syscall parameters, and for exit events, filter on syscall return value.
For example, we set 'mode == 0666' (0666 ==
0x1b6) tosys_enter_open, and set 'ret == 0' tosys_exit_open, and here's the output:
Quoted 11 lines
# echo 'mode == 0666' > events/syscalls/sys_enter_open
# echo 'ret == 0' > events/syscalls/sys_exit_open
# echo 1 > events/syscalls/sys_enter_open
# echo 1 > events/syscalls/sys_exit_open
# cat trace
...
modprobe-3084 [001] 117.463140: sys_open(filename: 917d3e8, flags: 0, mode: 1b6)
modprobe-3084 [001] 117.463176: sys_open -> 0x0
less-3086 [001] 117.510455: sys_open(filename: 9c6bdb8, flags: 8000, mode: 1b6)
sendmail-2574 [001] 122.145840: sys_open(filename: b807a365, flags: 0, mode: 1b6)
...Nice! Thanks!
Quoted 15 lines
[PATCH 1/5] tracing/syscalls: Fix fields format for enter events [PATCH 2/5] tracing/syscalls: Add fields format for exit events [PATCH 3/5] tracing/events: Add
ftrace_event_callparam todefine_fields()[PATCH 4/5] tracing/events: Addtrace_define_common_fields()[PATCH 5/5] tracing/syscalls: Add filtering support--- include/linux/ftrace_event.h | 15 ++---- include/linux/syscalls.h | 19 +++++-- include/trace/ftrace.h | 11 ++--- include/trace/syscall.h | 13 ++++- kernel/trace/trace_events.c | 29 +++++++++- kernel/trace/trace_export.c | 13 ++--- kernel/trace/trace_syscalls.c | 120 +++++++++++++++++++++++++++++++---------- 7 files changed, 156 insertions(+), 64 deletions(-)