aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/db-export.c
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 /tools/perf/util/db-export.c
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>
Diffstat (limited to 'tools/perf/util/db-export.c')
-rw-r--r--tools/perf/util/db-export.c62
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
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 }