tracing: Add saved_tgids file to show cached pid to tgid mappings
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 Link: http://lkml.kernel.org/r/20170630004023.064965233@goodmis.org Link: http://lkml.kernel.org/r/20170706040713.unwkumbta5menygi@mikesart-cos Reviewed-by: Joel Fernandes <joelaf@google.com> Signed-off-by: Michael Sartain <mikesart@fastmail.com> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
69d71879d2
commit
99c621d704
|
@ -4688,6 +4688,76 @@ static const struct file_operations tracing_readme_fops = {
|
||||||
.llseek = generic_file_llseek,
|
.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)
|
static void *saved_cmdlines_next(struct seq_file *m, void *v, loff_t *pos)
|
||||||
{
|
{
|
||||||
unsigned int *ptr = v;
|
unsigned int *ptr = v;
|
||||||
|
@ -7920,6 +7990,9 @@ static __init int tracer_init_tracefs(void)
|
||||||
trace_create_file("saved_cmdlines_size", 0644, d_tracer,
|
trace_create_file("saved_cmdlines_size", 0644, d_tracer,
|
||||||
NULL, &tracing_saved_cmdlines_size_fops);
|
NULL, &tracing_saved_cmdlines_size_fops);
|
||||||
|
|
||||||
|
trace_create_file("saved_tgids", 0444, d_tracer,
|
||||||
|
NULL, &tracing_saved_tgids_fops);
|
||||||
|
|
||||||
trace_eval_init();
|
trace_eval_init();
|
||||||
|
|
||||||
trace_create_eval_file(d_tracer);
|
trace_create_eval_file(d_tracer);
|
||||||
|
|
Loading…
Reference in New Issue