}
static void process_event(struct perf_script *script,
- struct perf_sample *sample, struct evsel *evsel,
+ struct perf_sample *sample,
struct addr_location *al,
struct addr_location *addr_al,
struct machine *machine)
{
struct thread *thread = al->thread;
+ struct evsel *evsel = sample->evsel;
struct perf_event_attr *attr = &evsel->core.attr;
unsigned int type = evsel__output_type(evsel);
struct evsel_script *es = evsel->priv;
thread__resolve(al.thread, &addr_al, sample);
addr_al_ptr = &addr_al;
}
- scripting_ops->process_event(event, sample, evsel, &al, addr_al_ptr);
+ scripting_ops->process_event(event, sample, &al, addr_al_ptr);
} else {
- process_event(scr, sample, evsel, &al, &addr_al, machine);
+ process_event(scr, sample, &al, &addr_al, machine);
}
out_put:
{
struct perf_script *script = container_of(tool, struct perf_script, tool);
struct perf_session *session = script->session;
- struct evsel *evsel = evlist__id2evsel(session->evlist, sample->id);
+ struct evsel *evsel = sample->evsel;
struct thread *thread = NULL;
+ if (!evsel)
+ evsel = evlist__id2evsel(session->evlist, sample->id);
+
if (evsel && !evsel->core.attr.sample_id_all) {
sample->cpu = 0;
sample->time = timestamp;
}
static SV *perl_process_callchain(struct perf_sample *sample,
- struct evsel *evsel __maybe_unused,
struct addr_location *al)
{
struct callchain_cursor *cursor;
}
static void perl_process_tracepoint(struct perf_sample *sample,
- struct evsel *evsel,
struct addr_location *al)
{
struct thread *thread = al->thread;
unsigned long long nsecs = sample->time;
const char *comm = thread__comm_str(thread);
DECLARE_BITMAP(events_defined, TRACE_EVENT_TYPE_MAX);
+ struct evsel *evsel = sample->evsel;
bitmap_zero(events_defined, TRACE_EVENT_TYPE_MAX);
dSP;
XPUSHs(sv_2mortal(newSVuv(ns)));
XPUSHs(sv_2mortal(newSViv(pid)));
XPUSHs(sv_2mortal(newSVpv(comm, 0)));
- XPUSHs(sv_2mortal(perl_process_callchain(sample, evsel, al)));
+ XPUSHs(sv_2mortal(perl_process_callchain(sample, al)));
/* common fields other than pid can be accessed via xsub fns */
XPUSHs(sv_2mortal(newSVuv(nsecs)));
XPUSHs(sv_2mortal(newSViv(pid)));
XPUSHs(sv_2mortal(newSVpv(comm, 0)));
- XPUSHs(sv_2mortal(perl_process_callchain(sample, evsel, al)));
+ XPUSHs(sv_2mortal(perl_process_callchain(sample, al)));
call_pv("main::trace_unhandled", G_SCALAR);
}
SPAGAIN;
LEAVE;
}
-static void perl_process_event_generic(union perf_event *event,
- struct perf_sample *sample,
- struct evsel *evsel)
+static void perl_process_event_generic(union perf_event *event, struct perf_sample *sample)
{
dSP;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpvn((const char *)event, event->header.size)));
- XPUSHs(sv_2mortal(newSVpvn((const char *)&evsel->core.attr, sizeof(evsel->core.attr))));
+ XPUSHs(sv_2mortal(newSVpvn((const char *)&sample->evsel->core.attr,
+ sizeof(sample->evsel->core.attr))));
XPUSHs(sv_2mortal(newSVpvn((const char *)sample, sizeof(*sample))));
XPUSHs(sv_2mortal(newSVpvn((const char *)sample->raw_data, sample->raw_size)));
PUTBACK;
static void perl_process_event(union perf_event *event,
struct perf_sample *sample,
- struct evsel *evsel,
struct addr_location *al,
struct addr_location *addr_al)
{
- scripting_context__update(scripting_context, event, sample, evsel, al, addr_al);
- perl_process_tracepoint(sample, evsel, al);
- perl_process_event_generic(event, sample, evsel);
+ scripting_context__update(scripting_context, event, sample, al, addr_al);
+ perl_process_tracepoint(sample, al);
+ perl_process_event_generic(event, sample);
}
static void run_start_sub(void)
}
static PyObject *python_process_callchain(struct perf_sample *sample,
- struct evsel *evsel __maybe_unused,
struct addr_location *al)
{
PyObject *pylist;
return t;
}
-static void set_sample_read_in_dict(PyObject *dict_sample,
- struct perf_sample *sample,
- struct evsel *evsel)
+static void set_sample_read_in_dict(PyObject *dict_sample, struct perf_sample *sample)
{
- u64 read_format = evsel->core.attr.read_format;
+ u64 read_format = sample->evsel->core.attr.read_format;
PyObject *values;
unsigned int i;
static int set_regs_in_dict(PyObject *dict,
struct perf_sample *sample,
- struct evsel *evsel,
uint16_t e_machine,
uint32_t e_flags)
{
- struct perf_event_attr *attr = &evsel->core.attr;
+ struct perf_event_attr *attr = &sample->evsel->core.attr;
int size = (__sw_hweight64(attr->sample_regs_intr) * MAX_REG_SIZE) + 1;
char *bf = NULL;
}
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;
uint16_t e_machine = EM_HOST;
uint32_t e_flags = EF_HOST;
+ struct evsel *evsel = sample->evsel;
dict = PyDict_New();
if (!dict)
PyLong_FromUnsignedLongLong(sample->phys_addr));
pydict_set_item_string_decref(dict_sample, "addr",
PyLong_FromUnsignedLongLong(sample->addr));
- set_sample_read_in_dict(dict_sample, sample, evsel);
+ set_sample_read_in_dict(dict_sample, sample);
pydict_set_item_string_decref(dict_sample, "weight",
PyLong_FromUnsignedLongLong(sample->weight));
pydict_set_item_string_decref(dict_sample, "ins_lat",
if (al->thread)
e_machine = thread__e_machine(al->thread, /*machine=*/NULL, &e_flags);
- if (set_regs_in_dict(dict, sample, evsel, e_machine, e_flags))
+ if (set_regs_in_dict(dict, sample, e_machine, e_flags))
Py_FatalError("Failed to setting regs in dict");
return dict;
#ifdef HAVE_LIBTRACEEVENT
static void python_process_tracepoint(struct perf_sample *sample,
- struct evsel *evsel,
struct addr_location *al,
struct addr_location *addr_al)
{
const char *comm = thread__comm_str(al->thread);
const char *default_handler_name = "trace_unhandled";
DECLARE_BITMAP(events_defined, TRACE_EVENT_TYPE_MAX);
+ struct evsel *evsel = sample->evsel;
bitmap_zero(events_defined, TRACE_EVENT_TYPE_MAX);
PyTuple_SetItem(t, n++, context);
/* ip unwinding */
- callchain = python_process_callchain(sample, evsel, al);
+ callchain = python_process_callchain(sample, al);
/* Need an additional reference for the perf_sample dict */
Py_INCREF(callchain);
PyTuple_SetItem(t, n++, dict);
if (get_argument_count(handler) == (int) n + 1) {
- all_entries_dict = get_perf_sample_dict(sample, evsel, al, addr_al,
+ all_entries_dict = get_perf_sample_dict(sample, al, addr_al,
callchain);
PyTuple_SetItem(t, n++, all_entries_dict);
} else {
}
#else
static void python_process_tracepoint(struct perf_sample *sample __maybe_unused,
- struct evsel *evsel __maybe_unused,
struct addr_location *al __maybe_unused,
struct addr_location *addr_al __maybe_unused)
{
}
static void python_process_general_event(struct perf_sample *sample,
- struct evsel *evsel,
struct addr_location *al,
struct addr_location *addr_al)
{
Py_FatalError("couldn't create Python tuple");
/* ip unwinding */
- callchain = python_process_callchain(sample, evsel, al);
- dict = get_perf_sample_dict(sample, evsel, al, addr_al, callchain);
+ callchain = python_process_callchain(sample, al);
+ dict = get_perf_sample_dict(sample, al, addr_al, callchain);
PyTuple_SetItem(t, n++, dict);
if (_PyTuple_Resize(&t, n) == -1)
static void python_process_event(union perf_event *event,
struct perf_sample *sample,
- struct evsel *evsel,
struct addr_location *al,
struct addr_location *addr_al)
{
struct tables *tables = &tables_global;
- scripting_context__update(scripting_context, event, sample, evsel, al, addr_al);
+ scripting_context__update(scripting_context, event, sample, al, addr_al);
- switch (evsel->core.attr.type) {
+ switch (sample->evsel->core.attr.type) {
case PERF_TYPE_TRACEPOINT:
- python_process_tracepoint(sample, evsel, al, addr_al);
+ python_process_tracepoint(sample, 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, al, addr_al);
else
- python_process_general_event(sample, evsel, al, addr_al);
+ python_process_general_event(sample, al, addr_al);
}
}
void scripting_context__update(struct scripting_context *c,
union perf_event *event,
struct perf_sample *sample,
- struct evsel *evsel,
struct addr_location *al,
struct addr_location *addr_al)
{
#ifdef HAVE_LIBTRACEEVENT
- const struct tep_event *tp_format = evsel__tp_format(evsel);
+ const struct tep_event *tp_format = evsel__tp_format(sample->evsel);
c->pevent = tp_format ? tp_format->tep : NULL;
#else
c->event_data = sample->raw_data;
c->event = event;
c->sample = sample;
- c->evsel = evsel;
c->al = al;
c->addr_al = addr_al;
}
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 *addr_al __maybe_unused)
{
int (*stop_script) (void);
void (*process_event) (union perf_event *event,
struct perf_sample *sample,
- struct evsel *evsel,
struct addr_location *al,
struct addr_location *addr_al);
void (*process_switch)(union perf_event *event,
void *event_data;
union perf_event *event;
struct perf_sample *sample;
- struct evsel *evsel;
struct addr_location *al;
struct addr_location *addr_al;
struct perf_session *session;
void scripting_context__update(struct scripting_context *scripting_context,
union perf_event *event,
struct perf_sample *sample,
- struct evsel *evsel,
struct addr_location *al,
struct addr_location *addr_al);