tracing: fix the "old_pid" usage in trace_sched_process_exec()
Subsystems (3)
PATCH 1/1 tracing: fix the "old_pid" usage in trace_sched_process_exec()
1. TRACE_EVENT(sched_process_exec) forgets to actually use the old pid argument, it sets ->old_pid = p->pid.
2. search_binary_handler() uses the wrong pid number. tracepoint needs the global pid_t from the root namespace, while old_pid is the virtual pid number as it seen by the tracer/parent.
With this patch we have two pid_t's in search_binary_handler(), not really nice. Perhaps we should switch to "struct pid*", but in this case it would be better to cleanup the current code first and move the "depth == 0" code outside.
--- fs/exec.c | 7 ++++--- include/trace/events/sched.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-)
fs/exec.c +4 -3
@@ -1372,7 +1372,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)unsigned int depth = bprm->recursion_depth;int try,retval;struct linux_binfmt *fmt; -pid_t old_pid; +pid_t old_pid, old_vpid; retval =security_bprm_check (bprm);if (retval)
@@ -1383,8 +1383,9 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)return retval;/* Need to fetch pid before load_binary changes it */ + old_pid = current->pid;rcu_read_lock (); - old_pid =task_pid_nr_ns (current,task_active_pid_ns (current->parent)); + old_vpid =task_pid_nr_ns (current,task_active_pid_ns (current->parent));rcu_read_unlock (); retval = -ENOENT ;
@@ -1407,7 +1408,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)if (retval >=0 ) {if (depth ==0 ) {trace_sched_process_exec (current, old_pid, bprm); -ptrace_event (PTRACE_EVENT_EXEC , old_pid); +ptrace_event (PTRACE_EVENT_EXEC , old_vpid); }put_binfmt (fmt);allow_write_access (bprm->file);
include/trace/events/sched.h +1 -1
@@ -295,7 +295,7 @@ TRACE_EVENT(sched_process_exec,TP_fast_assign ( __assign_str(filename, bprm->filename); __entry->pid = p->pid; - __entry->old_pid = p->pid; + __entry->old_pid = old_pid; ), TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename),
Signature · 1 line
1.5.5.1
Quoted 7 lines · Oleg Nesterov
1.
TRACE_EVENT(sched_process_exec)forgets to actually use the old pid argument, it sets ->old_pid =p->pid.2.
search_binary_handler()uses the wrong pid number. tracepoint needs the globalpid_tfrom the root namespace, whileold_pidis the virtual pid number as it seen by the tracer/parent.
Not really serious, but probably makes sense for 3.4. This fixes the recently merged 4ff16c25e2cc48cbe6956e356c38a25ac063a64d "tracepoint, vfs, sched: Add exec() tracepoint"
Oleg.
Quoted 5 lines · Oleg Nesterov
Quoted 4 lines · Oleg Nesterov
1.
TRACE_EVENT(sched_process_exec)forgets to actually use the old pid argument, it sets ->old_pid =p->pid.
Quoted 7 lines
Quoted 3 lines
2.
search_binary_handler()uses the wrong pid number. tracepoint needs the globalpid_tfrom the root namespace, whileold_pidis the virtual pid number as it seen by the tracer/parent.Not really serious, but probably makes sense for 3.4. This fixes the recently merged
4ff16c25e2cc48cbe6956e356c38a25ac063a64d"tracepoint, vfs, sched: Addexec()tracepoint"
Thanks Oleg - will queue your fix up in tip:perf/urgent.
Thanks,
Ingo
[tip:perf/urgent] tracing, sched, vfs: Fix 'old_pid' usage in trace_sched_process_exec()
In reply to Oleg NesterovCommit-ID: 6308191f6f55d3629c7dbe72dfb856ad9fa560fd Gitweb: http://git.kernel.org/tip/6308191f6f55d3629c7dbe72dfb856ad9fa560fd Author: Oleg Nesterov <[email protected]> AuthorDate: Fri, 30 Mar 2012 18:26:36 +0200 Committer: Ingo Molnar <[email protected]> CommitDate: Sat, 31 Mar 2012 11:53:22 +0200
tracing, sched, vfs: Fix 'old_pid' usage in trace_sched_process_exec()
1. TRACE_EVENT(sched_process_exec) forgets to actually use the old pid argument, it sets ->old_pid = p->pid.
2. search_binary_handler() uses the wrong pid number. tracepoint needs the global pid_t from the root namespace, while old_pid is the virtual pid number as it seen by the tracer/parent.
With this patch we have two pid_t's in search_binary_handler(), not really nice. Perhaps we should switch to "struct pid*", but in this case it would be better to cleanup the current code first and move the "depth == 0" code outside.
--- fs/exec.c | 7 ++++--- include/trace/events/sched.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-)
fs/exec.c +4 -3
@@ -1370,7 +1370,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)unsigned int depth = bprm->recursion_depth;int try,retval;struct linux_binfmt *fmt; -pid_t old_pid; +pid_t old_pid, old_vpid; retval =security_bprm_check (bprm);if (retval)
@@ -1381,8 +1381,9 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)return retval;/* Need to fetch pid before load_binary changes it */ + old_pid = current->pid;rcu_read_lock (); - old_pid =task_pid_nr_ns (current,task_active_pid_ns (current->parent)); + old_vpid =task_pid_nr_ns (current,task_active_pid_ns (current->parent));rcu_read_unlock (); retval = -ENOENT ;
@@ -1405,7 +1406,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)if (retval >=0 ) {if (depth ==0 ) {trace_sched_process_exec (current, old_pid, bprm); -ptrace_event (PTRACE_EVENT_EXEC , old_pid); +ptrace_event (PTRACE_EVENT_EXEC , old_vpid); }put_binfmt (fmt);allow_write_access (bprm->file);
include/trace/events/sched.h +1 -1
@@ -295,7 +295,7 @@ TRACE_EVENT(sched_process_exec,TP_fast_assign ( __assign_str(filename, bprm->filename); __entry->pid = p->pid; - __entry->old_pid = p->pid; + __entry->old_pid = old_pid; ), TP_printk("filename=%s pid=%d old_pid=%d", __get_str(filename),