diff options
author | Adrian Hunter <adrian.hunter@intel.com> | 2014-10-30 10:09:48 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2014-11-03 16:11:59 -0500 |
commit | 758008b262f70be41104e4e33ba99181ac03775d (patch) | |
tree | a790cf772df84114319a29c0142e3cdaecb24f00 /tools/perf/util/db-export.c | |
parent | 6a70307ddcd9999598c399d55dc44c07816a575f (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>
Diffstat (limited to 'tools/perf/util/db-export.c')
-rw-r--r-- | tools/perf/util/db-export.c | 62 |
1 files changed, 61 insertions, 1 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 | ||
28 | struct deferred_export { | ||
29 | struct list_head node; | ||
30 | struct comm *comm; | ||
31 | }; | ||
32 | |||
33 | static 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 | |||
51 | static 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 | |||
63 | static 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 | |||
27 | int db_export__init(struct db_export *dbe) | 77 | int 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 | ||
84 | int db_export__flush(struct db_export *dbe) | ||
85 | { | ||
86 | return db_export__deferred(dbe); | ||
87 | } | ||
88 | |||
33 | void db_export__exit(struct db_export *dbe) | 89 | void 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 | } |