* [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT
@ 2021-05-25 9:51 Adrian Hunter
2021-05-25 9:51 ` [PATCH 01/10] perf scripting python: Fix tuple_set_u64() Adrian Hunter
` (10 more replies)
0 siblings, 11 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
Hi
These patches make it easier to customize scripting for Intel PT traces.
The first patch is a dependent fix.
Subsequent patches add more information to python scripting.
The final patch adds a branch trace to the intel-pt-events.py script
which previously supported only power events and ptwrite.
Adrian Hunter (10):
perf scripting python: Fix tuple_set_u64()
perf scripting python: Factor out set_sym_in_dict()
perf scripting python: Add 'addr_location' for 'addr'
perf script: Factor out perf_sample__sprintf_flags()
perf scripting python: Add sample flags
perf scripting python: Add IPC
perf scripting python: Add cpumode
perf scripting python: Add context switch
perf scripting python: Add auxtrace error
perf scripts python: intel-pt-events.py: Add branches to script
tools/perf/builtin-script.c | 56 +++-
.../perf/scripts/python/bin/intel-pt-events-record | 4 +-
.../perf/scripts/python/bin/intel-pt-events-report | 4 +-
tools/perf/scripts/python/intel-pt-events.py | 143 +++++++--
tools/perf/util/db-export.c | 12 +-
tools/perf/util/db-export.h | 2 +-
.../perf/util/scripting-engines/trace-event-perl.c | 3 +-
.../util/scripting-engines/trace-event-python.c | 321 +++++++++++++++------
tools/perf/util/trace-event-scripting.c | 3 +-
tools/perf/util/trace-event.h | 8 +-
10 files changed, 415 insertions(+), 141 deletions(-)
Regards
Adrian
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 01/10] perf scripting python: Fix tuple_set_u64()
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 9:51 ` [PATCH 02/10] perf scripting python: Factor out set_sym_in_dict() Adrian Hunter
` (9 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
tuple_set_u64() produces a signed value instead of an unsigned value.
That works for database export but not other cases. Rename to
tuple_set_d64() for database export and fix tuple_set_u64().
Fixes: df919b400ad3f ("perf scripting python: Extend interface to export data in a database-friendly way")
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
.../scripting-engines/trace-event-python.c | 146 ++++++++++--------
1 file changed, 81 insertions(+), 65 deletions(-)
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index db8f24341406..1d718ac5f574 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -934,7 +934,7 @@ static PyObject *tuple_new(unsigned int sz)
return t;
}
-static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
+static int tuple_set_s64(PyObject *t, unsigned int pos, s64 val)
{
#if BITS_PER_LONG == 64
return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
@@ -944,6 +944,22 @@ static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
#endif
}
+/*
+ * Databases support only signed 64-bit numbers, so even though we are
+ * exporting a u64, it must be as s64.
+ */
+#define tuple_set_d64 tuple_set_s64
+
+static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
+{
+#if BITS_PER_LONG == 64
+ return PyTuple_SetItem(t, pos, PyLong_FromUnsignedLong(val));
+#endif
+#if BITS_PER_LONG == 32
+ return PyTuple_SetItem(t, pos, PyLong_FromUnsignedLongLong(val));
+#endif
+}
+
static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
{
return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
@@ -967,7 +983,7 @@ static int python_export_evsel(struct db_export *dbe, struct evsel *evsel)
t = tuple_new(2);
- tuple_set_u64(t, 0, evsel->db_id);
+ tuple_set_d64(t, 0, evsel->db_id);
tuple_set_string(t, 1, evsel__name(evsel));
call_object(tables->evsel_handler, t, "evsel_table");
@@ -985,7 +1001,7 @@ static int python_export_machine(struct db_export *dbe,
t = tuple_new(3);
- tuple_set_u64(t, 0, machine->db_id);
+ tuple_set_d64(t, 0, machine->db_id);
tuple_set_s32(t, 1, machine->pid);
tuple_set_string(t, 2, machine->root_dir ? machine->root_dir : "");
@@ -1004,9 +1020,9 @@ static int python_export_thread(struct db_export *dbe, struct thread *thread,
t = tuple_new(5);
- tuple_set_u64(t, 0, thread->db_id);
- tuple_set_u64(t, 1, machine->db_id);
- tuple_set_u64(t, 2, main_thread_db_id);
+ tuple_set_d64(t, 0, thread->db_id);
+ tuple_set_d64(t, 1, machine->db_id);
+ tuple_set_d64(t, 2, main_thread_db_id);
tuple_set_s32(t, 3, thread->pid_);
tuple_set_s32(t, 4, thread->tid);
@@ -1025,10 +1041,10 @@ static int python_export_comm(struct db_export *dbe, struct comm *comm,
t = tuple_new(5);
- tuple_set_u64(t, 0, comm->db_id);
+ tuple_set_d64(t, 0, comm->db_id);
tuple_set_string(t, 1, comm__str(comm));
- tuple_set_u64(t, 2, thread->db_id);
- tuple_set_u64(t, 3, comm->start);
+ tuple_set_d64(t, 2, thread->db_id);
+ tuple_set_d64(t, 3, comm->start);
tuple_set_s32(t, 4, comm->exec);
call_object(tables->comm_handler, t, "comm_table");
@@ -1046,9 +1062,9 @@ static int python_export_comm_thread(struct db_export *dbe, u64 db_id,
t = tuple_new(3);
- tuple_set_u64(t, 0, db_id);
- tuple_set_u64(t, 1, comm->db_id);
- tuple_set_u64(t, 2, thread->db_id);
+ tuple_set_d64(t, 0, db_id);
+ tuple_set_d64(t, 1, comm->db_id);
+ tuple_set_d64(t, 2, thread->db_id);
call_object(tables->comm_thread_handler, t, "comm_thread_table");
@@ -1068,8 +1084,8 @@ static int python_export_dso(struct db_export *dbe, struct dso *dso,
t = tuple_new(5);
- tuple_set_u64(t, 0, dso->db_id);
- tuple_set_u64(t, 1, machine->db_id);
+ tuple_set_d64(t, 0, dso->db_id);
+ tuple_set_d64(t, 1, machine->db_id);
tuple_set_string(t, 2, dso->short_name);
tuple_set_string(t, 3, dso->long_name);
tuple_set_string(t, 4, sbuild_id);
@@ -1090,10 +1106,10 @@ static int python_export_symbol(struct db_export *dbe, struct symbol *sym,
t = tuple_new(6);
- tuple_set_u64(t, 0, *sym_db_id);
- tuple_set_u64(t, 1, dso->db_id);
- tuple_set_u64(t, 2, sym->start);
- tuple_set_u64(t, 3, sym->end);
+ tuple_set_d64(t, 0, *sym_db_id);
+ tuple_set_d64(t, 1, dso->db_id);
+ tuple_set_d64(t, 2, sym->start);
+ tuple_set_d64(t, 3, sym->end);
tuple_set_s32(t, 4, sym->binding);
tuple_set_string(t, 5, sym->name);
@@ -1130,30 +1146,30 @@ static void python_export_sample_table(struct db_export *dbe,
t = tuple_new(24);
- tuple_set_u64(t, 0, es->db_id);
- tuple_set_u64(t, 1, es->evsel->db_id);
- tuple_set_u64(t, 2, es->al->maps->machine->db_id);
- tuple_set_u64(t, 3, es->al->thread->db_id);
- tuple_set_u64(t, 4, es->comm_db_id);
- tuple_set_u64(t, 5, es->dso_db_id);
- tuple_set_u64(t, 6, es->sym_db_id);
- tuple_set_u64(t, 7, es->offset);
- tuple_set_u64(t, 8, es->sample->ip);
- tuple_set_u64(t, 9, es->sample->time);
+ tuple_set_d64(t, 0, es->db_id);
+ tuple_set_d64(t, 1, es->evsel->db_id);
+ tuple_set_d64(t, 2, es->al->maps->machine->db_id);
+ tuple_set_d64(t, 3, es->al->thread->db_id);
+ tuple_set_d64(t, 4, es->comm_db_id);
+ tuple_set_d64(t, 5, es->dso_db_id);
+ tuple_set_d64(t, 6, es->sym_db_id);
+ tuple_set_d64(t, 7, es->offset);
+ tuple_set_d64(t, 8, es->sample->ip);
+ tuple_set_d64(t, 9, es->sample->time);
tuple_set_s32(t, 10, es->sample->cpu);
- tuple_set_u64(t, 11, es->addr_dso_db_id);
- tuple_set_u64(t, 12, es->addr_sym_db_id);
- tuple_set_u64(t, 13, es->addr_offset);
- tuple_set_u64(t, 14, es->sample->addr);
- tuple_set_u64(t, 15, es->sample->period);
- tuple_set_u64(t, 16, es->sample->weight);
- tuple_set_u64(t, 17, es->sample->transaction);
- tuple_set_u64(t, 18, es->sample->data_src);
+ tuple_set_d64(t, 11, es->addr_dso_db_id);
+ tuple_set_d64(t, 12, es->addr_sym_db_id);
+ tuple_set_d64(t, 13, es->addr_offset);
+ tuple_set_d64(t, 14, es->sample->addr);
+ tuple_set_d64(t, 15, es->sample->period);
+ tuple_set_d64(t, 16, es->sample->weight);
+ tuple_set_d64(t, 17, es->sample->transaction);
+ tuple_set_d64(t, 18, es->sample->data_src);
tuple_set_s32(t, 19, es->sample->flags & PERF_BRANCH_MASK);
tuple_set_s32(t, 20, !!(es->sample->flags & PERF_IP_FLAG_IN_TX));
- tuple_set_u64(t, 21, es->call_path_id);
- tuple_set_u64(t, 22, es->sample->insn_cnt);
- tuple_set_u64(t, 23, es->sample->cyc_cnt);
+ tuple_set_d64(t, 21, es->call_path_id);
+ tuple_set_d64(t, 22, es->sample->insn_cnt);
+ tuple_set_d64(t, 23, es->sample->cyc_cnt);
call_object(tables->sample_handler, t, "sample_table");
@@ -1167,8 +1183,8 @@ static void python_export_synth(struct db_export *dbe, struct export_sample *es)
t = tuple_new(3);
- tuple_set_u64(t, 0, es->db_id);
- tuple_set_u64(t, 1, es->evsel->core.attr.config);
+ tuple_set_d64(t, 0, es->db_id);
+ tuple_set_d64(t, 1, es->evsel->core.attr.config);
tuple_set_bytes(t, 2, es->sample->raw_data, es->sample->raw_size);
call_object(tables->synth_handler, t, "synth_data");
@@ -1200,10 +1216,10 @@ static int python_export_call_path(struct db_export *dbe, struct call_path *cp)
t = tuple_new(4);
- tuple_set_u64(t, 0, cp->db_id);
- tuple_set_u64(t, 1, parent_db_id);
- tuple_set_u64(t, 2, sym_db_id);
- tuple_set_u64(t, 3, cp->ip);
+ tuple_set_d64(t, 0, cp->db_id);
+ tuple_set_d64(t, 1, parent_db_id);
+ tuple_set_d64(t, 2, sym_db_id);
+ tuple_set_d64(t, 3, cp->ip);
call_object(tables->call_path_handler, t, "call_path_table");
@@ -1221,20 +1237,20 @@ static int python_export_call_return(struct db_export *dbe,
t = tuple_new(14);
- tuple_set_u64(t, 0, cr->db_id);
- tuple_set_u64(t, 1, cr->thread->db_id);
- tuple_set_u64(t, 2, comm_db_id);
- tuple_set_u64(t, 3, cr->cp->db_id);
- tuple_set_u64(t, 4, cr->call_time);
- tuple_set_u64(t, 5, cr->return_time);
- tuple_set_u64(t, 6, cr->branch_count);
- tuple_set_u64(t, 7, cr->call_ref);
- tuple_set_u64(t, 8, cr->return_ref);
- tuple_set_u64(t, 9, cr->cp->parent->db_id);
+ tuple_set_d64(t, 0, cr->db_id);
+ tuple_set_d64(t, 1, cr->thread->db_id);
+ tuple_set_d64(t, 2, comm_db_id);
+ tuple_set_d64(t, 3, cr->cp->db_id);
+ tuple_set_d64(t, 4, cr->call_time);
+ tuple_set_d64(t, 5, cr->return_time);
+ tuple_set_d64(t, 6, cr->branch_count);
+ tuple_set_d64(t, 7, cr->call_ref);
+ tuple_set_d64(t, 8, cr->return_ref);
+ tuple_set_d64(t, 9, cr->cp->parent->db_id);
tuple_set_s32(t, 10, cr->flags);
- tuple_set_u64(t, 11, cr->parent_db_id);
- tuple_set_u64(t, 12, cr->insn_count);
- tuple_set_u64(t, 13, cr->cyc_count);
+ tuple_set_d64(t, 11, cr->parent_db_id);
+ tuple_set_d64(t, 12, cr->insn_count);
+ tuple_set_d64(t, 13, cr->cyc_count);
call_object(tables->call_return_handler, t, "call_return_table");
@@ -1254,14 +1270,14 @@ static int python_export_context_switch(struct db_export *dbe, u64 db_id,
t = tuple_new(9);
- tuple_set_u64(t, 0, db_id);
- tuple_set_u64(t, 1, machine->db_id);
- tuple_set_u64(t, 2, sample->time);
+ tuple_set_d64(t, 0, db_id);
+ tuple_set_d64(t, 1, machine->db_id);
+ tuple_set_d64(t, 2, sample->time);
tuple_set_s32(t, 3, sample->cpu);
- tuple_set_u64(t, 4, th_out_id);
- tuple_set_u64(t, 5, comm_out_id);
- tuple_set_u64(t, 6, th_in_id);
- tuple_set_u64(t, 7, comm_in_id);
+ tuple_set_d64(t, 4, th_out_id);
+ tuple_set_d64(t, 5, comm_out_id);
+ tuple_set_d64(t, 6, th_in_id);
+ tuple_set_d64(t, 7, comm_in_id);
tuple_set_s32(t, 8, flags);
call_object(tables->context_switch_handler, t, "context_switch");
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 02/10] perf scripting python: Factor out set_sym_in_dict()
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
2021-05-25 9:51 ` [PATCH 01/10] perf scripting python: Fix tuple_set_u64() Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 9:51 ` [PATCH 03/10] perf scripting python: Add 'addr_location' for 'addr' Adrian Hunter
` (8 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
Factor out set_sym_in_dict() so it can be reused.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
.../scripting-engines/trace-event-python.c | 25 +++++++++++++------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 1d718ac5f574..4c067601595c 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -726,6 +726,22 @@ static void set_regs_in_dict(PyObject *dict,
_PyUnicode_FromString(bf));
}
+static void set_sym_in_dict(PyObject *dict, struct addr_location *al,
+ const char *dso_field, const char *sym_field,
+ const char *symoff_field)
+{
+ if (al->map) {
+ pydict_set_item_string_decref(dict, dso_field,
+ _PyUnicode_FromString(al->map->dso->name));
+ }
+ if (al->sym) {
+ pydict_set_item_string_decref(dict, sym_field,
+ _PyUnicode_FromString(al->sym->name));
+ pydict_set_item_string_decref(dict, symoff_field,
+ PyLong_FromUnsignedLong(get_offset(al->sym, al)));
+ }
+}
+
static PyObject *get_perf_sample_dict(struct perf_sample *sample,
struct evsel *evsel,
struct addr_location *al,
@@ -772,14 +788,7 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample,
(const char *)sample->raw_data, sample->raw_size));
pydict_set_item_string_decref(dict, "comm",
_PyUnicode_FromString(thread__comm_str(al->thread)));
- if (al->map) {
- pydict_set_item_string_decref(dict, "dso",
- _PyUnicode_FromString(al->map->dso->name));
- }
- if (al->sym) {
- pydict_set_item_string_decref(dict, "symbol",
- _PyUnicode_FromString(al->sym->name));
- }
+ set_sym_in_dict(dict, al, "dso", "symbol", "symoff");
pydict_set_item_string_decref(dict, "callchain", callchain);
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 03/10] perf scripting python: Add 'addr_location' for 'addr'
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
2021-05-25 9:51 ` [PATCH 01/10] perf scripting python: Fix tuple_set_u64() Adrian Hunter
2021-05-25 9:51 ` [PATCH 02/10] perf scripting python: Factor out set_sym_in_dict() Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 9:51 ` [PATCH 04/10] perf script: Factor out perf_sample__sprintf_flags() Adrian Hunter
` (7 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
If sample addr correlates to a symbol, add "addr_dso", "addr_symbol", and
"addr_symoff" to python scripting.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/builtin-script.c | 15 ++++++++---
tools/perf/util/db-export.c | 12 +++------
tools/perf/util/db-export.h | 2 +-
.../util/scripting-engines/trace-event-perl.c | 3 ++-
.../scripting-engines/trace-event-python.c | 26 +++++++++++++------
tools/perf/util/trace-event-scripting.c | 3 ++-
tools/perf/util/trace-event.h | 3 ++-
7 files changed, 41 insertions(+), 23 deletions(-)
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 2a062466c69f..f502d1c8a353 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -2189,10 +2189,19 @@ static int process_sample_event(struct perf_tool *tool,
if (filter_cpu(sample))
goto out_put;
- if (scripting_ops)
- scripting_ops->process_event(event, sample, evsel, &al);
- else
+ if (scripting_ops) {
+ struct addr_location *addr_al_ptr = NULL;
+ struct addr_location addr_al;
+
+ if ((evsel->core.attr.sample_type & PERF_SAMPLE_ADDR) &&
+ sample_addr_correlates_sym(&evsel->core.attr)) {
+ thread__resolve(al.thread, &addr_al, sample);
+ addr_al_ptr = &addr_al;
+ }
+ scripting_ops->process_event(event, sample, evsel, &al, addr_al_ptr);
+ } else {
process_event(scr, sample, evsel, &al, machine);
+ }
out_put:
addr_location__put(&al);
diff --git a/tools/perf/util/db-export.c b/tools/perf/util/db-export.c
index 5cd189172525..e0d4f08839fb 100644
--- a/tools/perf/util/db-export.c
+++ b/tools/perf/util/db-export.c
@@ -343,7 +343,7 @@ static int db_export__threads(struct db_export *dbe, struct thread *thread,
int db_export__sample(struct db_export *dbe, union perf_event *event,
struct perf_sample *sample, struct evsel *evsel,
- struct addr_location *al)
+ struct addr_location *al, struct addr_location *addr_al)
{
struct thread *thread = al->thread;
struct export_sample es = {
@@ -389,18 +389,14 @@ int db_export__sample(struct db_export *dbe, union perf_event *event,
}
}
- if ((evsel->core.attr.sample_type & PERF_SAMPLE_ADDR) &&
- sample_addr_correlates_sym(&evsel->core.attr)) {
- struct addr_location addr_al;
-
- thread__resolve(thread, &addr_al, sample);
- err = db_ids_from_al(dbe, &addr_al, &es.addr_dso_db_id,
+ if (addr_al) {
+ err = db_ids_from_al(dbe, addr_al, &es.addr_dso_db_id,
&es.addr_sym_db_id, &es.addr_offset);
if (err)
goto out_put;
if (dbe->crp) {
err = thread_stack__process(thread, comm, sample, al,
- &addr_al, es.db_id,
+ addr_al, es.db_id,
dbe->crp);
if (err)
goto out_put;
diff --git a/tools/perf/util/db-export.h b/tools/perf/util/db-export.h
index 9c3d38f5a40d..23983cb35706 100644
--- a/tools/perf/util/db-export.h
+++ b/tools/perf/util/db-export.h
@@ -97,7 +97,7 @@ int db_export__branch_type(struct db_export *dbe, u32 branch_type,
const char *name);
int db_export__sample(struct db_export *dbe, union perf_event *event,
struct perf_sample *sample, struct evsel *evsel,
- struct addr_location *al);
+ struct addr_location *al, struct addr_location *addr_al);
int db_export__branch_types(struct db_export *dbe);
diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
index 865d310968fb..a837aee24674 100644
--- a/tools/perf/util/scripting-engines/trace-event-perl.c
+++ b/tools/perf/util/scripting-engines/trace-event-perl.c
@@ -456,7 +456,8 @@ static void perl_process_event_generic(union perf_event *event,
static void perl_process_event(union perf_event *event,
struct perf_sample *sample,
struct evsel *evsel,
- struct addr_location *al)
+ struct addr_location *al,
+ struct addr_location *addr_al __maybe_unused)
{
perl_process_tracepoint(sample, evsel, al);
perl_process_event_generic(event, sample, evsel);
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 4c067601595c..a434f4bc25a4 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -745,6 +745,7 @@ static void set_sym_in_dict(PyObject *dict, struct addr_location *al,
static PyObject *get_perf_sample_dict(struct perf_sample *sample,
struct evsel *evsel,
struct addr_location *al,
+ struct addr_location *addr_al,
PyObject *callchain)
{
PyObject *dict, *dict_sample, *brstack, *brstacksym;
@@ -798,6 +799,12 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample,
brstacksym = python_process_brstacksym(sample, al->thread);
pydict_set_item_string_decref(dict, "brstacksym", brstacksym);
+ if (addr_al) {
+ pydict_set_item_string_decref(dict_sample, "addr_correlates_sym",
+ PyBool_FromLong(1));
+ set_sym_in_dict(dict_sample, addr_al, "addr_dso", "addr_symbol", "addr_symoff");
+ }
+
set_regs_in_dict(dict, sample, evsel);
return dict;
@@ -805,7 +812,8 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample,
static void python_process_tracepoint(struct perf_sample *sample,
struct evsel *evsel,
- struct addr_location *al)
+ struct addr_location *al,
+ struct addr_location *addr_al)
{
struct tep_event *event = evsel->tp_format;
PyObject *handler, *context, *t, *obj = NULL, *callchain;
@@ -915,7 +923,7 @@ static void python_process_tracepoint(struct perf_sample *sample,
PyTuple_SetItem(t, n++, dict);
if (get_argument_count(handler) == (int) n + 1) {
- all_entries_dict = get_perf_sample_dict(sample, evsel, al,
+ all_entries_dict = get_perf_sample_dict(sample, evsel, al, addr_al,
callchain);
PyTuple_SetItem(t, n++, all_entries_dict);
} else {
@@ -1306,7 +1314,8 @@ static int python_process_call_return(struct call_return *cr, u64 *parent_db_id,
static void python_process_general_event(struct perf_sample *sample,
struct evsel *evsel,
- struct addr_location *al)
+ struct addr_location *al,
+ struct addr_location *addr_al)
{
PyObject *handler, *t, *dict, *callchain;
static char handler_name[64];
@@ -1328,7 +1337,7 @@ static void python_process_general_event(struct perf_sample *sample,
/* ip unwinding */
callchain = python_process_callchain(sample, evsel, al);
- dict = get_perf_sample_dict(sample, evsel, al, callchain);
+ dict = get_perf_sample_dict(sample, evsel, al, addr_al, callchain);
PyTuple_SetItem(t, n++, dict);
if (_PyTuple_Resize(&t, n) == -1)
@@ -1342,20 +1351,21 @@ static void python_process_general_event(struct perf_sample *sample,
static void python_process_event(union perf_event *event,
struct perf_sample *sample,
struct evsel *evsel,
- struct addr_location *al)
+ struct addr_location *al,
+ struct addr_location *addr_al)
{
struct tables *tables = &tables_global;
switch (evsel->core.attr.type) {
case PERF_TYPE_TRACEPOINT:
- python_process_tracepoint(sample, evsel, al);
+ python_process_tracepoint(sample, evsel, al, addr_al);
break;
/* Reserve for future process_hw/sw/raw APIs */
default:
if (tables->db_export_mode)
- db_export__sample(&tables->dbe, event, sample, evsel, al);
+ db_export__sample(&tables->dbe, event, sample, evsel, al, addr_al);
else
- python_process_general_event(sample, evsel, al);
+ python_process_general_event(sample, evsel, al, addr_al);
}
}
diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
index 721f38c0d5cf..a60885fa5c0f 100644
--- a/tools/perf/util/trace-event-scripting.c
+++ b/tools/perf/util/trace-event-scripting.c
@@ -29,7 +29,8 @@ static int stop_script_unsupported(void)
static void process_event_unsupported(union perf_event *event __maybe_unused,
struct perf_sample *sample __maybe_unused,
struct evsel *evsel __maybe_unused,
- struct addr_location *al __maybe_unused)
+ struct addr_location *al __maybe_unused,
+ struct addr_location *addr_al __maybe_unused)
{
}
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 39fb39ed6612..24694463c0be 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -78,7 +78,8 @@ struct scripting_ops {
void (*process_event) (union perf_event *event,
struct perf_sample *sample,
struct evsel *evsel,
- struct addr_location *al);
+ struct addr_location *al,
+ struct addr_location *addr_al);
void (*process_switch)(union perf_event *event,
struct perf_sample *sample,
struct machine *machine);
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 04/10] perf script: Factor out perf_sample__sprintf_flags()
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
` (2 preceding siblings ...)
2021-05-25 9:51 ` [PATCH 03/10] perf scripting python: Add 'addr_location' for 'addr' Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 9:51 ` [PATCH 05/10] perf scripting python: Add sample flags Adrian Hunter
` (6 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
Factor out perf_sample__sprintf_flags() so it can be reused.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/builtin-script.c | 28 ++++++++++++++++++----------
tools/perf/util/trace-event.h | 3 +++
2 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index f502d1c8a353..69bce65ea430 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -1553,41 +1553,49 @@ static const char *sample_flags_to_name(u32 flags)
return NULL;
}
-static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
+int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz)
{
const char *chars = PERF_IP_FLAG_CHARS;
- const int n = strlen(PERF_IP_FLAG_CHARS);
+ const size_t n = strlen(PERF_IP_FLAG_CHARS);
bool in_tx = flags & PERF_IP_FLAG_IN_TX;
const char *name = NULL;
- char str[33];
- int i, pos = 0;
+ size_t i, pos = 0;
name = sample_flags_to_name(flags & ~PERF_IP_FLAG_IN_TX);
if (name)
- return fprintf(fp, " %-15s%4s ", name, in_tx ? "(x)" : "");
+ return snprintf(str, sz, "%-15s%4s", name, in_tx ? "(x)" : "");
if (flags & PERF_IP_FLAG_TRACE_BEGIN) {
name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_BEGIN));
if (name)
- return fprintf(fp, " tr strt %-7s%4s ", name, in_tx ? "(x)" : "");
+ return snprintf(str, sz, "tr strt %-7s%4s", name, in_tx ? "(x)" : "");
}
if (flags & PERF_IP_FLAG_TRACE_END) {
name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_END));
if (name)
- return fprintf(fp, " tr end %-7s%4s ", name, in_tx ? "(x)" : "");
+ return snprintf(str, sz, "tr end %-7s%4s", name, in_tx ? "(x)" : "");
}
for (i = 0; i < n; i++, flags >>= 1) {
- if (flags & 1)
+ if ((flags & 1) && pos < sz)
str[pos++] = chars[i];
}
for (; i < 32; i++, flags >>= 1) {
- if (flags & 1)
+ if ((flags & 1) && pos < sz)
str[pos++] = '?';
}
- str[pos] = 0;
+ if (pos < sz)
+ str[pos] = 0;
+
+ return pos;
+}
+
+static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
+{
+ char str[SAMPLE_FLAGS_BUF_SIZE];
+ perf_sample__sprintf_flags(flags, str, sizeof(str));
return fprintf(fp, " %-19s ", str);
}
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 24694463c0be..7276674e2971 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -105,4 +105,7 @@ int common_pc(struct scripting_context *context);
int common_flags(struct scripting_context *context);
int common_lock_depth(struct scripting_context *context);
+#define SAMPLE_FLAGS_BUF_SIZE 64
+int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz);
+
#endif /* _PERF_UTIL_TRACE_EVENT_H */
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 05/10] perf scripting python: Add sample flags
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
` (3 preceding siblings ...)
2021-05-25 9:51 ` [PATCH 04/10] perf script: Factor out perf_sample__sprintf_flags() Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 9:51 ` [PATCH 06/10] perf scripting python: Add IPC Adrian Hunter
` (5 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
Add sample flags to python scripting.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
.../scripting-engines/trace-event-python.c | 26 +++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index a434f4bc25a4..5d01e4fc50b8 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -742,6 +742,29 @@ static void set_sym_in_dict(PyObject *dict, struct addr_location *al,
}
}
+static void set_sample_flags(PyObject *dict, u32 flags)
+{
+ const char *ch = PERF_IP_FLAG_CHARS;
+ char *p, str[33];
+
+ for (p = str; *ch; ch++, flags >>= 1) {
+ if (flags & 1)
+ *p++ = *ch;
+ }
+ *p = 0;
+ pydict_set_item_string_decref(dict, "flags", _PyUnicode_FromString(str));
+}
+
+static void python_process_sample_flags(struct perf_sample *sample, PyObject *dict_sample)
+{
+ char flags_disp[SAMPLE_FLAGS_BUF_SIZE];
+
+ set_sample_flags(dict_sample, sample->flags);
+ perf_sample__sprintf_flags(sample->flags, flags_disp, sizeof(flags_disp));
+ pydict_set_item_string_decref(dict_sample, "flags_disp",
+ _PyUnicode_FromString(flags_disp));
+}
+
static PyObject *get_perf_sample_dict(struct perf_sample *sample,
struct evsel *evsel,
struct addr_location *al,
@@ -805,6 +828,9 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample,
set_sym_in_dict(dict_sample, addr_al, "addr_dso", "addr_symbol", "addr_symoff");
}
+ if (sample->flags)
+ python_process_sample_flags(sample, dict_sample);
+
set_regs_in_dict(dict, sample, evsel);
return dict;
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 06/10] perf scripting python: Add IPC
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
` (4 preceding siblings ...)
2021-05-25 9:51 ` [PATCH 05/10] perf scripting python: Add sample flags Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 9:51 ` [PATCH 07/10] perf scripting python: Add cpumode Adrian Hunter
` (4 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
Add IPC to python scripting.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/util/scripting-engines/trace-event-python.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 5d01e4fc50b8..fccd1b415ea0 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -831,6 +831,14 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample,
if (sample->flags)
python_process_sample_flags(sample, dict_sample);
+ /* Instructions per cycle (IPC) */
+ if (sample->insn_cnt && sample->cyc_cnt) {
+ pydict_set_item_string_decref(dict_sample, "insn_cnt",
+ PyLong_FromUnsignedLongLong(sample->insn_cnt));
+ pydict_set_item_string_decref(dict_sample, "cyc_cnt",
+ PyLong_FromUnsignedLongLong(sample->cyc_cnt));
+ }
+
set_regs_in_dict(dict, sample, evsel);
return dict;
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 07/10] perf scripting python: Add cpumode
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
` (5 preceding siblings ...)
2021-05-25 9:51 ` [PATCH 06/10] perf scripting python: Add IPC Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 9:51 ` [PATCH 08/10] perf scripting python: Add context switch Adrian Hunter
` (3 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
Add cpumode to python scripting.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/util/scripting-engines/trace-event-python.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index fccd1b415ea0..cb708669e02e 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -822,6 +822,9 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample,
brstacksym = python_process_brstacksym(sample, al->thread);
pydict_set_item_string_decref(dict, "brstacksym", brstacksym);
+ pydict_set_item_string_decref(dict_sample, "cpumode",
+ _PyLong_FromLong((unsigned long)sample->cpumode));
+
if (addr_al) {
pydict_set_item_string_decref(dict_sample, "addr_correlates_sym",
PyBool_FromLong(1));
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 08/10] perf scripting python: Add context switch
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
` (6 preceding siblings ...)
2021-05-25 9:51 ` [PATCH 07/10] perf scripting python: Add cpumode Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 9:51 ` [PATCH 09/10] perf scripting python: Add auxtrace error Adrian Hunter
` (2 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
Add context_switch to general python scripting.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
.../scripting-engines/trace-event-python.c | 45 +++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index cb708669e02e..c422901d5344 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -1019,6 +1019,11 @@ static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
}
+static int tuple_set_bool(PyObject *t, unsigned int pos, bool val)
+{
+ return PyTuple_SetItem(t, pos, PyBool_FromLong(val));
+}
+
static int tuple_set_string(PyObject *t, unsigned int pos, const char *s)
{
return PyTuple_SetItem(t, pos, _PyUnicode_FromString(s));
@@ -1406,6 +1411,44 @@ static void python_process_event(union perf_event *event,
}
}
+static void python_do_process_switch(union perf_event *event,
+ struct perf_sample *sample,
+ struct machine *machine)
+{
+ const char *handler_name = "context_switch";
+ bool out = event->header.misc & PERF_RECORD_MISC_SWITCH_OUT;
+ bool out_preempt = out && (event->header.misc & PERF_RECORD_MISC_SWITCH_OUT_PREEMPT);
+ pid_t np_pid = -1, np_tid = -1;
+ PyObject *handler, *t;
+
+ handler = get_handler(handler_name);
+ if (!handler)
+ return;
+
+ if (event->header.type == PERF_RECORD_SWITCH_CPU_WIDE) {
+ np_pid = event->context_switch.next_prev_pid;
+ np_tid = event->context_switch.next_prev_tid;
+ }
+
+ t = tuple_new(9);
+ if (!t)
+ return;
+
+ tuple_set_u64(t, 0, sample->time);
+ tuple_set_s32(t, 1, sample->cpu);
+ tuple_set_s32(t, 2, sample->pid);
+ tuple_set_s32(t, 3, sample->tid);
+ tuple_set_s32(t, 4, np_pid);
+ tuple_set_s32(t, 5, np_tid);
+ tuple_set_s32(t, 6, machine->pid);
+ tuple_set_bool(t, 7, out);
+ tuple_set_bool(t, 8, out_preempt);
+
+ call_object(handler, t, handler_name);
+
+ Py_DECREF(t);
+}
+
static void python_process_switch(union perf_event *event,
struct perf_sample *sample,
struct machine *machine)
@@ -1414,6 +1457,8 @@ static void python_process_switch(union perf_event *event,
if (tables->db_export_mode)
db_export__switch(&tables->dbe, event, sample, machine);
+ else
+ python_do_process_switch(event, sample, machine);
}
static void get_handler_name(char *str, size_t size,
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 09/10] perf scripting python: Add auxtrace error
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
` (7 preceding siblings ...)
2021-05-25 9:51 ` [PATCH 08/10] perf scripting python: Add context switch Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 13:03 ` Arnaldo Carvalho de Melo
2021-05-25 9:51 ` [PATCH 10/10] perf scripts python: intel-pt-events.py: Add branches to script Adrian Hunter
2021-05-25 12:58 ` [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Arnaldo Carvalho de Melo
10 siblings, 1 reply; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
Add auxtrace_error to general python scripting.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/builtin-script.c | 13 ++++++
.../scripting-engines/trace-event-python.c | 42 +++++++++++++++++++
tools/perf/util/trace-event.h | 2 +
3 files changed, 57 insertions(+)
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 69bce65ea430..7a7a19f52db5 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -2432,6 +2432,17 @@ static int process_switch_event(struct perf_tool *tool,
sample->tid);
}
+static int process_auxtrace_error(struct perf_session *session,
+ union perf_event *event)
+{
+ if (scripting_ops && scripting_ops->process_auxtrace_error) {
+ scripting_ops->process_auxtrace_error(session, event);
+ return 0;
+ }
+
+ return perf_event__process_auxtrace_error(session, event);
+}
+
static int
process_lost_event(struct perf_tool *tool,
union perf_event *event,
@@ -2571,6 +2582,8 @@ static int __cmd_script(struct perf_script *script)
}
if (script->show_switch_events || (scripting_ops && scripting_ops->process_switch))
script->tool.context_switch = process_switch_event;
+ if (scripting_ops && scripting_ops->process_auxtrace_error)
+ script->tool.auxtrace_error = process_auxtrace_error;
if (script->show_namespace_events)
script->tool.namespaces = process_namespaces_event;
if (script->show_cgroup_events)
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index c422901d5344..ffc5f4cffdba 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -1014,6 +1014,11 @@ static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
#endif
}
+static int tuple_set_u32(PyObject *t, unsigned int pos, u32 val)
+{
+ return PyTuple_SetItem(t, pos, PyLong_FromUnsignedLong(val));
+}
+
static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
{
return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
@@ -1461,6 +1466,42 @@ static void python_process_switch(union perf_event *event,
python_do_process_switch(event, sample, machine);
}
+static void python_process_auxtrace_error(struct perf_session *session __maybe_unused,
+ union perf_event *event)
+{
+ struct perf_record_auxtrace_error *e = &event->auxtrace_error;
+ u8 cpumode = e->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
+ const char *handler_name = "auxtrace_error";
+ unsigned long long tm = e->time;
+ const char *msg = e->msg;
+ PyObject *handler, *t;
+
+ handler = get_handler(handler_name);
+ if (!handler)
+ return;
+
+ if (!e->fmt) {
+ tm = 0;
+ msg = (const char *)&e->time;
+ }
+
+ t = tuple_new(9);
+
+ tuple_set_u32(t, 0, e->type);
+ tuple_set_u32(t, 1, e->code);
+ tuple_set_s32(t, 2, e->cpu);
+ tuple_set_s32(t, 3, e->pid);
+ tuple_set_s32(t, 4, e->tid);
+ tuple_set_u64(t, 5, e->ip);
+ tuple_set_u64(t, 6, tm);
+ tuple_set_string(t, 7, msg);
+ tuple_set_u32(t, 8, cpumode);
+
+ call_object(handler, t, handler_name);
+
+ Py_DECREF(t);
+}
+
static void get_handler_name(char *str, size_t size,
struct evsel *evsel)
{
@@ -1999,6 +2040,7 @@ struct scripting_ops python_scripting_ops = {
.stop_script = python_stop_script,
.process_event = python_process_event,
.process_switch = python_process_switch,
+ .process_auxtrace_error = python_process_auxtrace_error,
.process_stat = python_process_stat,
.process_stat_interval = python_process_stat_interval,
.generate_script = python_generate_script,
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 7276674e2971..35c354a15c3a 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -83,6 +83,8 @@ struct scripting_ops {
void (*process_switch)(union perf_event *event,
struct perf_sample *sample,
struct machine *machine);
+ void (*process_auxtrace_error)(struct perf_session *session,
+ union perf_event *event);
void (*process_stat)(struct perf_stat_config *config,
struct evsel *evsel, u64 tstamp);
void (*process_stat_interval)(u64 tstamp);
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 10/10] perf scripts python: intel-pt-events.py: Add branches to script
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
` (8 preceding siblings ...)
2021-05-25 9:51 ` [PATCH 09/10] perf scripting python: Add auxtrace error Adrian Hunter
@ 2021-05-25 9:51 ` Adrian Hunter
2021-05-25 12:58 ` [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Arnaldo Carvalho de Melo
10 siblings, 0 replies; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 9:51 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Andi Kleen; +Cc: linux-kernel
As an example, add branch information to intel-pt-events.py script.
This shows how a simple python script can be used to customize
perf script output for Intel PT branch traces or power event traces.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
.../scripts/python/bin/intel-pt-events-record | 4 +-
.../scripts/python/bin/intel-pt-events-report | 4 +-
tools/perf/scripts/python/intel-pt-events.py | 143 ++++++++++++++----
3 files changed, 116 insertions(+), 35 deletions(-)
diff --git a/tools/perf/scripts/python/bin/intel-pt-events-record b/tools/perf/scripts/python/bin/intel-pt-events-record
index 10fe2b6977d4..6b9877cfe23e 100644
--- a/tools/perf/scripts/python/bin/intel-pt-events-record
+++ b/tools/perf/scripts/python/bin/intel-pt-events-record
@@ -1,8 +1,8 @@
#!/bin/bash
#
-# print Intel PT Power Events and PTWRITE. The intel_pt PMU event needs
-# to be specified with appropriate config terms.
+# print Intel PT Events including Power Events and PTWRITE. The intel_pt PMU
+# event needs to be specified with appropriate config terms.
#
if ! echo "$@" | grep -q intel_pt ; then
echo "Options must include the Intel PT event e.g. -e intel_pt/pwr_evt,ptw/"
diff --git a/tools/perf/scripts/python/bin/intel-pt-events-report b/tools/perf/scripts/python/bin/intel-pt-events-report
index 9a9c92fcd026..beeac3fde9db 100644
--- a/tools/perf/scripts/python/bin/intel-pt-events-report
+++ b/tools/perf/scripts/python/bin/intel-pt-events-report
@@ -1,3 +1,3 @@
#!/bin/bash
-# description: print Intel PT Power Events and PTWRITE
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/intel-pt-events.py
\ No newline at end of file
+# description: print Intel PT Events including Power Events and PTWRITE
+perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/intel-pt-events.py
diff --git a/tools/perf/scripts/python/intel-pt-events.py b/tools/perf/scripts/python/intel-pt-events.py
index a73847c8f548..fcfae1de731b 100644
--- a/tools/perf/scripts/python/intel-pt-events.py
+++ b/tools/perf/scripts/python/intel-pt-events.py
@@ -1,5 +1,6 @@
-# intel-pt-events.py: Print Intel PT Power Events and PTWRITE
-# Copyright (c) 2017, Intel Corporation.
+# SPDX-License-Identifier: GPL-2.0
+# intel-pt-events.py: Print Intel PT Events including Power Events and PTWRITE
+# Copyright (c) 2017-2021, Intel Corporation.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
@@ -23,8 +24,36 @@ sys.path.append(os.environ['PERF_EXEC_PATH'] + \
#from perf_trace_context import *
#from Core import *
+try:
+ broken_pipe_exception = BrokenPipeError
+except:
+ broken_pipe_exception = IOError
+
+glb_switch_str = None
+glb_switch_printed = True
+
+def get_optional_null(perf_dict, field):
+ if field in perf_dict:
+ return perf_dict[field]
+ return ""
+
+def get_optional_zero(perf_dict, field):
+ if field in perf_dict:
+ return perf_dict[field]
+ return 0
+
+def get_optional(perf_dict, field):
+ if field in perf_dict:
+ return perf_dict[field]
+ return "[unknown]"
+
+def get_offset(perf_dict, field):
+ if field in perf_dict:
+ return "+%#x" % perf_dict[field]
+ return ""
+
def trace_begin():
- print("Intel PT Power Events and PTWRITE")
+ print("Intel PT Branch Trace, Power Events and PTWRITE")
def trace_end():
print("End")
@@ -77,58 +106,110 @@ def print_pwrx(raw_buf):
print("deepest cstate: %u last cstate: %u wake reason: %#x" %
(deepest_cstate, last_cstate, wake_reason), end=' ')
+def print_psb(raw_buf):
+ data = struct.unpack_from("<IQ", raw_buf)
+ offset = data[1]
+ print("offset: %#x" % (offset), end=' ')
+
def print_common_start(comm, sample, name):
ts = sample["time"]
cpu = sample["cpu"]
pid = sample["pid"]
tid = sample["tid"]
- print("%16s %5u/%-5u [%03u] %9u.%09u %7s:" %
- (comm, pid, tid, cpu, ts / 1000000000, ts %1000000000, name),
+ flags_disp = get_optional_null(sample, "flags_disp")
+ # Unused fields:
+ # period = sample["period"]
+ # phys_addr = sample["phys_addr"]
+ # weight = sample["weight"]
+ # transaction = sample["transaction"]
+ # cpumode = get_optional_zero(sample, "cpumode")
+ print("%16s %5u/%-5u [%03u] %9u.%09u %7s %19s" %
+ (comm, pid, tid, cpu, ts / 1000000000, ts %1000000000, name, flags_disp),
end=' ')
-def print_common_ip(sample, symbol, dso):
- ip = sample["ip"]
- print("%16x %s (%s)" % (ip, symbol, dso))
+def print_common_ip(param_dict, sample, symbol, dso):
+ ip = sample["ip"]
+ offs = get_offset(param_dict, "symoff")
+ print("%16x %s%s (%s)" % (ip, symbol, offs, dso), end=' ')
+ if "addr_correlates_sym" in sample:
+ addr = sample["addr"]
+ dso = get_optional(sample, "addr_dso")
+ symbol = get_optional(sample, "addr_symbol")
+ offs = get_offset(sample, "addr_symoff")
+ print("=> %x %s%s (%s)" % (addr, symbol, offs, dso))
+ else:
+ print()
-def process_event(param_dict):
+def do_process_event(param_dict):
+ global glb_switch_printed
+ if not glb_switch_printed:
+ print(glb_switch_str)
+ glb_switch_printed = True
event_attr = param_dict["attr"]
- sample = param_dict["sample"]
- raw_buf = param_dict["raw_buf"]
+ sample = param_dict["sample"]
+ raw_buf = param_dict["raw_buf"]
comm = param_dict["comm"]
name = param_dict["ev_name"]
+ # Unused fields:
+ # callchain = param_dict["callchain"]
+ # brstack = param_dict["brstack"]
+ # brstacksym = param_dict["brstacksym"]
# Symbol and dso info are not always resolved
- if "dso" in param_dict:
- dso = param_dict["dso"]
- else:
- dso = "[unknown]"
+ dso = get_optional(param_dict, "dso")
+ symbol = get_optional(param_dict, "symbol")
- if "symbol" in param_dict:
- symbol = param_dict["symbol"]
- else:
- symbol = "[unknown]"
+ print_common_start(comm, sample, name)
if name == "ptwrite":
- print_common_start(comm, sample, name)
print_ptwrite(raw_buf)
- print_common_ip(sample, symbol, dso)
elif name == "cbr":
- print_common_start(comm, sample, name)
print_cbr(raw_buf)
- print_common_ip(sample, symbol, dso)
elif name == "mwait":
- print_common_start(comm, sample, name)
print_mwait(raw_buf)
- print_common_ip(sample, symbol, dso)
elif name == "pwre":
- print_common_start(comm, sample, name)
print_pwre(raw_buf)
- print_common_ip(sample, symbol, dso)
elif name == "exstop":
- print_common_start(comm, sample, name)
print_exstop(raw_buf)
- print_common_ip(sample, symbol, dso)
elif name == "pwrx":
- print_common_start(comm, sample, name)
print_pwrx(raw_buf)
- print_common_ip(sample, symbol, dso)
+ elif name == "psb":
+ print_psb(raw_buf)
+
+ print_common_ip(param_dict, sample, symbol, dso)
+
+def process_event(param_dict):
+ try:
+ do_process_event(param_dict)
+ except broken_pipe_exception:
+ # Stop python printing broken pipe errors and traceback
+ sys.stdout = open(os.devnull, 'w')
+ sys.exit(1)
+
+def auxtrace_error(typ, code, cpu, pid, tid, ip, ts, msg, cpumode, *x):
+ try:
+ print("%16s %5u/%-5u [%03u] %9u.%09u error type %u code %u: %s ip 0x%16x" %
+ ("Trace error", pid, tid, cpu, ts / 1000000000, ts %1000000000, typ, code, msg, ip))
+ except broken_pipe_exception:
+ # Stop python printing broken pipe errors and traceback
+ sys.stdout = open(os.devnull, 'w')
+ sys.exit(1)
+
+def context_switch(ts, cpu, pid, tid, np_pid, np_tid, machine_pid, out, out_preempt, *x):
+ global glb_switch_printed
+ global glb_switch_str
+ if out:
+ out_str = "Switch out "
+ else:
+ out_str = "Switch In "
+ if out_preempt:
+ preempt_str = "preempt"
+ else:
+ preempt_str = ""
+ if machine_pid == -1:
+ machine_str = ""
+ else:
+ machine_str = "machine PID %d" % machine_pid
+ glb_switch_str = "%16s %5d/%-5d [%03u] %9u.%09u %5d/%-5d %s %s" % \
+ (out_str, pid, tid, cpu, ts / 1000000000, ts %1000000000, np_pid, np_tid, machine_str, preempt_str)
+ glb_switch_printed = False
--
2.17.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
` (9 preceding siblings ...)
2021-05-25 9:51 ` [PATCH 10/10] perf scripts python: intel-pt-events.py: Add branches to script Adrian Hunter
@ 2021-05-25 12:58 ` Arnaldo Carvalho de Melo
10 siblings, 0 replies; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2021-05-25 12:58 UTC (permalink / raw)
To: Adrian Hunter; +Cc: Jiri Olsa, Andi Kleen, linux-kernel
Em Tue, May 25, 2021 at 12:51:02PM +0300, Adrian Hunter escreveu:
> Hi
>
> These patches make it easier to customize scripting for Intel PT traces.
>
> The first patch is a dependent fix.
>
> Subsequent patches add more information to python scripting.
>
> The final patch adds a branch trace to the intel-pt-events.py script
> which previously supported only power events and ptwrite.
Thanks, applied.
- Arnaldo
>
> Adrian Hunter (10):
> perf scripting python: Fix tuple_set_u64()
> perf scripting python: Factor out set_sym_in_dict()
> perf scripting python: Add 'addr_location' for 'addr'
> perf script: Factor out perf_sample__sprintf_flags()
> perf scripting python: Add sample flags
> perf scripting python: Add IPC
> perf scripting python: Add cpumode
> perf scripting python: Add context switch
> perf scripting python: Add auxtrace error
> perf scripts python: intel-pt-events.py: Add branches to script
>
> tools/perf/builtin-script.c | 56 +++-
> .../perf/scripts/python/bin/intel-pt-events-record | 4 +-
> .../perf/scripts/python/bin/intel-pt-events-report | 4 +-
> tools/perf/scripts/python/intel-pt-events.py | 143 +++++++--
> tools/perf/util/db-export.c | 12 +-
> tools/perf/util/db-export.h | 2 +-
> .../perf/util/scripting-engines/trace-event-perl.c | 3 +-
> .../util/scripting-engines/trace-event-python.c | 321 +++++++++++++++------
> tools/perf/util/trace-event-scripting.c | 3 +-
> tools/perf/util/trace-event.h | 8 +-
> 10 files changed, 415 insertions(+), 141 deletions(-)
>
>
> Regards
> Adrian
--
- Arnaldo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 09/10] perf scripting python: Add auxtrace error
2021-05-25 9:51 ` [PATCH 09/10] perf scripting python: Add auxtrace error Adrian Hunter
@ 2021-05-25 13:03 ` Arnaldo Carvalho de Melo
2021-05-25 18:30 ` Adrian Hunter
0 siblings, 1 reply; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2021-05-25 13:03 UTC (permalink / raw)
To: Adrian Hunter; +Cc: Jiri Olsa, Andi Kleen, linux-kernel
Em Tue, May 25, 2021 at 12:51:11PM +0300, Adrian Hunter escreveu:
> Add auxtrace_error to general python scripting.
>
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
> ---
> tools/perf/builtin-script.c | 13 ++++++
> .../scripting-engines/trace-event-python.c | 42 +++++++++++++++++++
> tools/perf/util/trace-event.h | 2 +
> 3 files changed, 57 insertions(+)
>
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> index 69bce65ea430..7a7a19f52db5 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -2432,6 +2432,17 @@ static int process_switch_event(struct perf_tool *tool,
> sample->tid);
> }
>
> +static int process_auxtrace_error(struct perf_session *session,
> + union perf_event *event)
> +{
> + if (scripting_ops && scripting_ops->process_auxtrace_error) {
> + scripting_ops->process_auxtrace_error(session, event);
> + return 0;
> + }
> +
> + return perf_event__process_auxtrace_error(session, event);
> +}
> +
Those definitions in auxtrace.h:
e31f0d017ea19fce9 (Adrian Hunter 2015-04-30 17:37:27 +0300 706) #define perf_event__process_auxtrace_info 0
e31f0d017ea19fce9 (Adrian Hunter 2015-04-30 17:37:27 +0300 707) #define perf_event__process_auxtrace 0
e31f0d017ea19fce9 (Adrian Hunter 2015-04-30 17:37:27 +0300 708) #define perf_event__process_auxtrace_error 0
came back to haunt us :-)
I'll try making them the usual inlines, etc
- Arnaldo
make_minimal_O: cd . && make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1 NO_LIBZSTD=1 NO_LIBCAP=1 NO_SYSCALL_TABLE=1 FEATURES_DUMP=/var/home/acme/git/perf/tools/perf/BUILD_TEST_FEATURE_DUMP -j24 O=/tmp/tmp.rGrdpQlTCr DESTDIR=/tmp/tmp.png5u8ITR9
cd . && make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1 NO_LIBZSTD=1 NO_LIBCAP=1 NO_SYSCALL_TABLE=1 FEATURES_DUMP=/var/home/acme/git/perf/tools/perf/BUILD_TEST_FEATURE_DUMP -j24 O=/tmp/tmp.rGrdpQlTCr DESTDIR=/tmp/tmp.png5u8ITR9
BUILD: Doing 'make -j24' parallel build
<SNIP>
CC /tmp/tmp.rGrdpQlTCr/builtin-daemon.o
In file included from util/events_stats.h:8,
from util/evlist.h:12,
from builtin-script.c:18:
builtin-script.c: In function ‘process_auxtrace_error’:
util/auxtrace.h:708:57: error: called object is not a function or function pointer
708 | #define perf_event__process_auxtrace_error 0
| ^
builtin-script.c:2443:16: note: in expansion of macro ‘perf_event__process_auxtrace_error’
2443 | return perf_event__process_auxtrace_error(session, event);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MKDIR /tmp/tmp.rGrdpQlTCr/tests/
MKDIR /tmp/tmp.rGrdpQlTCr/bench/
CC /tmp/tmp.rGrdpQlTCr/tests/builtin-test.o
CC /tmp/tmp.rGrdpQlTCr/bench/sched-messaging.o
builtin-script.c:2444:1: error: control reaches end of non-void function [-Werror=return-type]
2444 | }
| ^
cc1: all warnings being treated as errors
make[5]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/tmp.rGrdpQlTCr/builtin-script.o] Error 1
make[5]: *** Waiting for unfinished jobs....
MKDIR /tmp/tmp.rGrdpQlTCr/tests/
CC /tmp/tmp.rGrdpQlTCr/tests/parse-events.o
MKDIR /tmp/tmp.rGrdpQlTCr/bench/
CC /tmp/tmp.rGrdpQlTCr/bench/sched-pipe.o
> static int
> process_lost_event(struct perf_tool *tool,
> union perf_event *event,
> @@ -2571,6 +2582,8 @@ static int __cmd_script(struct perf_script *script)
> }
> if (script->show_switch_events || (scripting_ops && scripting_ops->process_switch))
> script->tool.context_switch = process_switch_event;
> + if (scripting_ops && scripting_ops->process_auxtrace_error)
> + script->tool.auxtrace_error = process_auxtrace_error;
> if (script->show_namespace_events)
> script->tool.namespaces = process_namespaces_event;
> if (script->show_cgroup_events)
> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> index c422901d5344..ffc5f4cffdba 100644
> --- a/tools/perf/util/scripting-engines/trace-event-python.c
> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> @@ -1014,6 +1014,11 @@ static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
> #endif
> }
>
> +static int tuple_set_u32(PyObject *t, unsigned int pos, u32 val)
> +{
> + return PyTuple_SetItem(t, pos, PyLong_FromUnsignedLong(val));
> +}
> +
> static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
> {
> return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
> @@ -1461,6 +1466,42 @@ static void python_process_switch(union perf_event *event,
> python_do_process_switch(event, sample, machine);
> }
>
> +static void python_process_auxtrace_error(struct perf_session *session __maybe_unused,
> + union perf_event *event)
> +{
> + struct perf_record_auxtrace_error *e = &event->auxtrace_error;
> + u8 cpumode = e->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
> + const char *handler_name = "auxtrace_error";
> + unsigned long long tm = e->time;
> + const char *msg = e->msg;
> + PyObject *handler, *t;
> +
> + handler = get_handler(handler_name);
> + if (!handler)
> + return;
> +
> + if (!e->fmt) {
> + tm = 0;
> + msg = (const char *)&e->time;
> + }
> +
> + t = tuple_new(9);
> +
> + tuple_set_u32(t, 0, e->type);
> + tuple_set_u32(t, 1, e->code);
> + tuple_set_s32(t, 2, e->cpu);
> + tuple_set_s32(t, 3, e->pid);
> + tuple_set_s32(t, 4, e->tid);
> + tuple_set_u64(t, 5, e->ip);
> + tuple_set_u64(t, 6, tm);
> + tuple_set_string(t, 7, msg);
> + tuple_set_u32(t, 8, cpumode);
> +
> + call_object(handler, t, handler_name);
> +
> + Py_DECREF(t);
> +}
> +
> static void get_handler_name(char *str, size_t size,
> struct evsel *evsel)
> {
> @@ -1999,6 +2040,7 @@ struct scripting_ops python_scripting_ops = {
> .stop_script = python_stop_script,
> .process_event = python_process_event,
> .process_switch = python_process_switch,
> + .process_auxtrace_error = python_process_auxtrace_error,
> .process_stat = python_process_stat,
> .process_stat_interval = python_process_stat_interval,
> .generate_script = python_generate_script,
> diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
> index 7276674e2971..35c354a15c3a 100644
> --- a/tools/perf/util/trace-event.h
> +++ b/tools/perf/util/trace-event.h
> @@ -83,6 +83,8 @@ struct scripting_ops {
> void (*process_switch)(union perf_event *event,
> struct perf_sample *sample,
> struct machine *machine);
> + void (*process_auxtrace_error)(struct perf_session *session,
> + union perf_event *event);
> void (*process_stat)(struct perf_stat_config *config,
> struct evsel *evsel, u64 tstamp);
> void (*process_stat_interval)(u64 tstamp);
> --
> 2.17.1
>
--
- Arnaldo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 09/10] perf scripting python: Add auxtrace error
2021-05-25 13:03 ` Arnaldo Carvalho de Melo
@ 2021-05-25 18:30 ` Adrian Hunter
2021-05-25 19:54 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 15+ messages in thread
From: Adrian Hunter @ 2021-05-25 18:30 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo; +Cc: Jiri Olsa, Andi Kleen, linux-kernel
On 25/05/21 4:03 pm, Arnaldo Carvalho de Melo wrote:
> Em Tue, May 25, 2021 at 12:51:11PM +0300, Adrian Hunter escreveu:
>> Add auxtrace_error to general python scripting.
>>
>> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
>> ---
>> tools/perf/builtin-script.c | 13 ++++++
>> .../scripting-engines/trace-event-python.c | 42 +++++++++++++++++++
>> tools/perf/util/trace-event.h | 2 +
>> 3 files changed, 57 insertions(+)
>>
>> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
>> index 69bce65ea430..7a7a19f52db5 100644
>> --- a/tools/perf/builtin-script.c
>> +++ b/tools/perf/builtin-script.c
>> @@ -2432,6 +2432,17 @@ static int process_switch_event(struct perf_tool *tool,
>> sample->tid);
>> }
>>
>> +static int process_auxtrace_error(struct perf_session *session,
>> + union perf_event *event)
>> +{
>> + if (scripting_ops && scripting_ops->process_auxtrace_error) {
>> + scripting_ops->process_auxtrace_error(session, event);
>> + return 0;
>> + }
>> +
>> + return perf_event__process_auxtrace_error(session, event);
>> +}
>> +
>
> Those definitions in auxtrace.h:
>
> e31f0d017ea19fce9 (Adrian Hunter 2015-04-30 17:37:27 +0300 706) #define perf_event__process_auxtrace_info 0
> e31f0d017ea19fce9 (Adrian Hunter 2015-04-30 17:37:27 +0300 707) #define perf_event__process_auxtrace 0
> e31f0d017ea19fce9 (Adrian Hunter 2015-04-30 17:37:27 +0300 708) #define perf_event__process_auxtrace_error 0
>
> came back to haunt us :-)
Sorry about that
>
> I'll try making them the usual inlines, etc
Thank you! :-)
>
> - Arnaldo
>
>
> make_minimal_O: cd . && make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1 NO_LIBZSTD=1 NO_LIBCAP=1 NO_SYSCALL_TABLE=1 FEATURES_DUMP=/var/home/acme/git/perf/tools/perf/BUILD_TEST_FEATURE_DUMP -j24 O=/tmp/tmp.rGrdpQlTCr DESTDIR=/tmp/tmp.png5u8ITR9
> cd . && make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1 NO_LIBZSTD=1 NO_LIBCAP=1 NO_SYSCALL_TABLE=1 FEATURES_DUMP=/var/home/acme/git/perf/tools/perf/BUILD_TEST_FEATURE_DUMP -j24 O=/tmp/tmp.rGrdpQlTCr DESTDIR=/tmp/tmp.png5u8ITR9
> BUILD: Doing 'make -j24' parallel build
> <SNIP>
> CC /tmp/tmp.rGrdpQlTCr/builtin-daemon.o
> In file included from util/events_stats.h:8,
> from util/evlist.h:12,
> from builtin-script.c:18:
> builtin-script.c: In function ‘process_auxtrace_error’:
> util/auxtrace.h:708:57: error: called object is not a function or function pointer
> 708 | #define perf_event__process_auxtrace_error 0
> | ^
> builtin-script.c:2443:16: note: in expansion of macro ‘perf_event__process_auxtrace_error’
> 2443 | return perf_event__process_auxtrace_error(session, event);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> MKDIR /tmp/tmp.rGrdpQlTCr/tests/
> MKDIR /tmp/tmp.rGrdpQlTCr/bench/
> CC /tmp/tmp.rGrdpQlTCr/tests/builtin-test.o
> CC /tmp/tmp.rGrdpQlTCr/bench/sched-messaging.o
> builtin-script.c:2444:1: error: control reaches end of non-void function [-Werror=return-type]
> 2444 | }
> | ^
> cc1: all warnings being treated as errors
> make[5]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/tmp.rGrdpQlTCr/builtin-script.o] Error 1
> make[5]: *** Waiting for unfinished jobs....
> MKDIR /tmp/tmp.rGrdpQlTCr/tests/
> CC /tmp/tmp.rGrdpQlTCr/tests/parse-events.o
> MKDIR /tmp/tmp.rGrdpQlTCr/bench/
> CC /tmp/tmp.rGrdpQlTCr/bench/sched-pipe.o
>
>
>
>> static int
>> process_lost_event(struct perf_tool *tool,
>> union perf_event *event,
>> @@ -2571,6 +2582,8 @@ static int __cmd_script(struct perf_script *script)
>> }
>> if (script->show_switch_events || (scripting_ops && scripting_ops->process_switch))
>> script->tool.context_switch = process_switch_event;
>> + if (scripting_ops && scripting_ops->process_auxtrace_error)
>> + script->tool.auxtrace_error = process_auxtrace_error;
>> if (script->show_namespace_events)
>> script->tool.namespaces = process_namespaces_event;
>> if (script->show_cgroup_events)
>> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
>> index c422901d5344..ffc5f4cffdba 100644
>> --- a/tools/perf/util/scripting-engines/trace-event-python.c
>> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
>> @@ -1014,6 +1014,11 @@ static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
>> #endif
>> }
>>
>> +static int tuple_set_u32(PyObject *t, unsigned int pos, u32 val)
>> +{
>> + return PyTuple_SetItem(t, pos, PyLong_FromUnsignedLong(val));
>> +}
>> +
>> static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
>> {
>> return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
>> @@ -1461,6 +1466,42 @@ static void python_process_switch(union perf_event *event,
>> python_do_process_switch(event, sample, machine);
>> }
>>
>> +static void python_process_auxtrace_error(struct perf_session *session __maybe_unused,
>> + union perf_event *event)
>> +{
>> + struct perf_record_auxtrace_error *e = &event->auxtrace_error;
>> + u8 cpumode = e->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
>> + const char *handler_name = "auxtrace_error";
>> + unsigned long long tm = e->time;
>> + const char *msg = e->msg;
>> + PyObject *handler, *t;
>> +
>> + handler = get_handler(handler_name);
>> + if (!handler)
>> + return;
>> +
>> + if (!e->fmt) {
>> + tm = 0;
>> + msg = (const char *)&e->time;
>> + }
>> +
>> + t = tuple_new(9);
>> +
>> + tuple_set_u32(t, 0, e->type);
>> + tuple_set_u32(t, 1, e->code);
>> + tuple_set_s32(t, 2, e->cpu);
>> + tuple_set_s32(t, 3, e->pid);
>> + tuple_set_s32(t, 4, e->tid);
>> + tuple_set_u64(t, 5, e->ip);
>> + tuple_set_u64(t, 6, tm);
>> + tuple_set_string(t, 7, msg);
>> + tuple_set_u32(t, 8, cpumode);
>> +
>> + call_object(handler, t, handler_name);
>> +
>> + Py_DECREF(t);
>> +}
>> +
>> static void get_handler_name(char *str, size_t size,
>> struct evsel *evsel)
>> {
>> @@ -1999,6 +2040,7 @@ struct scripting_ops python_scripting_ops = {
>> .stop_script = python_stop_script,
>> .process_event = python_process_event,
>> .process_switch = python_process_switch,
>> + .process_auxtrace_error = python_process_auxtrace_error,
>> .process_stat = python_process_stat,
>> .process_stat_interval = python_process_stat_interval,
>> .generate_script = python_generate_script,
>> diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
>> index 7276674e2971..35c354a15c3a 100644
>> --- a/tools/perf/util/trace-event.h
>> +++ b/tools/perf/util/trace-event.h
>> @@ -83,6 +83,8 @@ struct scripting_ops {
>> void (*process_switch)(union perf_event *event,
>> struct perf_sample *sample,
>> struct machine *machine);
>> + void (*process_auxtrace_error)(struct perf_session *session,
>> + union perf_event *event);
>> void (*process_stat)(struct perf_stat_config *config,
>> struct evsel *evsel, u64 tstamp);
>> void (*process_stat_interval)(u64 tstamp);
>> --
>> 2.17.1
>>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 09/10] perf scripting python: Add auxtrace error
2021-05-25 18:30 ` Adrian Hunter
@ 2021-05-25 19:54 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2021-05-25 19:54 UTC (permalink / raw)
To: Adrian Hunter; +Cc: Jiri Olsa, Andi Kleen, linux-kernel
Em Tue, May 25, 2021 at 09:30:50PM +0300, Adrian Hunter escreveu:
> On 25/05/21 4:03 pm, Arnaldo Carvalho de Melo wrote:
> > Em Tue, May 25, 2021 at 12:51:11PM +0300, Adrian Hunter escreveu:
> >> Add auxtrace_error to general python scripting.
> >>
> >> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
> >> ---
> >> tools/perf/builtin-script.c | 13 ++++++
> >> .../scripting-engines/trace-event-python.c | 42 +++++++++++++++++++
> >> tools/perf/util/trace-event.h | 2 +
> >> 3 files changed, 57 insertions(+)
> >>
> >> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> >> index 69bce65ea430..7a7a19f52db5 100644
> >> --- a/tools/perf/builtin-script.c
> >> +++ b/tools/perf/builtin-script.c
> >> @@ -2432,6 +2432,17 @@ static int process_switch_event(struct perf_tool *tool,
> >> sample->tid);
> >> }
> >>
> >> +static int process_auxtrace_error(struct perf_session *session,
> >> + union perf_event *event)
> >> +{
> >> + if (scripting_ops && scripting_ops->process_auxtrace_error) {
> >> + scripting_ops->process_auxtrace_error(session, event);
> >> + return 0;
> >> + }
> >> +
> >> + return perf_event__process_auxtrace_error(session, event);
> >> +}
> >> +
> >
> > Those definitions in auxtrace.h:
> >
> > e31f0d017ea19fce9 (Adrian Hunter 2015-04-30 17:37:27 +0300 706) #define perf_event__process_auxtrace_info 0
> > e31f0d017ea19fce9 (Adrian Hunter 2015-04-30 17:37:27 +0300 707) #define perf_event__process_auxtrace 0
> > e31f0d017ea19fce9 (Adrian Hunter 2015-04-30 17:37:27 +0300 708) #define perf_event__process_auxtrace_error 0
> >
> > came back to haunt us :-)
>
> Sorry about that
>
> >
> > I'll try making them the usual inlines, etc
>
> Thank you! :-)
Its fixed by now and out in my perf/core branch, as all tests passed
successfully, i.e. will not be rebased.
- Arnaldo
> >
> > - Arnaldo
> >
> >
> > make_minimal_O: cd . && make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1 NO_LIBZSTD=1 NO_LIBCAP=1 NO_SYSCALL_TABLE=1 FEATURES_DUMP=/var/home/acme/git/perf/tools/perf/BUILD_TEST_FEATURE_DUMP -j24 O=/tmp/tmp.rGrdpQlTCr DESTDIR=/tmp/tmp.png5u8ITR9
> > cd . && make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1 NO_LIBZSTD=1 NO_LIBCAP=1 NO_SYSCALL_TABLE=1 FEATURES_DUMP=/var/home/acme/git/perf/tools/perf/BUILD_TEST_FEATURE_DUMP -j24 O=/tmp/tmp.rGrdpQlTCr DESTDIR=/tmp/tmp.png5u8ITR9
> > BUILD: Doing 'make -j24' parallel build
> > <SNIP>
> > CC /tmp/tmp.rGrdpQlTCr/builtin-daemon.o
> > In file included from util/events_stats.h:8,
> > from util/evlist.h:12,
> > from builtin-script.c:18:
> > builtin-script.c: In function ‘process_auxtrace_error’:
> > util/auxtrace.h:708:57: error: called object is not a function or function pointer
> > 708 | #define perf_event__process_auxtrace_error 0
> > | ^
> > builtin-script.c:2443:16: note: in expansion of macro ‘perf_event__process_auxtrace_error’
> > 2443 | return perf_event__process_auxtrace_error(session, event);
> > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > MKDIR /tmp/tmp.rGrdpQlTCr/tests/
> > MKDIR /tmp/tmp.rGrdpQlTCr/bench/
> > CC /tmp/tmp.rGrdpQlTCr/tests/builtin-test.o
> > CC /tmp/tmp.rGrdpQlTCr/bench/sched-messaging.o
> > builtin-script.c:2444:1: error: control reaches end of non-void function [-Werror=return-type]
> > 2444 | }
> > | ^
> > cc1: all warnings being treated as errors
> > make[5]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/tmp.rGrdpQlTCr/builtin-script.o] Error 1
> > make[5]: *** Waiting for unfinished jobs....
> > MKDIR /tmp/tmp.rGrdpQlTCr/tests/
> > CC /tmp/tmp.rGrdpQlTCr/tests/parse-events.o
> > MKDIR /tmp/tmp.rGrdpQlTCr/bench/
> > CC /tmp/tmp.rGrdpQlTCr/bench/sched-pipe.o
> >
> >
> >
> >> static int
> >> process_lost_event(struct perf_tool *tool,
> >> union perf_event *event,
> >> @@ -2571,6 +2582,8 @@ static int __cmd_script(struct perf_script *script)
> >> }
> >> if (script->show_switch_events || (scripting_ops && scripting_ops->process_switch))
> >> script->tool.context_switch = process_switch_event;
> >> + if (scripting_ops && scripting_ops->process_auxtrace_error)
> >> + script->tool.auxtrace_error = process_auxtrace_error;
> >> if (script->show_namespace_events)
> >> script->tool.namespaces = process_namespaces_event;
> >> if (script->show_cgroup_events)
> >> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> >> index c422901d5344..ffc5f4cffdba 100644
> >> --- a/tools/perf/util/scripting-engines/trace-event-python.c
> >> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> >> @@ -1014,6 +1014,11 @@ static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
> >> #endif
> >> }
> >>
> >> +static int tuple_set_u32(PyObject *t, unsigned int pos, u32 val)
> >> +{
> >> + return PyTuple_SetItem(t, pos, PyLong_FromUnsignedLong(val));
> >> +}
> >> +
> >> static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
> >> {
> >> return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
> >> @@ -1461,6 +1466,42 @@ static void python_process_switch(union perf_event *event,
> >> python_do_process_switch(event, sample, machine);
> >> }
> >>
> >> +static void python_process_auxtrace_error(struct perf_session *session __maybe_unused,
> >> + union perf_event *event)
> >> +{
> >> + struct perf_record_auxtrace_error *e = &event->auxtrace_error;
> >> + u8 cpumode = e->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
> >> + const char *handler_name = "auxtrace_error";
> >> + unsigned long long tm = e->time;
> >> + const char *msg = e->msg;
> >> + PyObject *handler, *t;
> >> +
> >> + handler = get_handler(handler_name);
> >> + if (!handler)
> >> + return;
> >> +
> >> + if (!e->fmt) {
> >> + tm = 0;
> >> + msg = (const char *)&e->time;
> >> + }
> >> +
> >> + t = tuple_new(9);
> >> +
> >> + tuple_set_u32(t, 0, e->type);
> >> + tuple_set_u32(t, 1, e->code);
> >> + tuple_set_s32(t, 2, e->cpu);
> >> + tuple_set_s32(t, 3, e->pid);
> >> + tuple_set_s32(t, 4, e->tid);
> >> + tuple_set_u64(t, 5, e->ip);
> >> + tuple_set_u64(t, 6, tm);
> >> + tuple_set_string(t, 7, msg);
> >> + tuple_set_u32(t, 8, cpumode);
> >> +
> >> + call_object(handler, t, handler_name);
> >> +
> >> + Py_DECREF(t);
> >> +}
> >> +
> >> static void get_handler_name(char *str, size_t size,
> >> struct evsel *evsel)
> >> {
> >> @@ -1999,6 +2040,7 @@ struct scripting_ops python_scripting_ops = {
> >> .stop_script = python_stop_script,
> >> .process_event = python_process_event,
> >> .process_switch = python_process_switch,
> >> + .process_auxtrace_error = python_process_auxtrace_error,
> >> .process_stat = python_process_stat,
> >> .process_stat_interval = python_process_stat_interval,
> >> .generate_script = python_generate_script,
> >> diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
> >> index 7276674e2971..35c354a15c3a 100644
> >> --- a/tools/perf/util/trace-event.h
> >> +++ b/tools/perf/util/trace-event.h
> >> @@ -83,6 +83,8 @@ struct scripting_ops {
> >> void (*process_switch)(union perf_event *event,
> >> struct perf_sample *sample,
> >> struct machine *machine);
> >> + void (*process_auxtrace_error)(struct perf_session *session,
> >> + union perf_event *event);
> >> void (*process_stat)(struct perf_stat_config *config,
> >> struct evsel *evsel, u64 tstamp);
> >> void (*process_stat_interval)(u64 tstamp);
> >> --
> >> 2.17.1
> >>
> >
>
--
- Arnaldo
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2021-05-25 19:55 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-25 9:51 [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Adrian Hunter
2021-05-25 9:51 ` [PATCH 01/10] perf scripting python: Fix tuple_set_u64() Adrian Hunter
2021-05-25 9:51 ` [PATCH 02/10] perf scripting python: Factor out set_sym_in_dict() Adrian Hunter
2021-05-25 9:51 ` [PATCH 03/10] perf scripting python: Add 'addr_location' for 'addr' Adrian Hunter
2021-05-25 9:51 ` [PATCH 04/10] perf script: Factor out perf_sample__sprintf_flags() Adrian Hunter
2021-05-25 9:51 ` [PATCH 05/10] perf scripting python: Add sample flags Adrian Hunter
2021-05-25 9:51 ` [PATCH 06/10] perf scripting python: Add IPC Adrian Hunter
2021-05-25 9:51 ` [PATCH 07/10] perf scripting python: Add cpumode Adrian Hunter
2021-05-25 9:51 ` [PATCH 08/10] perf scripting python: Add context switch Adrian Hunter
2021-05-25 9:51 ` [PATCH 09/10] perf scripting python: Add auxtrace error Adrian Hunter
2021-05-25 13:03 ` Arnaldo Carvalho de Melo
2021-05-25 18:30 ` Adrian Hunter
2021-05-25 19:54 ` Arnaldo Carvalho de Melo
2021-05-25 9:51 ` [PATCH 10/10] perf scripts python: intel-pt-events.py: Add branches to script Adrian Hunter
2021-05-25 12:58 ` [PATCH 00/10] perf scripting python: Improve general scripting for Intel PT Arnaldo Carvalho de Melo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).