tracing: A few more changes for 4.13
Steven Rostedt
maintainercover tracing: A few more changes for 4.13
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
for-next
Head SHA1: 29b1a8ad7df4528b862a79e3d5fb0936f4d199c7
Joel Fernandes (3):
tracing: Treat recording comm for idle task as a success
tracing: Treat recording tgid for idle task as a success
tracing: Attempt to record other information even if some fail
Michael Sartain (1):
tracing: Add saved_tgids file to show cached pid to tgid mappings
----
kernel/trace/trace.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 107 insertions(+), 10 deletions(-)
Steven Rostedt
maintainerPATCH 1/4 tracing: Add saved_tgids file to show cached pid to tgid mappings
From: Michael Sartain <[email protected]>
Export the cached pid / tgid mappings in debugfs tracing saved_tgids file. This allows user apps to translate the pids from a trace to their respective thread group.
Example saved_tgids file with pid / tgid values separated by ' ':
# cat saved_tgids 1048 1048 1047 1047 7 7 1049 1047 1054 1047 1053 1047
--- kernel/trace/trace.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+)
kernel/trace/trace.c +73 -0
@@ -4688,6 +4688,76 @@ static const struct file_operations tracing_readme_fops = { .llseek = generic_file_llseek, }; +static void *saved_tgids_next (struct seq_file *m,void *v,loff_t *pos) +{ +int *ptr = v; + +if (*pos || m->count) + ptr++; + + (*pos)++; + +for (; ptr <= &tgid_map[PID_MAX_DEFAULT ]; ptr++) { +if (trace_find_tgid (*ptr)) +return ptr; + } + +return NULL ; +} + +static void *saved_tgids_start (struct seq_file *m,loff_t *pos) +{ +void *v; +loff_t l =0 ; + +if (!tgid_map) +return NULL ; + + v = &tgid_map[0 ]; +while (l <= *pos) { + v =saved_tgids_next (m, v, &l); +if (!v) +return NULL ; + } + +return v; +} + +static void saved_tgids_stop (struct seq_file *m,void *v) +{ +} + +static int saved_tgids_show (struct seq_file *m,void *v) +{ +int pid = (int *)v - tgid_map; + +seq_printf (m,"%d %d\n" , pid,trace_find_tgid (pid)); +return 0 ; +} + +static const struct seq_operations tracing_saved_tgids_seq_ops = { + .start = saved_tgids_start, + .stop = saved_tgids_stop, + .next = saved_tgids_next, + .show = saved_tgids_show, +}; + +static int tracing_saved_tgids_open (struct inode *inode,struct file *filp) +{ +if (tracing_disabled) +return -ENODEV ; + +return seq_open (filp, &tracing_saved_tgids_seq_ops); +} + + +static const struct file_operations tracing_saved_tgids_fops = { + .open = tracing_saved_tgids_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; +static void *saved_cmdlines_next (struct seq_file *m,void *v,loff_t *pos) {unsigned int *ptr = v;
@@ -7920,6 +7990,9 @@ static __init int tracer_init_tracefs(void)trace_create_file ("saved_cmdlines_size" ,0644 , d_tracer,NULL , &tracing_saved_cmdlines_size_fops); +trace_create_file ("saved_tgids" ,0444 , d_tracer, +NULL , &tracing_saved_tgids_fops); +trace_eval_init ();trace_create_eval_file (d_tracer);
Signature · 1 line
2.10.2
Steven Rostedt
maintainerPATCH 2/4 tracing: Treat recording comm for idle task as a success
In reply to Steven RostedtFrom: Joel Fernandes <[email protected]>
Currently we stop recording comm for non-idle tasks when switching from/to idle task since we treat that as a record failure. Fix that by treat recording of comm for idle task as a success.
--- kernel/trace/trace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
kernel/trace/trace.c +5 -1
@@ -1916,7 +1916,11 @@ static int trace_save_cmdline(struct task_struct *tsk) {unsigned pid, idx; -if (!tsk->pid ||unlikely (tsk->pid >PID_MAX_DEFAULT )) +/* treat recording of idle task as a success */ +if (!tsk->pid) +return 1 ; + +if (unlikely (tsk->pid >PID_MAX_DEFAULT ))return 0 ;/*
Signature · 1 line
2.10.2
Steven Rostedt
maintainerPATCH 3/4 tracing: Treat recording tgid for idle task as a success
In reply to Steven RostedtFrom: Joel Fernandes <[email protected]>
Currently we stop recording tgid for non-idle tasks when switching from/to idle task since we treat that as a record failure. Fix that by treat recording of tgid for idle task as a success.
--- kernel/trace/trace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
kernel/trace/trace.c +5 -1
@@ -2006,7 +2006,11 @@ int trace_find_tgid(int pid)static int trace_save_tgid (struct task_struct *tsk) { -if (unlikely (!tgid_map || !tsk->pid || tsk->pid >PID_MAX_DEFAULT )) +/* treat recording of idle task as a success */ +if (!tsk->pid) +return 1 ; + +if (unlikely (!tgid_map || tsk->pid >PID_MAX_DEFAULT ))return 0 ; tgid_map[tsk->pid] = tsk->tgid;
Signature · 1 line
2.10.2
Steven Rostedt
maintainerPATCH 4/4 tracing: Attempt to record other information even if some fail
In reply to Steven RostedtFrom: Joel Fernandes <[email protected]>
In recent patches where we record comm and tgid at the same time, we skip continuing to record if any fail. Fix that by trying to record as many things as we can even if some couldn't be recorded. If any information isn't recorded, then we don't set trace_taskinfo_save as before.
--- kernel/trace/trace.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-)
kernel/trace/trace.c +24 -8
@@ -2037,11 +2037,20 @@ static bool tracing_record_taskinfo_skip(int flags)*/ void tracing_record_taskinfo (struct task_struct *task,int flags) { +bool done; +if (tracing_record_taskinfo_skip (flags))return ; -if ((flags &TRACE_RECORD_CMDLINE ) && !trace_save_cmdline (task)) -return ; -if ((flags &TRACE_RECORD_TGID ) && !trace_save_tgid (task)) + +/* +* Record as much task information as possible. If some fail, continue +* to try to record the others. +*/ + done = !(flags &TRACE_RECORD_CMDLINE ) ||trace_save_cmdline (task); + done &= !(flags &TRACE_RECORD_TGID ) ||trace_save_tgid (task); + +/* If recording any information failed, retry again soon. */ +if (!done)return ;__this_cpu_write (trace_taskinfo_save, false);
@@ -2058,15 +2067,22 @@ void tracing_record_taskinfo(struct task_struct *task, int flags)void tracing_record_taskinfo_sched_switch (struct task_struct *prev,struct task_struct *next,int flags) { +bool done; +if (tracing_record_taskinfo_skip (flags))return ; -if ((flags &TRACE_RECORD_CMDLINE ) && - (!trace_save_cmdline (prev) || !trace_save_cmdline (next))) -return ; +/* +* Record as much task information as possible. If some fail, continue +* to try to record the others. +*/ + done = !(flags &TRACE_RECORD_CMDLINE ) ||trace_save_cmdline (prev); + done &= !(flags &TRACE_RECORD_CMDLINE ) ||trace_save_cmdline (next); + done &= !(flags &TRACE_RECORD_TGID ) ||trace_save_tgid (prev); + done &= !(flags &TRACE_RECORD_TGID ) ||trace_save_tgid (next); -if ((flags &TRACE_RECORD_TGID ) && - (!trace_save_tgid (prev) || !trace_save_tgid (next))) +/* If recording any information failed, retry again soon. */ +if (!done)return ;__this_cpu_write (trace_taskinfo_save, false);
Signature · 1 line
2.10.2