Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752333AbdGFEQO (ORCPT ); Thu, 6 Jul 2017 00:16:14 -0400 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:55197 "EHLO out2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750922AbdGFEQM (ORCPT ); Thu, 6 Jul 2017 00:16:12 -0400 X-Greylist: delayed 534 seconds by postgrey-1.27 at vger.kernel.org; Thu, 06 Jul 2017 00:16:12 EDT X-ME-Sender: X-Sasl-enc: PY5SisW+iyimnsB7dOo5zaYMY9XWklHaNqe+CyxdLhzP 1499314037 Date: Wed, 5 Jul 2017 22:07:15 -0600 From: Michael Sartain To: linux-kernel@vger.kernel.org Cc: Joel Fernandes , Steven Rostedt , Ingo Molnar Subject: [PATCH v2] tracing: Add saved_tgids file to show cached pid to tgid mappings Message-ID: <20170706040713.unwkumbta5menygi@mikesart-cos> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: NeoMutt/20170609 (1.8.3) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2793 Lines: 119 Export the cached pid / tgid mappings added by Joel Fernandes' patch [1] 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 Let userspace apps reading binary buffer know tgid's. [1] https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1434654.html Reviewed-by: Joel Fernandes Signed-off-by: Michael Sartain --- [v2] Don't reuse cmdlines code for saved_tgids file. kernel/trace/trace.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index c72c36c..e962fb3 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -4701,6 +4701,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; @@ -7945,6 +8015,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); -- 2.13.2