linux-kernel.vger.kernel.org archive mirror
 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 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).