tracing/syscalls: Rename variable 'nr' to 'syscall_nr'
PATCH RESEND 1/3 tracing/syscalls: Rename variable 'nr' to 'syscall_nr'
There is a problem about duplicated variable name
for system call number and a argument of some
system call. I found this problem when I tested
perf-script with python script as below.
# 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 when processing sys_enter_io_getevent() and sys_enter_io_submit(). Because the two system calls have a argument 'nr' as below.
int io_getevents(aio_context_t ctx_id, long min_nr, long nr,
struct io_event *events, struct timespec *timeout);
int io_submit(aio_context_t ctx_id, long nr, struct iocb **iocbpp);So rename a variable 'nr' to 'syscall_nr' for system call number in print_syscall_enter().
--- 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 17 lines · On Fri, 26 Feb 2016 00:24:18 +0900 Taeung Song <[email protected]> wrote:
There is a problem about duplicated variable name
for system call number and a argument of some
system call. I found this problem when I tested
perf-script with python script as below.# 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 when processing
sys_enter_io_getevent()andsys_enter_io_submit(). Because the two system calls have a argument 'nr' as below.
Quoted 7 lines
int io_getevents(aio_context_t ctx_id, long min_nr, long nr, struct io_event *events, struct timespec *timeout); int io_submit(aio_context_t ctx_id, long nr, struct iocb **iocbpp);So rename a variable 'nr' to '
syscall_nr' for system call number inprint_syscall_enter().
WTF, how does changing the kernel fix a user space python generation bug?
-- Steve
Quoted 105 lines
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 ); }
Hi, Steven
Quoted 23 lines · Steven Rostedt
Quoted 20 lines · On Fri, 26 Feb 2016 00:24:18 +0900 Taeung Song <[email protected]> wrote:
There is a problem about duplicated variable name
for system call number and a argument of some
system call. I found this problem when I tested
perf-script with python script as below.# 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 when processing
sys_enter_io_getevent()andsys_enter_io_submit(). Because the two system calls have a argument 'nr' as below.int io_getevents(aio_context_t
ctx_id, longmin_nr, long nr,
structio_event*events, struct timespec *timeout);
Quoted 8 lines
Quoted 4 lines
int io_submit(aio_context_t ctx_id, long nr, struct iocb **iocbpp);So rename a variable 'nr' to '
syscall_nr' for system call number inprint_syscall_enter().WTF, how does changing the kernel fix a user space python generation bug?
The underlying cause of this problem is not because of the python script. This problem have relevance to tracing/syscalls as below.
# 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 you see, there are duplicated variable name among fields. So I renamed the variable name 'nr' to 'syscall_nr' to avoid this duplication. As you know 'nr' in print_syscall_enter() mean system call number so, I changed 'nr' to 'syscall_nr'(IMHO).
Thanks,
Taeung
Quoted 106 lines
Quoted 105 lines
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 ); }
Steven Rostedt
maintainerQuoted 27 lines · On Fri, 26 Feb 2016 01:53:47 +0900 Taeung Song <[email protected]> wrote:
The underlying cause of this problem is not because of the python script. This problem have relevance to tracing/syscalls as below.
# 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))
Quoted 5 lines
As you see, there are duplicated variable name among fields. So I renamed the variable name 'nr' to '
syscall_nr' to avoid this duplication. As you know 'nr' inprint_syscall_enter()mean system call number so, I changed 'nr' to 'syscall_nr'(IMHO).
The above should have been in the change log. That makes much more sense.
Thanks!
-- Steve
Steven Rostedt
maintainerQuoted 30 lines · On Thu, 25 Feb 2016 12:05:01 -0500 Steven Rostedt <[email protected]> wrote:
Quoted 27 lines · On Fri, 26 Feb 2016 01:53:47 +0900 Taeung Song <[email protected]> wrote:
The underlying cause of this problem is not because of the python script. This problem have relevance to tracing/syscalls as below.
# 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))
Quoted 9 lines
Quoted 5 lines
As you see, there are duplicated variable name among fields. So I renamed the variable name 'nr' to '
syscall_nr' to avoid this duplication. As you know 'nr' inprint_syscall_enter()mean system call number so, I changed 'nr' to 'syscall_nr'(IMHO).The above should have been in the change log. That makes much more sense.
I'm a bit nervous about this change though. Because it is an ABI change. Hopefully there's no tools that parse the syscall tracepoints and expect to find a 'nr' in there.
-- Steve
Quoted 39 lines · Steven Rostedt
Quoted 36 lines · On Thu, 25 Feb 2016 12:05:01 -0500 Steven Rostedt <[email protected]> wrote:
Quoted 32 lines · On Fri, 26 Feb 2016 01:53:47 +0900 Taeung Song <[email protected]> wrote:
The underlying cause of this problem is not because of the python script. This problem have relevance to tracing/syscalls as below.
# 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 you see, there are duplicated variable name among fields. So I renamed the variable name 'nr' to '
syscall_nr' to avoid this duplication. As you know 'nr' inprint_syscall_enter()mean system call number so, I changed 'nr' to 'syscall_nr'(IMHO).
Quoted 3 lines
Quoted 3 lines
The above should have been in the change log. That makes much more sense.
Sorry, this change log is misinterpretable.
So I'm rewriting change log for this patch.
I will resend it soon.
Quoted 5 lines
I'm a bit nervous about this change though. Because it is an ABI change. Hopefully there's no tools that parse the syscall tracepoints and expect to find a 'nr' in there.
AFIAIK, I think so but resend this modified patch.
Thanks,
Taeung