aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2014-10-30 10:09:48 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-11-03 16:11:59 -0500
commit758008b262f70be41104e4e33ba99181ac03775d (patch)
treea790cf772df84114319a29c0142e3cdaecb24f00
parent6a70307ddcd9999598c399d55dc44c07816a575f (diff)
perf tools: Defer export of comms that were not 'set'
Tracing for a workload begins before the comm event is seen, which results in the initial comm having a string of the form ":<pid>" (e.g. ":12345"). In order to export the correct string, defer the export until the new script 'flush' callback. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1414678188-14946-8-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/util/db-export.c62
-rw-r--r--tools/perf/util/db-export.h3
-rw-r--r--tools/perf/util/scripting-engines/trace-event-python.c4
3 files changed, 67 insertions, 2 deletions
diff --git a/tools/perf/util/db-export.c b/tools/perf/util/db-export.c
index 017ecbb0ec05..c81dae399763 100644
--- a/tools/perf/util/db-export.c
+++ b/tools/perf/util/db-export.c
@@ -21,17 +21,74 @@
21#include "comm.h" 21#include "comm.h"
22#include "symbol.h" 22#include "symbol.h"
23#include "event.h" 23#include "event.h"
24#include "util.h"
24#include "thread-stack.h" 25#include "thread-stack.h"
25#include "db-export.h" 26#include "db-export.h"
26 27
28struct deferred_export {
29 struct list_head node;
30 struct comm *comm;
31};
32
33static int db_export__deferred(struct db_export *dbe)
34{
35 struct deferred_export *de;
36 int err;
37
38 while (!list_empty(&dbe->deferred)) {
39 de = list_entry(dbe->deferred.next, struct deferred_export,
40 node);
41 err = dbe->export_comm(dbe, de->comm);
42 list_del(&de->node);
43 free(de);
44 if (err)
45 return err;
46 }
47
48 return 0;
49}
50
51static void db_export__free_deferred(struct db_export *dbe)
52{
53 struct deferred_export *de;
54
55 while (!list_empty(&dbe->deferred)) {
56 de = list_entry(dbe->deferred.next, struct deferred_export,
57 node);
58 list_del(&de->node);
59 free(de);
60 }
61}
62
63static int db_export__defer_comm(struct db_export *dbe, struct comm *comm)
64{
65 struct deferred_export *de;
66
67 de = zalloc(sizeof(struct deferred_export));
68 if (!de)
69 return -ENOMEM;
70
71 de->comm = comm;
72 list_add_tail(&de->node, &dbe->deferred);
73
74 return 0;
75}
76
27int db_export__init(struct db_export *dbe) 77int db_export__init(struct db_export *dbe)
28{ 78{
29 memset(dbe, 0, sizeof(struct db_export)); 79 memset(dbe, 0, sizeof(struct db_export));
80 INIT_LIST_HEAD(&dbe->deferred);
30 return 0; 81 return 0;
31} 82}
32 83
84int db_export__flush(struct db_export *dbe)
85{
86 return db_export__deferred(dbe);
87}
88
33void db_export__exit(struct db_export *dbe) 89void db_export__exit(struct db_export *dbe)
34{ 90{
91 db_export__free_deferred(dbe);
35 call_return_processor__free(dbe->crp); 92 call_return_processor__free(dbe->crp);
36 dbe->crp = NULL; 93 dbe->crp = NULL;
37} 94}
@@ -115,7 +172,10 @@ int db_export__comm(struct db_export *dbe, struct comm *comm,
115 comm->db_id = ++dbe->comm_last_db_id; 172 comm->db_id = ++dbe->comm_last_db_id;
116 173
117 if (dbe->export_comm) { 174 if (dbe->export_comm) {
118 err = dbe->export_comm(dbe, comm); 175 if (main_thread->comm_set)
176 err = dbe->export_comm(dbe, comm);
177 else
178 err = db_export__defer_comm(dbe, comm);
119 if (err) 179 if (err)
120 return err; 180 return err;
121 } 181 }
diff --git a/tools/perf/util/db-export.h b/tools/perf/util/db-export.h
index dd5ac2ae97d4..adbd22d66798 100644
--- a/tools/perf/util/db-export.h
+++ b/tools/perf/util/db-export.h
@@ -17,6 +17,7 @@
17#define __PERF_DB_EXPORT_H 17#define __PERF_DB_EXPORT_H
18 18
19#include <linux/types.h> 19#include <linux/types.h>
20#include <linux/list.h>
20 21
21struct perf_evsel; 22struct perf_evsel;
22struct machine; 23struct machine;
@@ -74,9 +75,11 @@ struct db_export {
74 u64 sample_last_db_id; 75 u64 sample_last_db_id;
75 u64 call_path_last_db_id; 76 u64 call_path_last_db_id;
76 u64 call_return_last_db_id; 77 u64 call_return_last_db_id;
78 struct list_head deferred;
77}; 79};
78 80
79int db_export__init(struct db_export *dbe); 81int db_export__init(struct db_export *dbe);
82int db_export__flush(struct db_export *dbe);
80void db_export__exit(struct db_export *dbe); 83void db_export__exit(struct db_export *dbe);
81int db_export__evsel(struct db_export *dbe, struct perf_evsel *evsel); 84int db_export__evsel(struct db_export *dbe, struct perf_evsel *evsel);
82int db_export__machine(struct db_export *dbe, struct machine *machine); 85int db_export__machine(struct db_export *dbe, struct machine *machine);
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index cb1d9602f418..118bc62850a8 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -1030,7 +1030,9 @@ error:
1030 1030
1031static int python_flush_script(void) 1031static int python_flush_script(void)
1032{ 1032{
1033 return 0; 1033 struct tables *tables = &tables_global;
1034
1035 return db_export__flush(&tables->dbe);
1034} 1036}
1035 1037
1036/* 1038/*