perf script: Replace "struct thread" with "struct addr_location" as a parameter for...
authorFeng Tang <feng.tang@intel.com>
Wed, 8 Aug 2012 09:57:52 +0000 (17:57 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 8 Aug 2012 15:46:40 +0000 (12:46 -0300)
Both perl and python script start processing events other than trace
points, and it's useful to pass the resolved symbol and the dso info to
the event handler in script for better analysis and statistics.

Struct thread is already a member of struct addr_location, using
addr_location will keep the thread info, while providing additional
symbol and dso info if exist, so that the script itself doesn't need to
bother to do the symbol resolving and dso searching work.

Tested-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Feng Tang <feng.tang@intel.com>
Acked-by: David Ahern <dsahern@gmail.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Robert Richter <robert.richter@amd.com>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1344419875-21665-3-git-send-email-feng.tang@intel.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 6425612b4d99c1dd340234238359bc4c94760fa6..30a9cb8c9927ca6e940238c81b2c9a5b6777b345 100644 (file)
@@ -396,9 +396,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 thread *thread)
+                         struct addr_location *al)
 {
        struct perf_event_attr *attr = &evsel->attr;
+       struct thread *thread = al->thread;
 
        if (output[attr->type].fields == 0)
                return;
@@ -511,7 +512,7 @@ static int process_sample_event(struct perf_tool *tool __used,
        if (cpu_list && !test_bit(sample->cpu, cpu_bitmap))
                return 0;
 
-       scripting_ops->process_event(event, sample, evsel, machine, thread);
+       scripting_ops->process_event(event, sample, evsel, machine, &al);
 
        evsel->hists.stats.total_period += sample->period;
        return 0;
index 52580d09d75c2ee33022e3103a3a7e68c99e96d9..d28001016fb59c99c46f0e516beb7da3bafea903 100644 (file)
@@ -261,7 +261,7 @@ static void perl_process_tracepoint(union perf_event *perf_event __unused,
                                    struct perf_sample *sample,
                                    struct perf_evsel *evsel,
                                    struct machine *machine __unused,
-                                   struct thread *thread)
+                                   struct addr_location *al)
 {
        struct format_field *field;
        static char handler[256];
@@ -272,6 +272,7 @@ static void perl_process_tracepoint(union perf_event *perf_event __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;
@@ -349,7 +350,7 @@ static void perl_process_event_generic(union perf_event *event,
                                       struct perf_sample *sample,
                                       struct perf_evsel *evsel,
                                       struct machine *machine __unused,
-                                      struct thread *thread __unused)
+                                      struct addr_location *al __unused)
 {
        dSP;
 
@@ -375,10 +376,10 @@ static void perl_process_event(union perf_event *event,
                               struct perf_sample *sample,
                               struct perf_evsel *evsel,
                               struct machine *machine,
-                              struct thread *thread)
+                              struct addr_location *al)
 {
-       perl_process_tracepoint(event, sample, evsel, machine, thread);
-       perl_process_event_generic(event, sample, evsel, machine, thread);
+       perl_process_tracepoint(event, sample, evsel, machine, al);
+       perl_process_event_generic(event, sample, evsel, machine, al);
 }
 
 static void run_start_sub(void)
index b9010d878b4bf0a749a34fff7900423783ce4701..24711b3536d395d16c42794e7238024b141da926 100644 (file)
@@ -225,7 +225,7 @@ static void python_process_tracepoint(union perf_event *perf_event __unused,
                                 struct perf_sample *sample,
                                 struct perf_evsel *evsel,
                                 struct machine *machine __unused,
-                                struct thread *thread)
+                                struct addr_location *al)
 {
        PyObject *handler, *retval, *context, *t, *obj, *dict = NULL;
        static char handler_name[256];
@@ -238,6 +238,7 @@ static void python_process_tracepoint(union perf_event *perf_event __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;
 
        t = PyTuple_New(MAX_FIELDS);
@@ -342,7 +343,7 @@ static void python_process_general_event(union perf_event *perf_event __unused,
                                         struct perf_sample *sample,
                                         struct perf_evsel *evsel,
                                         struct machine *machine __unused,
-                                        struct thread *thread __unused)
+                                        struct addr_location *al __unused)
 {
        PyObject *handler, *retval, *t;
        static char handler_name[64];
@@ -361,7 +362,7 @@ static void python_process_general_event(union perf_event *perf_event __unused,
                goto exit;
        }
 
-       /* Pass 3 parameters: event_attr, perf_sample, raw data */
+       /* Pass 4 parameters: event_attr, perf_sample, raw data, thread name */
        PyTuple_SetItem(t, n++, PyString_FromStringAndSize((void *)&evsel->attr, sizeof(evsel->attr)));
        PyTuple_SetItem(t, n++, PyString_FromStringAndSize((void *)sample, sizeof(*sample)));
        PyTuple_SetItem(t, n++, PyString_FromStringAndSize(data, sample->raw_size));
@@ -380,17 +381,17 @@ 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, thread);
+                                         machine, al);
                break;
        /* Reserve for future process_hw/sw/raw APIs */
        default:
                python_process_general_event(perf_event, sample, evsel,
-                                            machine, thread);
+                                            machine, al);
        }
 }
 
index aceb8eea15fc6db75451fe448e6772225edca23b..302ff262494c740fcf5830e241a550444892f485 100644 (file)
@@ -39,7 +39,7 @@ static void process_event_unsupported(union perf_event *event __unused,
                                      struct perf_sample *sample __unused,
                                      struct perf_evsel *evsel __unused,
                                      struct machine *machine __unused,
-                                     struct thread *thread __unused)
+                                     struct addr_location *al __unused)
 {
 }
 
index cee16350cd86b148fd7946a4947d4e7897c997b4..7575dfd26e58f2bbd93ffa5d74f3fea649897b45 100644 (file)
@@ -9,7 +9,6 @@ struct machine;
 struct perf_sample;
 union perf_event;
 struct perf_tool;
-struct thread;
 
 extern int header_page_size_size;
 extern int header_page_ts_size;
@@ -76,6 +75,8 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
 void tracing_data_put(struct tracing_data *tdata);
 
 
+struct addr_location;
+
 struct scripting_ops {
        const char *name;
        int (*start_script) (const char *script, int argc, const char **argv);
@@ -84,7 +85,7 @@ struct scripting_ops {
                               struct perf_sample *sample,
                               struct perf_evsel *evsel,
                               struct machine *machine,
-                              struct thread *thread);
+                              struct addr_location *al);
        int (*generate_script) (struct pevent *pevent, const char *outfile);
 };