Re: [PATCH 4/6] perf script: dump software events too

Arnaldo Carvalho de Melo
2011-03-01T16:49:36Z

Em Tue, Mar 01, 2011 at 09:11:20AM -0700, David Ahern escreveu:
> On 03/01/2011 08:11 AM, Frederic Weisbecker wrote:
> > Why shouldn't it be designed to dump software events? It's called print_event().
> > Its current version is rather something I would call "limited". But it
> > was not designed to be limited.

> That's because its origins are trace specific. Per last week's thread,
> perf-script was perf-trace until Nov 2010. perf-script deals with
> tracepoints.

> > Ideally, we should have print_tracepoint_event() in
> > trace-event-parse.c, print_software_event()
> > where you want, and have print_event() in builtin-script.c that wraps on those.
>
> process_event does not take the event sample, it takes elements of it:
>
> struct scripting_ops {
> ...
> void (*process_event) (int cpu, void *data, int size,
> unsigned long long nsecs, char *comm);

I still have to read the entire thread, but this definetely should
receive "struct perf_sample", i.e. the parsed sample and the 'struct
thread' from where it can get the comm, etc

Look at the process_event for builtin-script.c:

scripting_ops->process_event(sample->cpu,
sample->raw_data,
sample->raw_size,
sample->time,
thread->comm);

I'd change it to:

scripting_ops->process_event(event, sample, thread);

Or even short circuit it completely modulo debugging, becoming:

static int process_sample_event(union perf_event *event,
struct perf_sample *sample,
struct perf_session *session)
{
if (debug_mode) {
if (sample->time < last_timestamp) {
pr_err("Samples misordered, previous: %" PRIu64
" this: %" PRIu64 "\n", last_timestamp,
sample->time);
nr_unordered++;
}
last_timestamp = sample->time;
} else {
scripting_ops->process_event(event, sample, session);
session->hists.stats.total_period += sample->period;
}
return 0;
}

Script modules may then do their thread accounting if comms are asked
for, etc.

- Arnaldo