diff options
Diffstat (limited to 'tools/perf/util/scripting-engines/trace-event-python.c')
| -rw-r--r-- | tools/perf/util/scripting-engines/trace-event-python.c | 54 | 
1 files changed, 50 insertions, 4 deletions
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index 22f52b669871..112bed65232f 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -112,6 +112,7 @@ struct tables {  	PyObject		*sample_handler;  	PyObject		*call_path_handler;  	PyObject		*call_return_handler; +	PyObject		*synth_handler;  	bool			db_export_mode;  }; @@ -947,6 +948,12 @@ static int tuple_set_string(PyObject *t, unsigned int pos, const char *s)  	return PyTuple_SetItem(t, pos, _PyUnicode_FromString(s));  } +static int tuple_set_bytes(PyObject *t, unsigned int pos, void *bytes, +			   unsigned int sz) +{ +	return PyTuple_SetItem(t, pos, _PyBytes_FromStringAndSize(bytes, sz)); +} +  static int python_export_evsel(struct db_export *dbe, struct perf_evsel *evsel)  {  	struct tables *tables = container_of(dbe, struct tables, dbe); @@ -1105,13 +1112,13 @@ static int python_export_branch_type(struct db_export *dbe, u32 branch_type,  	return 0;  } -static int python_export_sample(struct db_export *dbe, -				struct export_sample *es) +static void python_export_sample_table(struct db_export *dbe, +				       struct export_sample *es)  {  	struct tables *tables = container_of(dbe, struct tables, dbe);  	PyObject *t; -	t = tuple_new(22); +	t = tuple_new(24);  	tuple_set_u64(t, 0, es->db_id);  	tuple_set_u64(t, 1, es->evsel->db_id); @@ -1135,10 +1142,39 @@ static int python_export_sample(struct db_export *dbe,  	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);  	call_object(tables->sample_handler, t, "sample_table");  	Py_DECREF(t); +} + +static void python_export_synth(struct db_export *dbe, struct export_sample *es) +{ +	struct tables *tables = container_of(dbe, struct tables, dbe); +	PyObject *t; + +	t = tuple_new(3); + +	tuple_set_u64(t, 0, es->db_id); +	tuple_set_u64(t, 1, es->evsel->attr.config); +	tuple_set_bytes(t, 2, es->sample->raw_data, es->sample->raw_size); + +	call_object(tables->synth_handler, t, "synth_data"); + +	Py_DECREF(t); +} + +static int python_export_sample(struct db_export *dbe, +				struct export_sample *es) +{ +	struct tables *tables = container_of(dbe, struct tables, dbe); + +	python_export_sample_table(dbe, es); + +	if (es->evsel->attr.type == PERF_TYPE_SYNTH && tables->synth_handler) +		python_export_synth(dbe, es);  	return 0;  } @@ -1173,7 +1209,7 @@ static int python_export_call_return(struct db_export *dbe,  	u64 comm_db_id = cr->comm ? cr->comm->db_id : 0;  	PyObject *t; -	t = tuple_new(12); +	t = tuple_new(14);  	tuple_set_u64(t, 0, cr->db_id);  	tuple_set_u64(t, 1, cr->thread->db_id); @@ -1187,6 +1223,8 @@ static int python_export_call_return(struct db_export *dbe,  	tuple_set_u64(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);  	call_object(tables->call_return_handler, t, "call_return_table"); @@ -1473,6 +1511,14 @@ static void set_table_handlers(struct tables *tables)  	SET_TABLE_HANDLER(sample);  	SET_TABLE_HANDLER(call_path);  	SET_TABLE_HANDLER(call_return); + +	/* +	 * Synthesized events are samples but with architecture-specific data +	 * stored in sample->raw_data. They are exported via +	 * python_export_sample() and consequently do not need a separate export +	 * callback. +	 */ +	tables->synth_handler = get_handler("synth_data");  }  #if PY_MAJOR_VERSION < 3  | 
