All of lore.kernel.org
 help / color / mirror / Atom feed
* [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.