perf script: Fix named threads support
authorDavid Ahern <dsahern@gmail.com>
Thu, 18 Jul 2013 22:06:15 +0000 (16:06 -0600)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 22 Jul 2013 14:55:53 +0000 (11:55 -0300)
Commit 73994dc broke named thread support in perf-script. The thread
struct in al is the main thread for a multithreaded process. The thread
struct used for analysis (e.g., dumping events) should be the specific
thread for the sample.

Signed-off-by: David Ahern <dsahern@gmail.com>
Cc: Feng Tang <feng.tang@intel.com>
Link: http://lkml.kernel.org/r/1374185175-28272-1-git-send-email-dsahern@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-script.c
tools/perf/util/scripting-engines/trace-event-perl.c
tools/perf/util/scripting-engines/trace-event-python.c
tools/perf/util/trace-event-scripting.c
tools/perf/util/trace-event.h

index ecb6979..1cad370 100644 (file)
@@ -397,10 +397,10 @@ static void print_sample_bts(union perf_event *event,
 
 static void process_event(union perf_event *event, struct perf_sample *sample,
                          struct perf_evsel *evsel, struct machine *machine,
-                         struct addr_location *al)
+                         struct thread *thread,
+                         struct addr_location *al __maybe_unused)
 {
        struct perf_event_attr *attr = &evsel->attr;
-       struct thread *thread = al->thread;
 
        if (output[attr->type].fields == 0)
                return;
@@ -511,7 +511,7 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused,
        if (cpu_list && !test_bit(sample->cpu, cpu_bitmap))
                return 0;
 
-       scripting_ops->process_event(event, sample, evsel, machine, &al);
+       scripting_ops->process_event(event, sample, evsel, machine, thread, &al);
 
        evsel->hists.stats.total_period += sample->period;
        return 0;
index eacec85..a85e4ae 100644 (file)
@@ -261,7 +261,8 @@ static void perl_process_tracepoint(union perf_event *perf_event __maybe_unused,
                                    struct perf_sample *sample,
                                    struct perf_evsel *evsel,
                                    struct machine *machine __maybe_unused,
-                                   struct addr_location *al)
+                                   struct thread *thread,
+                                       struct addr_location *al)
 {
        struct format_field *field;
        static char handler[256];
@@ -272,7 +273,6 @@ static void perl_process_tracepoint(union perf_event *perf_event __maybe_unused,
        int cpu = sample->cpu;
        void *data = sample->raw_data;
        unsigned long long nsecs = sample->time;
-       struct thread *thread = al->thread;
        char *comm = thread->comm;
 
        dSP;
@@ -351,7 +351,8 @@ static void perl_process_event_generic(union perf_event *event,
                                       struct perf_sample *sample,
                                       struct perf_evsel *evsel,
                                       struct machine *machine __maybe_unused,
-                                      struct addr_location *al __maybe_unused)
+                                      struct thread *thread __maybe_unused,
+                                          struct addr_location *al __maybe_unused)
 {
        dSP;
 
@@ -377,10 +378,11 @@ static void perl_process_event(union perf_event *event,
                               struct perf_sample *sample,
                               struct perf_evsel *evsel,
                               struct machine *machine,
-                              struct addr_location *al)
+                              struct thread *thread,
+                                  struct addr_location *al)
 {
-       perl_process_tracepoint(event, sample, evsel, machine, al);
-       perl_process_event_generic(event, sample, evsel, machine, al);
+       perl_process_tracepoint(event, sample, evsel, machine, thread, al);
+       perl_process_event_generic(event, sample, evsel, machine, thread, al);
 }
 
 static void run_start_sub(void)
index e87aa5d..cc75a3c 100644 (file)
@@ -225,6 +225,7 @@ static void python_process_tracepoint(union perf_event *perf_event
                                 struct perf_sample *sample,
                                 struct perf_evsel *evsel,
                                 struct machine *machine __maybe_unused,
+                                struct thread *thread,
                                 struct addr_location *al)
 {
        PyObject *handler, *retval, *context, *t, *obj, *dict = NULL;
@@ -238,7 +239,6 @@ static void python_process_tracepoint(union perf_event *perf_event
        int cpu = sample->cpu;
        void *data = sample->raw_data;
        unsigned long long nsecs = sample->time;
-       struct thread *thread = al->thread;
        char *comm = thread->comm;
 
        t = PyTuple_New(MAX_FIELDS);
@@ -345,12 +345,12 @@ static void python_process_general_event(union perf_event *perf_event
                                         struct perf_sample *sample,
                                         struct perf_evsel *evsel,
                                         struct machine *machine __maybe_unused,
+                                        struct thread *thread,
                                         struct addr_location *al)
 {
        PyObject *handler, *retval, *t, *dict;
        static char handler_name[64];
        unsigned n = 0;
-       struct thread *thread = al->thread;
 
        /*
         * Use the MAX_FIELDS to make the function expandable, though
@@ -404,17 +404,18 @@ static void python_process_event(union perf_event *perf_event,
                                 struct perf_sample *sample,
                                 struct perf_evsel *evsel,
                                 struct machine *machine,
+                                struct thread *thread,
                                 struct addr_location *al)
 {
        switch (evsel->attr.type) {
        case PERF_TYPE_TRACEPOINT:
                python_process_tracepoint(perf_event, sample, evsel,
-                                         machine, al);
+                                         machine, thread, al);
                break;
        /* Reserve for future process_hw/sw/raw APIs */
        default:
                python_process_general_event(perf_event, sample, evsel,
-                                            machine, al);
+                                            machine, thread, al);
        }
 }
 
index 8715a10..95199e4 100644 (file)
@@ -39,7 +39,8 @@ static void process_event_unsupported(union perf_event *event __maybe_unused,
                                      struct perf_sample *sample __maybe_unused,
                                      struct perf_evsel *evsel __maybe_unused,
                                      struct machine *machine __maybe_unused,
-                                     struct addr_location *al __maybe_unused)
+                                     struct thread *thread __maybe_unused,
+                                         struct addr_location *al __maybe_unused)
 {
 }
 
index 669a64a..fafe1a4 100644 (file)
@@ -9,6 +9,7 @@ struct machine;
 struct perf_sample;
 union perf_event;
 struct perf_tool;
+struct thread;
 
 extern struct pevent *perf_pevent;
 
@@ -68,7 +69,8 @@ struct scripting_ops {
                               struct perf_sample *sample,
                               struct perf_evsel *evsel,
                               struct machine *machine,
-                              struct addr_location *al);
+                              struct thread *thread,
+                                  struct addr_location *al);
        int (*generate_script) (struct pevent *pevent, const char *outfile);
 };