mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-07 21:53:44 +00:00
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>
This commit is contained in:
parent
6a70307ddc
commit
758008b262
@ -21,17 +21,74 @@
|
|||||||
#include "comm.h"
|
#include "comm.h"
|
||||||
#include "symbol.h"
|
#include "symbol.h"
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
|
#include "util.h"
|
||||||
#include "thread-stack.h"
|
#include "thread-stack.h"
|
||||||
#include "db-export.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)
|
int db_export__init(struct db_export *dbe)
|
||||||
{
|
{
|
||||||
memset(dbe, 0, sizeof(struct db_export));
|
memset(dbe, 0, sizeof(struct db_export));
|
||||||
|
INIT_LIST_HEAD(&dbe->deferred);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int db_export__flush(struct db_export *dbe)
|
||||||
|
{
|
||||||
|
return db_export__deferred(dbe);
|
||||||
|
}
|
||||||
|
|
||||||
void db_export__exit(struct db_export *dbe)
|
void db_export__exit(struct db_export *dbe)
|
||||||
{
|
{
|
||||||
|
db_export__free_deferred(dbe);
|
||||||
call_return_processor__free(dbe->crp);
|
call_return_processor__free(dbe->crp);
|
||||||
dbe->crp = NULL;
|
dbe->crp = NULL;
|
||||||
}
|
}
|
||||||
@ -115,7 +172,10 @@ int db_export__comm(struct db_export *dbe, struct comm *comm,
|
|||||||
comm->db_id = ++dbe->comm_last_db_id;
|
comm->db_id = ++dbe->comm_last_db_id;
|
||||||
|
|
||||||
if (dbe->export_comm) {
|
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)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#define __PERF_DB_EXPORT_H
|
#define __PERF_DB_EXPORT_H
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
#include <linux/list.h>
|
||||||
|
|
||||||
struct perf_evsel;
|
struct perf_evsel;
|
||||||
struct machine;
|
struct machine;
|
||||||
@ -74,9 +75,11 @@ struct db_export {
|
|||||||
u64 sample_last_db_id;
|
u64 sample_last_db_id;
|
||||||
u64 call_path_last_db_id;
|
u64 call_path_last_db_id;
|
||||||
u64 call_return_last_db_id;
|
u64 call_return_last_db_id;
|
||||||
|
struct list_head deferred;
|
||||||
};
|
};
|
||||||
|
|
||||||
int db_export__init(struct db_export *dbe);
|
int db_export__init(struct db_export *dbe);
|
||||||
|
int db_export__flush(struct db_export *dbe);
|
||||||
void db_export__exit(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__evsel(struct db_export *dbe, struct perf_evsel *evsel);
|
||||||
int db_export__machine(struct db_export *dbe, struct machine *machine);
|
int db_export__machine(struct db_export *dbe, struct machine *machine);
|
||||||
|
@ -1030,7 +1030,9 @@ static int python_start_script(const char *script, int argc, const char **argv)
|
|||||||
|
|
||||||
static int python_flush_script(void)
|
static int python_flush_script(void)
|
||||||
{
|
{
|
||||||
return 0;
|
struct tables *tables = &tables_global;
|
||||||
|
|
||||||
|
return db_export__flush(&tables->dbe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user