Commit 2ede9217 authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf scripting python: Add auxtrace error

Add auxtrace_error to general python scripting.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: https://lore.kernel.org/r/20210525095112.1399-10-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 0db21340
...@@ -2432,6 +2432,17 @@ static int process_switch_event(struct perf_tool *tool, ...@@ -2432,6 +2432,17 @@ static int process_switch_event(struct perf_tool *tool,
sample->tid); 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 static int
process_lost_event(struct perf_tool *tool, process_lost_event(struct perf_tool *tool,
union perf_event *event, union perf_event *event,
...@@ -2571,6 +2582,8 @@ static int __cmd_script(struct perf_script *script) ...@@ -2571,6 +2582,8 @@ static int __cmd_script(struct perf_script *script)
} }
if (script->show_switch_events || (scripting_ops && scripting_ops->process_switch)) if (script->show_switch_events || (scripting_ops && scripting_ops->process_switch))
script->tool.context_switch = process_switch_event; 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) if (script->show_namespace_events)
script->tool.namespaces = process_namespaces_event; script->tool.namespaces = process_namespaces_event;
if (script->show_cgroup_events) if (script->show_cgroup_events)
......
...@@ -1014,6 +1014,11 @@ static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val) ...@@ -1014,6 +1014,11 @@ static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)
#endif #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) static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)
{ {
return PyTuple_SetItem(t, pos, _PyLong_FromLong(val)); return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));
...@@ -1461,6 +1466,42 @@ static void python_process_switch(union perf_event *event, ...@@ -1461,6 +1466,42 @@ static void python_process_switch(union perf_event *event,
python_do_process_switch(event, sample, machine); 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, static void get_handler_name(char *str, size_t size,
struct evsel *evsel) struct evsel *evsel)
{ {
...@@ -1999,6 +2040,7 @@ struct scripting_ops python_scripting_ops = { ...@@ -1999,6 +2040,7 @@ struct scripting_ops python_scripting_ops = {
.stop_script = python_stop_script, .stop_script = python_stop_script,
.process_event = python_process_event, .process_event = python_process_event,
.process_switch = python_process_switch, .process_switch = python_process_switch,
.process_auxtrace_error = python_process_auxtrace_error,
.process_stat = python_process_stat, .process_stat = python_process_stat,
.process_stat_interval = python_process_stat_interval, .process_stat_interval = python_process_stat_interval,
.generate_script = python_generate_script, .generate_script = python_generate_script,
......
...@@ -83,6 +83,8 @@ struct scripting_ops { ...@@ -83,6 +83,8 @@ struct scripting_ops {
void (*process_switch)(union perf_event *event, void (*process_switch)(union perf_event *event,
struct perf_sample *sample, struct perf_sample *sample,
struct machine *machine); struct machine *machine);
void (*process_auxtrace_error)(struct perf_session *session,
union perf_event *event);
void (*process_stat)(struct perf_stat_config *config, void (*process_stat)(struct perf_stat_config *config,
struct evsel *evsel, u64 tstamp); struct evsel *evsel, u64 tstamp);
void (*process_stat_interval)(u64 tstamp); void (*process_stat_interval)(u64 tstamp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment