tracing/syscalls: Rename variable 'nr' to '__syscall_nr'
PATCH v3 1/2 tracing/syscalls: Rename variable 'nr' to '__syscall_nr'
There is a problem about duplicated variable name i.e.
# cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_io_getevents/format
name: sys_enter_io_getevents
ID: 739
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
field:int common_pid;offset:4;size:4;signed:1;
field:int nr; offset:8; size:4; signed:1;
field:aio_context_t ctx_id; offset:16; size:8; signed:0;
field:long min_nr; offset:24; size:8; signed:0;
field:long nr; offset:32; size:8; signed:0;
field:struct io_event * events; offset:40; size:8; signed:0;
field:struct timespec * timeout; offset:48; size:8; signed:0; print fmt: "ctx_id: 0x%08lx, min_nr: 0x%08lx, nr: 0x%08lx,
events: 0x%08lx, timeout: 0x%08lx", ((unsigned long)(REC->ctx_id)),
((unsigned long)(REC->min_nr)), ((unsigned long)(REC->nr)),
((unsigned long)(REC->events)), ((unsigned long)(REC->timeout))As above 'int nr;' and 'long nr;' variables have duplicated name so problems are occurred in perf-script i.e.
# perf record -e syscalls:*
# perf script -g python
# perf script -s perf-script.py
File "perf-script.py", line 8694
def syscalls__sys_enter_io_getevents(event_name, context, common_cpu,
SyntaxError: duplicate argument 'nr' in function definition
Error running python script perf-script.pyAs above, problems about duplicated argument occurred. Not only sys_enter_io_getevent() but also sys_enter_io_submit() have relevevance to this problem.
So rename a variable 'nr' to '__syscall_nr' for system call number in print_syscall_enter() and etc.
--- kernel/trace/trace.h | 4 ++-- kernel/trace/trace_syscalls.c | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-)
kernel/trace/trace.h +2 -2
@@ -88,13 +88,13 @@ enum trace_type {*/ struct syscall_trace_enter {struct trace_entry ent; -int nr; +int __syscall_nr;unsigned long args[]; };struct syscall_trace_exit {struct trace_entry ent; -int nr; +int __syscall_nr;long ret; };
kernel/trace/trace_syscalls.c +8 -8
@@ -118,7 +118,7 @@ print_syscall_enter(struct trace_iterator *iter, int flags,int i, syscall; trace = (typeof (trace ))ent; - syscall = trace->nr; + syscall = trace->__syscall_nr; entry =syscall_nr_to_meta (syscall);if (!entry)
@@ -164,7 +164,7 @@ print_syscall_exit(struct trace_iterator *iter, int flags,struct syscall_metadata *entry; trace = (typeof (trace ))ent; - syscall = trace->nr; + syscall = trace->__syscall_nr; entry =syscall_nr_to_meta (syscall);if (!entry) {
@@ -261,7 +261,7 @@ static int __init syscall_enter_define_fields(struct trace_event_call *call)int i;int offset = offsetof(typeof (trace ), args); - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER ); + ret =trace_define_field (call,SYSCALL_FIELD (int, __syscall_nr),FILTER_OTHER );if (ret)return ret;
@@ -281,7 +281,7 @@ static int __init syscall_exit_define_fields(struct trace_event_call *call)struct syscall_trace_exit trace;int ret; - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER ); + ret =trace_define_field (call,SYSCALL_FIELD (int, __syscall_nr),FILTER_OTHER );if (ret)return ret;
@@ -332,7 +332,7 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id)return ; entry =ring_buffer_event_data (event); - entry->nr = syscall_nr; + entry->__syscall_nr = syscall_nr;syscall_get_arguments (current, regs,0 , sys_data->nb_args, entry->args); event_trigger_unlock_commit(trace_file, buffer, event, entry,
@@ -378,7 +378,7 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret)return ; entry =ring_buffer_event_data (event); - entry->nr = syscall_nr; + entry->__syscall_nr = syscall_nr; entry->ret =syscall_get_return_value (current, regs); event_trigger_unlock_commit(trace_file, buffer, event, entry,
@@ -579,7 +579,7 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id)if (!rec)return ; - rec->nr = syscall_nr; + rec->__syscall_nr = syscall_nr;syscall_get_arguments (current, regs,0 , sys_data->nb_args, (unsigned long *)&rec->args);perf_trace_buf_submit (rec, size, rctx,0 ,1 , regs, head,NULL );
@@ -652,7 +652,7 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret)if (!rec)return ; - rec->nr = syscall_nr; + rec->__syscall_nr = syscall_nr; rec->ret =syscall_get_return_value (current, regs);perf_trace_buf_submit (rec, size, rctx,0 ,1 , regs, head,NULL ); }
Signature · 1 line
2.5.0
Em Fri, Feb 26, 2016 at 10:14:06PM +0900, Taeung Song escreveu:
Quoted 6 lines
There is a problem about duplicated variable name i.e.
# cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_io_getevents/format name: sys_enter_io_getevents ID: 739 format:
Steven, what do you think?
Should we break this ABI while disambiguating the 'nr' field, using '__syscall_nr' in an attempt to use a name that is unlikely to be used by a real syscall argument name?
If we stand by published ABIs, we should keep it written in stone and state that the first 'nr' means '__syscall_nr' while keeping it as-is, the change for 'perf trace' in that case is to do nothing, it work as-is, we have just to fix the python binding to do that rename.
Perhaps we can live with that, to avoid having three different cases:
!nr, nr and __syscall_nr.
Ingo, Peter, have you guys followed this case?
Summary: Some tracepoint have multiple fields with the same name, 'nr',
the first one is a unique syscall ID, the other is a syscall argument:
[root@jouet ~]# cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_io_getevents/format
name: sys_enter_io_getevents
ID: 747
format:
field:unsigned short common_type; offset:0; size:2; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_preempt_count; offset:3; size:1; signed:0; field:int common_pid; offset:4; size:4; signed:1; field:int nr; offset:8; size:4; signed:1; field:aio_context_t ctx_id; offset:16; size:8; signed:0; field:long min_nr; offset:24; size:8; signed:0; field:long nr; offset:32; size:8; signed:0; field:struct io_event * events; offset:40; size:8; signed:0; field:struct timespec * timeout; offset:48; size:8; signed:0;
print fmt: "ctx_id: 0x%08lx, min_nr: 0x%08lx, nr: 0x%08lx, events: 0x%08lx, timeout: 0x%08lx", ((unsigned long)(REC->ctx_id)), ((unsigned long)(REC->min_nr)), ((unsigned long)(REC->nr)), ((unsigned long)(REC->events)), ((unsigned long)(REC->timeout)) [root@jouet ~]#
- Arnaldo
Quoted 140 lines
field:unsigned short common_type; offset:0; size:2; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_preempt_count; offset:3; size:1; signed:0; field:int common_pid;offset:4;size:4;signed:1; field:int nr; offset:8; size:4; signed:1; field:aio_context_t ctx_id; offset:16; size:8; signed:0; field:long min_nr; offset:24; size:8; signed:0; field:long nr; offset:32; size:8; signed:0; field:struct io_event * events; offset:40; size:8; signed:0; field:struct timespec * timeout; offset:48; size:8; signed:0; print fmt: "ctx_id: 0x%08lx, min_nr: 0x%08lx, nr: 0x%08lx, events: 0x%08lx, timeout: 0x%08lx", ((unsigned long)(REC->ctx_id)), ((unsigned long)(REC->min_nr)), ((unsigned long)(REC->nr)), ((unsigned long)(REC->events)), ((unsigned long)(REC->timeout))As above 'int nr;' and 'long nr;' variables have duplicated name so problems are occurred in perf-script i.e.
# perf record -e syscalls:* # perf script -g python # perf script -s perf-script.py File "perf-script.py", line 8694 def syscalls__sys_enter_io_getevents(event_name, context, common_cpu, SyntaxError: duplicate argument 'nr' in function definition Error running python script perf-script.pyAs above, problems about duplicated argument occurred. Not only
sys_enter_io_getevent()but alsosys_enter_io_submit()have relevevance to this problem.So rename a variable 'nr' to '
__syscall_nr' for system call number inprint_syscall_enter()and etc.Cc Thomas Gleixner <[email protected]>Cc Lai Jiangshan <[email protected]>Signed-off-by Taeung Song <[email protected]>--- kernel/trace/trace.h | 4 ++-- kernel/trace/trace_syscalls.c | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-)kernel/trace/trace.h +2
-2@@ -88,13 +88,13 @@ enum trace_type {*/ struct syscall_trace_enter {struct trace_entry ent; -int nr; +int __syscall_nr;unsigned long args[]; };struct syscall_trace_exit {struct trace_entry ent; -int nr; +int __syscall_nr;long ret; };kernel/trace/trace_syscalls.c +8
-8@@ -118,7 +118,7 @@ print_syscall_enter(struct trace_iterator *iter, int flags,int i, syscall; trace = (typeof (trace ))ent; - syscall = trace->nr; + syscall = trace->__syscall_nr; entry =syscall_nr_to_meta (syscall);if (!entry)@@ -164,7 +164,7 @@ print_syscall_exit(struct trace_iterator *iter, int flags,struct syscall_metadata *entry; trace = (typeof (trace ))ent; - syscall = trace->nr; + syscall = trace->__syscall_nr; entry =syscall_nr_to_meta (syscall);if (!entry) {@@ -261,7 +261,7 @@ static int __init syscall_enter_define_fields(struct trace_event_call *call)int i;int offset = offsetof(typeof (trace ), args); - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER ); + ret =trace_define_field (call,SYSCALL_FIELD (int, __syscall_nr),FILTER_OTHER );if (ret)return ret;@@ -281,7 +281,7 @@ static int __init syscall_exit_define_fields(struct trace_event_call *call)struct syscall_trace_exit trace;int ret; - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER ); + ret =trace_define_field (call,SYSCALL_FIELD (int, __syscall_nr),FILTER_OTHER );if (ret)return ret;@@ -332,7 +332,7 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id)return ; entry =ring_buffer_event_data (event); - entry->nr = syscall_nr; + entry->__syscall_nr = syscall_nr;syscall_get_arguments (current, regs,0 , sys_data->nb_args, entry->args); event_trigger_unlock_commit(trace_file, buffer, event, entry,@@ -378,7 +378,7 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret)return ; entry =ring_buffer_event_data (event); - entry->nr = syscall_nr; + entry->__syscall_nr = syscall_nr; entry->ret =syscall_get_return_value (current, regs); event_trigger_unlock_commit(trace_file, buffer, event, entry,@@ -579,7 +579,7 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id)if (!rec)return ; - rec->nr = syscall_nr; + rec->__syscall_nr = syscall_nr;syscall_get_arguments (current, regs,0 , sys_data->nb_args, (unsigned long *)&rec->args);perf_trace_buf_submit (rec, size, rctx,0 ,1 , regs, head,NULL );@@ -652,7 +652,7 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret)if (!rec)return ; - rec->nr = syscall_nr; + rec->__syscall_nr = syscall_nr; rec->ret =syscall_get_return_value (current, regs);perf_trace_buf_submit (rec, size, rctx,0 ,1 , regs, head,NULL ); }Signature · 1 line
2.5.0
Steven Rostedt
maintainerQuoted 10 lines · On Fri, 26 Feb 2016 10:57:13 -0300 Arnaldo Carvalho de Melo <[email protected]>…
Em Fri, Feb 26, 2016 at 10:14:06PM +0900, Taeung Song escreveu:
Quoted 6 lines
There is a problem about duplicated variable name i.e.
# cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_io_getevents/format name: sys_enter_io_getevents ID: 739 format:Steven, what do you think?
Quoted 8 lines
Should we break this ABI while disambiguating the 'nr' field, using '
__syscall_nr' in an attempt to use a name that is unlikely to be used by a real syscall argument name?If we stand by published ABIs, we should keep it written in stone and state that the first 'nr' means '
__syscall_nr' while keeping it as-is, the change for 'perf trace' in that case is to do nothing, it work as-is, we have just to fix the python binding to do that rename.
ABIs only matter if they break something, and people complain. Linus has been somewhat accepting of us fixing those tools that break and we push out the fixes. If an ABI breaks in the forest and nobody is around to complain about it, did it really break?
I would say, lets make the change and fix perf. If people complain, we send them the fixes for their tools. If they need the distros to have the fixes, then let the change be reverted, and we wait till the distros have the update (this may take a few years), then re-submit.
This worked for me to get rid of padding that was in every trace event. The change was reverted, I fixed the tools that broke, waited till all the major distros had the updates. And resubmitted the change. Linus took it.
Quoted 3 lines
Perhaps we can live with that, to avoid having three different cases:
!nr, nr and__syscall_nr.
We could, do this as well. Want me to add something to event-parse?
Quoted 23 lines
Ingo, Peter, have you guys followed this case?
Summary: Some tracepoint have multiple fields with the same name, 'nr',
the first one is a unique syscall ID, the other is a syscall argument:[root@jouet ~]# cat
/sys/kernel/debug/tracing/events/syscalls/sys_enter_io_getevents/format
name:sys_enter_io_getevents
ID: 747
format:field:unsigned short common_type; offset:0; size:2; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_preempt_count; offset:3; size:1; signed:0; field:int common_pid; offset:4; size:4; signed:1; field:int nr; offset:8; size:4; signed:1; field:aio_context_t ctx_id; offset:16; size:8; signed:0; field:long min_nr; offset:24; size:8; signed:0; field:long nr; offset:32; size:8; signed:0; field:struct io_event * events; offset:40; size:8; signed:0; field:struct timespec * timeout; offset:48; size:8; signed:0;
Quoted 3 lines
print fmt: "
ctx_id: 0x%08lx,min_nr: 0x%08lx, nr: 0x%08lx, events: 0x%08lx, timeout: 0x%08lx", ((unsigned long)(REC->ctx_id)), ((unsigned long)(REC->min_nr)), ((unsigned long)(REC->nr)), ((unsigned long)(REC->events)), ((unsigned long)(REC->timeout)) [root@jouet ~]#
BTW, here's a less intrusive change, because honestly, I hate the kernel structure having underscores in the name.
This could be signed off by Taeung Song and myself.
-- Steve
kernel/trace/trace_syscalls.c +9 -7
@@ -186,11 +186,11 @@ print_syscall_exit(struct trace_iterator *iter, int flags,extern char *__bad_type_size (void ); -#define SYSCALL_FIELD (type, name) \ - sizeof(type) != sizeof(trace.name) ? \ +#define SYSCALL_FIELD (type, field, name) \ + sizeof(type) != sizeof(trace.field) ? \ __bad_type_size() : \ - #type, #name, offsetof(typeof(trace), name), \ - sizeof(trace.name), is_signed_type(type) + #type, #name, offsetof(typeof(trace), field), \ + sizeof(trace.field), is_signed_type(type)static int __init __set_enter_print_fmt (struct syscall_metadata *entry,char *buf,int len)
@@ -261,7 +261,8 @@ static int __init syscall_enter_define_fields(struct trace_event_call *call)int i;int offset = offsetof(typeof (trace ), args); - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER ); + ret =trace_define_field (call,SYSCALL_FIELD (int, nr, __syscall_nr), +FILTER_OTHER );if (ret)return ret;
@@ -281,11 +282,12 @@ static int __init syscall_exit_define_fields(struct trace_event_call *call)struct syscall_trace_exit trace;int ret; - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER ); + ret =trace_define_field (call,SYSCALL_FIELD (int, nr, __syscall_nr), +FILTER_OTHER );if (ret)return ret; - ret =trace_define_field (call,SYSCALL_FIELD (long, ret), + ret =trace_define_field (call,SYSCALL_FIELD (long, ret, ret),FILTER_OTHER );return ret;
Em Fri, Feb 26, 2016 at 01:23:01PM -0500, Steven Rostedt escreveu:
Quoted 5 lines · On Fri, 26 Feb 2016 10:57:13 -0300 Arnaldo Carvalho de Melo <[email protected]>…
Quoted 4 lines
If we stand by published ABIs, we should keep it written in stone and state that the first 'nr' means '
__syscall_nr' while keeping it as-is, the change for 'perf trace' in that case is to do nothing, it work as-is, we have just to fix the python binding to do that rename.
<SNIP>
Quoted 4 lines
Quoted 2 lines
Perhaps we can live with that, to avoid having three different cases:
!nr, nr and__syscall_nr.We could, do this as well. Want me to add something to event-parse?
You mean do nothing in the kernel? Suits me fine, the fix would be just on the tools/perf/ code, where it generates the python skeletons, I can do that, as I guess Taeung is sleep at this point :-)
- Arnaldo
Hi, Steven
Quoted 114 lines · Steven Rostedt
Quoted 10 lines · On Fri, 26 Feb 2016 10:57:13 -0300 Arnaldo Carvalho de Melo <[email protected]>…
Em Fri, Feb 26, 2016 at 10:14:06PM +0900, Taeung Song escreveu:
Quoted 6 lines
There is a problem about duplicated variable name i.e.
# cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_io_getevents/format name: sys_enter_io_getevents ID: 739 format:Steven, what do you think?
Quoted 8 lines
Should we break this ABI while disambiguating the 'nr' field, using '
__syscall_nr' in an attempt to use a name that is unlikely to be used by a real syscall argument name?If we stand by published ABIs, we should keep it written in stone and state that the first 'nr' means '
__syscall_nr' while keeping it as-is, the change for 'perf trace' in that case is to do nothing, it work as-is, we have just to fix the python binding to do that rename.ABIs only matter if they break something, and people complain. Linus has been somewhat accepting of us fixing those tools that break and we push out the fixes. If an ABI breaks in the forest and nobody is around to complain about it, did it really break?
I would say, lets make the change and fix perf. If people complain, we send them the fixes for their tools. If they need the distros to have the fixes, then let the change be reverted, and we wait till the distros have the update (this may take a few years), then re-submit.
This worked for me to get rid of padding that was in every trace event. The change was reverted, I fixed the tools that broke, waited till all the major distros had the updates. And resubmitted the change. Linus took it.
Quoted 3 lines
Perhaps we can live with that, to avoid having three different cases:
!nr, nr and__syscall_nr.We could, do this as well. Want me to add something to event-parse?
Quoted 23 lines
Ingo, Peter, have you guys followed this case?
Summary: Some tracepoint have multiple fields with the same name, 'nr',
the first one is a unique syscall ID, the other is a syscall argument:[root@jouet ~]# cat
/sys/kernel/debug/tracing/events/syscalls/sys_enter_io_getevents/format
name:sys_enter_io_getevents
ID: 747
format:field:unsigned short common_type; offset:0; size:2; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_preempt_count; offset:3; size:1; signed:0; field:int common_pid; offset:4; size:4; signed:1; field:int nr; offset:8; size:4; signed:1; field:aio_context_t ctx_id; offset:16; size:8; signed:0; field:long min_nr; offset:24; size:8; signed:0; field:long nr; offset:32; size:8; signed:0; field:struct io_event * events; offset:40; size:8; signed:0; field:struct timespec * timeout; offset:48; size:8; signed:0;Quoted 3 lines
print fmt: "
ctx_id: 0x%08lx,min_nr: 0x%08lx, nr: 0x%08lx, events: 0x%08lx, timeout: 0x%08lx", ((unsigned long)(REC->ctx_id)), ((unsigned long)(REC->min_nr)), ((unsigned long)(REC->nr)), ((unsigned long)(REC->events)), ((unsigned long)(REC->timeout)) [root@jouet ~]#BTW, here's a less intrusive change, because honestly, I hate the kernel structure having underscores in the name.
This could be signed off by Taeung Song and myself.
-- Steve
kernel/trace/trace_syscalls.c +6
-6@@ -186,11 +186,11 @@ print_syscall_exit(struct trace_iterator *iter, int flags,extern char *__bad_type_size (void ); -#define SYSCALL_FIELD (type, name) \ - sizeof(type) != sizeof(trace.name) ? \ +#define SYSCALL_FIELD (type, field, name) \ + sizeof(type) != sizeof(trace.field) ? \ __bad_type_size() : \ - #type, #name, offsetof(typeof(trace), name), \ - sizeof(trace.name), is_signed_type(type) + #type, #name, offsetof(typeof(trace), field), \ + sizeof(trace.field), is_signed_type(type)static int __init __set_enter_print_fmt (struct syscall_metadata *entry,char *buf,int len)@@ -261,7 +261,8 @@ static int __init syscall_enter_define_fields(struct trace_event_call *call)int i;int offset = offsetof(typeof (trace ), args); - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER ); + ret =trace_define_field (call,SYSCALL_FIELD (int, nr, __syscall_nr), +FILTER_OTHER );if (ret)return ret;@@ -281,11 +282,12 @@ static int __init syscall_exit_define_fields(struct trace_event_call *call)struct syscall_trace_exit trace;int ret; - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER );
kernel/trace/trace_syscalls.c static int __init syscall_exit_define_fields(struct trace_event_call *call) · line 293
Quoted 10 lines
kernel/trace/trace_syscalls.c +3
-1+ ret =trace_define_field (call,SYSCALL_FIELD (int, nr, __syscall_nr), +FILTER_OTHER );if (ret)return ret; - ret =trace_define_field (call,SYSCALL_FIELD (long, ret), + ret =trace_define_field (call,SYSCALL_FIELD (long, ret, ret),FILTER_OTHER );return ret;
Would you mean to avoid struct syscall_trace_enter or _exit has '__syscall_nr' variable ?
So not including a portion of this patch([PATCH v3 1/2] tracing/syscalls: ...)
kernel/trace/trace.h +2 -2
@@ -88,13 +88,13 @@ enum trace_type {*/ struct syscall_trace_enter {struct trace_entry ent; -int nr; +int __syscall_nr;unsigned long args[]; };struct syscall_trace_exit {struct trace_entry ent; -int nr; +int __syscall_nr;long ret; };
I got it :-)
In conclusion, output of format (/sys/kernel/debug/tracing/events/syscalls/*/format) has __syscall_nr for syscall number but the kernel structure 'syscall_trace_enter' and 'syscall_trace_exit' have not __syscall_nr variable. Is it right ?
I'll resend modified patch after testing new patch you suggest soon.
Thanks,
Taeung
Steven Rostedt
maintainerQuoted 7 lines · On Sun, 28 Feb 2016 01:10:19 +0900 Taeung Song <[email protected]> wrote:
I got it :-)
In conclusion, output of format (/sys/kernel/debug/tracing/events/syscalls/*/format)
has__syscall_nrfor syscall number but the kernel structure 'syscall_trace_enter' and 'syscall_trace_exit' have not__syscall_nrvariable.
Is it right ?
Correct. Just change the output of the format file. Not the data structures in the kernel.
Thanks,
-- Steve
Quoted 11 lines · Steven Rostedt
Quoted 7 lines · On Sun, 28 Feb 2016 01:10:19 +0900 Taeung Song <[email protected]> wrote:
I got it :-)
In conclusion, output of format (/sys/kernel/debug/tracing/events/syscalls/*/format)
has__syscall_nrfor syscall number but the kernel structure 'syscall_trace_enter' and 'syscall_trace_exit' have not__syscall_nrvariable.
Is it right ?
Quoted 6 lines
Correct. Just change the output of the format file. Not the data structures in the kernel.
Thanks,
-- Steve
Thank you !! :-)
Taeung
tip-bot for Taeung Song
merge bot[tip:perf/core] tracing/syscalls: Rename "/format" tracepoint field name "nr" to "__syscall_nr:
In reply to Steven Rostedttracing/syscalls: Rename "/format" tracepoint field name "nr" to "__syscall_nr:
Commit-ID: 026842d148b920dc28f0499ede4950dcb098d4d5 Gitweb: http://git.kernel.org/tip/026842d148b920dc28f0499ede4950dcb098d4d5 Author: Taeung Song <[email protected]> AuthorDate: Fri, 26 Feb 2016 13:23:01 -0500 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 29 Feb 2016 11:34:53 -0300
tracing/syscalls: Rename "/format" tracepoint field name "nr" to "__syscall_nr:
Some tracepoint have multiple fields with the same name, "nr", the first one is a unique syscall ID, the other is a syscall argument:
# cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_io_getevents/format name: sys_enter_io_getevents ID: 747 format: field:unsigned short common_type; offset:0; size:2; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_preempt_count; offset:3; size:1; signed:0; field:int common_pid; offset:4; size:4; signed:1;
field:int nr; offset:8; size:4; signed:1;
field:aio_context_t ctx_id; offset:16; size:8; signed:0;
field:long min_nr; offset:24; size:8; signed:0;
field:long nr; offset:32; size:8; signed:0;
field:struct io_event * events; offset:40; size:8; signed:0;
field:struct timespec * timeout; offset:48; size:8; signed:0;
print fmt: "ctx_id: 0x%08lx, min_nr: 0x%08lx, nr: 0x%08lx, events: 0x%08lx, timeout: 0x%08lx", ((unsigned long)(REC->ctx_id)), ((unsigned long)(REC->min_nr)), ((unsigned long)(REC->nr)), ((unsigned long)(REC->events)), ((unsigned long)(REC->timeout)) #
Fix it by renaming the "/format" common tracepoint field "nr" to "__syscall_nr".
--- kernel/trace/trace_syscalls.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
kernel/trace/trace_syscalls.c +9 -7
@@ -186,11 +186,11 @@ print_syscall_exit(struct trace_iterator *iter, int flags,extern char *__bad_type_size (void ); -#define SYSCALL_FIELD (type, name) \ - sizeof(type) != sizeof(trace.name) ? \ +#define SYSCALL_FIELD (type, field, name) \ + sizeof(type) != sizeof(trace.field) ? \ __bad_type_size() : \ - #type, #name, offsetof(typeof(trace), name), \ - sizeof(trace.name), is_signed_type(type) + #type, #name, offsetof(typeof(trace), field), \ + sizeof(trace.field), is_signed_type(type)static int __init __set_enter_print_fmt (struct syscall_metadata *entry,char *buf,int len)
@@ -261,7 +261,8 @@ static int __init syscall_enter_define_fields(struct trace_event_call *call)int i;int offset = offsetof(typeof (trace ), args); - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER ); + ret =trace_define_field (call,SYSCALL_FIELD (int, nr, __syscall_nr), +FILTER_OTHER );if (ret)return ret;
@@ -281,11 +282,12 @@ static int __init syscall_exit_define_fields(struct trace_event_call *call)struct syscall_trace_exit trace;int ret; - ret =trace_define_field (call,SYSCALL_FIELD (int, nr),FILTER_OTHER ); + ret =trace_define_field (call,SYSCALL_FIELD (int, nr, __syscall_nr), +FILTER_OTHER );if (ret)return ret; - ret =trace_define_field (call,SYSCALL_FIELD (long, ret), + ret =trace_define_field (call,SYSCALL_FIELD (long, ret, ret),FILTER_OTHER );return ret;
Quoted 5 lines · Arnaldo Carvalho de Melo
Ingo, Peter, have you guys followed this case?
Summary: Some tracepoint have multiple fields with the same name, 'nr',
the first one is a unique syscall ID, the other is a syscall argument:
I'm all for pushing the limits on tracepoint ABI. I'm all for making it less rigid. So if we can get away with changing this under the promise of helping fixup fallout, I'm all for it.
That means we can always just change tracepoints, and they're not really ABI at all.
Em Sat, Feb 27, 2016 at 04:13:57PM +0100, Peter Zijlstra escreveu:
Quoted 8 lines · Arnaldo Carvalho de Melo
Quoted 6 lines
Ingo, Peter, have you guys followed this case?
Summary: Some tracepoint have multiple fields with the same name, 'nr',
the first one is a unique syscall ID, the other is a syscall argument:
Quoted 6 lines
I'm all for pushing the limits on tracepoint ABI. I'm all for making it less rigid. So if we can get away with changing this under the promise of helping fixup fallout, I'm all for it.
That means we can always just change tracepoints, and they're not really ABI at all.
I'll take that as an Acked-by, and will apply Taeung/Steven's patch for the kernel + the builtin-trace.c change, Ok everybody?
- Arnaldo