diff options
| author | Michael Sartain <mikesart@fastmail.com> | 2017-07-06 00:07:15 -0400 |
|---|---|---|
| committer | Steven Rostedt (VMware) <rostedt@goodmis.org> | 2017-07-06 10:11:53 -0400 |
| commit | 99c621d704cf1c4eb74c3c42e674edf3df64f92d (patch) | |
| tree | 451419a4c1f2ea68d8b40dbcd17778406dce4281 /kernel | |
| parent | 69d71879d2cf67a381055f698a1d7def00dc4ed7 (diff) | |
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>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/trace/trace.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 00e2e4169b1e..f079a8ca1117 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -4688,6 +4688,76 @@ static const struct file_operations tracing_readme_fops = { | |||
| 4688 | .llseek = generic_file_llseek, | 4688 | .llseek = generic_file_llseek, |
| 4689 | }; | 4689 | }; |
| 4690 | 4690 | ||
| 4691 | static void *saved_tgids_next(struct seq_file *m, void *v, loff_t *pos) | ||
| 4692 | { | ||
| 4693 | int *ptr = v; | ||
| 4694 | |||
| 4695 | if (*pos || m->count) | ||
| 4696 | ptr++; | ||
| 4697 | |||
| 4698 | (*pos)++; | ||
| 4699 | |||
| 4700 | for (; ptr <= &tgid_map[PID_MAX_DEFAULT]; ptr++) { | ||
| 4701 | if (trace_find_tgid(*ptr)) | ||
| 4702 | return ptr; | ||
| 4703 | } | ||
| 4704 | |||
| 4705 | return NULL; | ||
| 4706 | } | ||
| 4707 | |||
| 4708 | static void *saved_tgids_start(struct seq_file *m, loff_t *pos) | ||
| 4709 | { | ||
| 4710 | void *v; | ||
| 4711 | loff_t l = 0; | ||
| 4712 | |||
| 4713 | if (!tgid_map) | ||
| 4714 | return NULL; | ||
| 4715 | |||
| 4716 | v = &tgid_map[0]; | ||
| 4717 | while (l <= *pos) { | ||
| 4718 | v = saved_tgids_next(m, v, &l); | ||
| 4719 | if (!v) | ||
| 4720 | return NULL; | ||
| 4721 | } | ||
| 4722 | |||
| 4723 | return v; | ||
| 4724 | } | ||
| 4725 | |||
| 4726 | static void saved_tgids_stop(struct seq_file *m, void *v) | ||
| 4727 | { | ||
| 4728 | } | ||
| 4729 | |||
| 4730 | static int saved_tgids_show(struct seq_file *m, void *v) | ||
| 4731 | { | ||
| 4732 | int pid = (int *)v - tgid_map; | ||
| 4733 | |||
| 4734 | seq_printf(m, "%d %d\n", pid, trace_find_tgid(pid)); | ||
| 4735 | return 0; | ||
| 4736 | } | ||
| 4737 | |||
| 4738 | static const struct seq_operations tracing_saved_tgids_seq_ops = { | ||
| 4739 | .start = saved_tgids_start, | ||
| 4740 | .stop = saved_tgids_stop, | ||
| 4741 | .next = saved_tgids_next, | ||
| 4742 | .show = saved_tgids_show, | ||
| 4743 | }; | ||
| 4744 | |||
| 4745 | static int tracing_saved_tgids_open(struct inode *inode, struct file *filp) | ||
| 4746 | { | ||
| 4747 | if (tracing_disabled) | ||
| 4748 | return -ENODEV; | ||
| 4749 | |||
| 4750 | return seq_open(filp, &tracing_saved_tgids_seq_ops); | ||
| 4751 | } | ||
| 4752 | |||
| 4753 | |||
| 4754 | static const struct file_operations tracing_saved_tgids_fops = { | ||
| 4755 | .open = tracing_saved_tgids_open, | ||
| 4756 | .read = seq_read, | ||
| 4757 | .llseek = seq_lseek, | ||
| 4758 | .release = seq_release, | ||
| 4759 | }; | ||
| 4760 | |||
| 4691 | static void *saved_cmdlines_next(struct seq_file *m, void *v, loff_t *pos) | 4761 | static void *saved_cmdlines_next(struct seq_file *m, void *v, loff_t *pos) |
| 4692 | { | 4762 | { |
| 4693 | unsigned int *ptr = v; | 4763 | unsigned int *ptr = v; |
| @@ -7920,6 +7990,9 @@ static __init int tracer_init_tracefs(void) | |||
| 7920 | trace_create_file("saved_cmdlines_size", 0644, d_tracer, | 7990 | trace_create_file("saved_cmdlines_size", 0644, d_tracer, |
| 7921 | NULL, &tracing_saved_cmdlines_size_fops); | 7991 | NULL, &tracing_saved_cmdlines_size_fops); |
| 7922 | 7992 | ||
| 7993 | trace_create_file("saved_tgids", 0444, d_tracer, | ||
| 7994 | NULL, &tracing_saved_tgids_fops); | ||
| 7995 | |||
| 7923 | trace_eval_init(); | 7996 | trace_eval_init(); |
| 7924 | 7997 | ||
| 7925 | trace_create_eval_file(d_tracer); | 7998 | trace_create_eval_file(d_tracer); |
