Skip to content

Commit

Permalink
perf tools: Defer export of comms that were not 'set'
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Adrian Hunter authored and Arnaldo Carvalho de Melo committed Nov 3, 2014
1 parent 6a70307 commit 758008b
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 2 deletions.
62 changes: 61 additions & 1 deletion tools/perf/util/db-export.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,74 @@
#include "comm.h"
#include "symbol.h"
#include "event.h"
#include "util.h"
#include "thread-stack.h"
#include "db-export.h"

struct deferred_export {
struct list_head node;
struct comm *comm;
};

static int db_export__deferred(struct db_export *dbe)
{
struct deferred_export *de;
int err;

while (!list_empty(&dbe->deferred)) {
de = list_entry(dbe->deferred.next, struct deferred_export,
node);
err = dbe->export_comm(dbe, de->comm);
list_del(&de->node);
free(de);
if (err)
return err;
}

return 0;
}

static void db_export__free_deferred(struct db_export *dbe)
{
struct deferred_export *de;

while (!list_empty(&dbe->deferred)) {
de = list_entry(dbe->deferred.next, struct deferred_export,
node);
list_del(&de->node);
free(de);
}
}

static int db_export__defer_comm(struct db_export *dbe, struct comm *comm)
{
struct deferred_export *de;

de = zalloc(sizeof(struct deferred_export));
if (!de)
return -ENOMEM;

de->comm = comm;
list_add_tail(&de->node, &dbe->deferred);

return 0;
}

int db_export__init(struct db_export *dbe)
{
memset(dbe, 0, sizeof(struct db_export));
INIT_LIST_HEAD(&dbe->deferred);
return 0;
}

int db_export__flush(struct db_export *dbe)
{
return db_export__deferred(dbe);
}

void db_export__exit(struct db_export *dbe)
{
db_export__free_deferred(dbe);
call_return_processor__free(dbe->crp);
dbe->crp = NULL;
}
Expand Down Expand Up @@ -115,7 +172,10 @@ int db_export__comm(struct db_export *dbe, struct comm *comm,
comm->db_id = ++dbe->comm_last_db_id;

if (dbe->export_comm) {
err = dbe->export_comm(dbe, comm);
if (main_thread->comm_set)
err = dbe->export_comm(dbe, comm);
else
err = db_export__defer_comm(dbe, comm);
if (err)
return err;
}
Expand Down
3 changes: 3 additions & 0 deletions tools/perf/util/db-export.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#define __PERF_DB_EXPORT_H

#include <linux/types.h>
#include <linux/list.h>

struct perf_evsel;
struct machine;
Expand Down Expand Up @@ -74,9 +75,11 @@ struct db_export {
u64 sample_last_db_id;
u64 call_path_last_db_id;
u64 call_return_last_db_id;
struct list_head deferred;
};

int db_export__init(struct db_export *dbe);
int db_export__flush(struct db_export *dbe);
void db_export__exit(struct db_export *dbe);
int db_export__evsel(struct db_export *dbe, struct perf_evsel *evsel);
int db_export__machine(struct db_export *dbe, struct machine *machine);
Expand Down
4 changes: 3 additions & 1 deletion tools/perf/util/scripting-engines/trace-event-python.c
Original file line number Diff line number Diff line change
Expand Up @@ -1030,7 +1030,9 @@ static int python_start_script(const char *script, int argc, const char **argv)

static int python_flush_script(void)
{
return 0;
struct tables *tables = &tables_global;

return db_export__flush(&tables->dbe);
}

/*
Expand Down

0 comments on commit 758008b

Please sign in to comment.