Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Adrian Hunter and committed by
Arnaldo Carvalho de Melo
758008b2 6a70307d

+67 -2
+61 -1
tools/perf/util/db-export.c
··· 21 21 #include "comm.h" 22 22 #include "symbol.h" 23 23 #include "event.h" 24 + #include "util.h" 24 25 #include "thread-stack.h" 25 26 #include "db-export.h" 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 + } 26 76 27 77 int db_export__init(struct db_export *dbe) 28 78 { 29 79 memset(dbe, 0, sizeof(struct db_export)); 80 + INIT_LIST_HEAD(&dbe->deferred); 30 81 return 0; 82 + } 83 + 84 + int db_export__flush(struct db_export *dbe) 85 + { 86 + return db_export__deferred(dbe); 31 87 } 32 88 33 89 void db_export__exit(struct db_export *dbe) 34 90 { 91 + db_export__free_deferred(dbe); 35 92 call_return_processor__free(dbe->crp); 36 93 dbe->crp = NULL; 37 94 } ··· 172 115 comm->db_id = ++dbe->comm_last_db_id; 173 116 174 117 if (dbe->export_comm) { 175 - err = dbe->export_comm(dbe, comm); 118 + if (main_thread->comm_set) 119 + err = dbe->export_comm(dbe, comm); 120 + else 121 + err = db_export__defer_comm(dbe, comm); 176 122 if (err) 177 123 return err; 178 124 }
+3
tools/perf/util/db-export.h
··· 17 17 #define __PERF_DB_EXPORT_H 18 18 19 19 #include <linux/types.h> 20 + #include <linux/list.h> 20 21 21 22 struct perf_evsel; 22 23 struct machine; ··· 75 74 u64 sample_last_db_id; 76 75 u64 call_path_last_db_id; 77 76 u64 call_return_last_db_id; 77 + struct list_head deferred; 78 78 }; 79 79 80 80 int db_export__init(struct db_export *dbe); 81 + int db_export__flush(struct db_export *dbe); 81 82 void db_export__exit(struct db_export *dbe); 82 83 int db_export__evsel(struct db_export *dbe, struct perf_evsel *evsel); 83 84 int db_export__machine(struct db_export *dbe, struct machine *machine);
+3 -1
tools/perf/util/scripting-engines/trace-event-python.c
··· 1030 1030 1031 1031 static 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 /*