lkml.org 
[lkml]   [2014]   [Jul]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 28/31] perf tools: Defer export of comms that were not 'set'
    Date
    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>
    ---
    tools/perf/util/db-export.c | 62 +++++++++++++++++++++-
    tools/perf/util/db-export.h | 3 ++
    .../util/scripting-engines/trace-event-python.c | 4 +-
    3 files changed, 67 insertions(+), 2 deletions(-)

    diff --git a/tools/perf/util/db-export.c b/tools/perf/util/db-export.c
    index ca79616..ef61cf7 100644
    --- a/tools/perf/util/db-export.c
    +++ b/tools/perf/util/db-export.c
    @@ -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;
    }
    @@ -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;
    }
    diff --git a/tools/perf/util/db-export.h b/tools/perf/util/db-export.h
    index dd5ac2a..adbd22d 100644
    --- a/tools/perf/util/db-export.h
    +++ b/tools/perf/util/db-export.h
    @@ -17,6 +17,7 @@
    #define __PERF_DB_EXPORT_H

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

    struct perf_evsel;
    struct machine;
    @@ -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);
    diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
    index ed754d0..6c0ce62 100644
    --- a/tools/perf/util/scripting-engines/trace-event-python.c
    +++ b/tools/perf/util/scripting-engines/trace-event-python.c
    @@ -1024,7 +1024,9 @@ error:

    static int python_flush_script(void)
    {
    - return 0;
    + struct tables *tables = &tables_global;
    +
    + return db_export__flush(&tables->dbe);
    }

    /*
    --
    1.8.3.2


    \
     
     \ /
      Last update: 2014-07-31 09:01    [W:4.230 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site