From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752319AbbHTJzn (ORCPT ); Thu, 20 Aug 2015 05:55:43 -0400 Received: from terminus.zytor.com ([198.137.202.10]:35053 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752282AbbHTJzj (ORCPT ); Thu, 20 Aug 2015 05:55:39 -0400 Date: Thu, 20 Aug 2015 02:55:23 -0700 From: tip-bot for Arnaldo Carvalho de Melo Message-ID: Cc: bp@suse.de, adrian.hunter@intel.com, acme@redhat.com, dsahern@gmail.com, jolsa@redhat.com, eranian@google.com, linux-kernel@vger.kernel.org, mingo@kernel.org, hpa@zytor.com, tglx@linutronix.de, namhyung@kernel.org, fweisbec@gmail.com Reply-To: fweisbec@gmail.com, mingo@kernel.org, linux-kernel@vger.kernel.org, namhyung@kernel.org, hpa@zytor.com, tglx@linutronix.de, jolsa@redhat.com, eranian@google.com, adrian.hunter@intel.com, acme@redhat.com, bp@suse.de, dsahern@gmail.com To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf trace: Move vfs_getname storage to per thread area Git-Commit-ID: 7f4f800131a281a1e1738c0bc45659c1260dc96a X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 7f4f800131a281a1e1738c0bc45659c1260dc96a Gitweb: http://git.kernel.org/tip/7f4f800131a281a1e1738c0bc45659c1260dc96a Author: Arnaldo Carvalho de Melo AuthorDate: Fri, 14 Aug 2015 13:16:27 -0300 Committer: Arnaldo Carvalho de Melo CommitDate: Fri, 14 Aug 2015 13:16:27 -0300 perf trace: Move vfs_getname storage to per thread area We were storing the vfs_getname payload (i.e. ptr->string) into the trace wide storage area (struct trace), so that we could use the last payload when setting up the fd->pathname per thread tables, oops, not a good idea for multi cpu tracing sessions... Fix it by moving it to the per thread area (struct thread_trace). Cc: Adrian Hunter Cc: Borislav Petkov Cc: David Ahern Cc: Frederic Weisbecker Cc: Jiri Olsa Cc: Namhyung Kim Cc: Stephane Eranian Link: http://lkml.kernel.org/n/tip-3j05ttqyaem7kh7oubvr1keo@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-trace.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 489cc11..2f1162d 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -1315,7 +1315,10 @@ struct thread_trace { double runtime_ms; struct { unsigned long ptr; - int entry_str_pos; + short int entry_str_pos; + bool pending_open; + unsigned int namelen; + char *name; } filename; struct { int max; @@ -1391,7 +1394,6 @@ struct trace { size_t nr; int *entries; } ev_qualifier_ids; - const char *last_vfs_getname; struct intlist *tid_list; struct intlist *pid_list; struct { @@ -1966,8 +1968,11 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel, trace__fprintf_entry_head(trace, thread, 1, sample->time, trace->output); fprintf(trace->output, "%-70s\n", ttrace->entry_str); } - } else + } else { ttrace->entry_pending = true; + /* See trace__vfs_getname & trace__sys_exit */ + ttrace->filename.pending_open = false; + } if (trace->current != thread) { thread__put(trace->current); @@ -2003,9 +2008,9 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel, ret = perf_evsel__sc_tp_uint(evsel, ret, sample); - if (id == trace->audit.open_id && ret >= 0 && trace->last_vfs_getname) { - trace__set_fd_pathname(thread, ret, trace->last_vfs_getname); - trace->last_vfs_getname = NULL; + if (id == trace->audit.open_id && ret >= 0 && ttrace->filename.pending_open) { + trace__set_fd_pathname(thread, ret, ttrace->filename.name); + ttrace->filename.pending_open = false; ++trace->stats.vfs_getname; } @@ -2065,9 +2070,7 @@ static int trace__vfs_getname(struct trace *trace, struct perf_evsel *evsel, size_t filename_len, entry_str_len, to_move; ssize_t remaining_space; char *pos; - const char *filename; - - trace->last_vfs_getname = perf_evsel__rawptr(evsel, sample, "pathname"); + const char *filename = perf_evsel__rawptr(evsel, sample, "pathname"); if (!thread) goto out; @@ -2076,6 +2079,21 @@ static int trace__vfs_getname(struct trace *trace, struct perf_evsel *evsel, if (!ttrace) goto out; + filename_len = strlen(filename); + + if (ttrace->filename.namelen < filename_len) { + char *f = realloc(ttrace->filename.name, filename_len + 1); + + if (f == NULL) + goto out; + + ttrace->filename.namelen = filename_len; + ttrace->filename.name = f; + } + + strcpy(ttrace->filename.name, filename); + ttrace->filename.pending_open = true; + if (!ttrace->filename.ptr) goto out; @@ -2084,8 +2102,6 @@ static int trace__vfs_getname(struct trace *trace, struct perf_evsel *evsel, if (remaining_space <= 0) goto out; - filename = trace->last_vfs_getname; - filename_len = strlen(filename); if (filename_len > (size_t)remaining_space) { filename += filename_len - remaining_space; filename_len = remaining_space;