Re: perf: prctl(PR_TASK_PERF_EVENTS_DISABLE) has no effect

From: Arnaldo Carvalho de Melo
Date: Mon Jan 30 2012 - 10:29:43 EST


Em Mon, Jan 30, 2012 at 12:01:33PM +0100, Peter Zijlstra escreveu:
> On Mon, 2012-01-30 at 11:11 +0100, Ingo Molnar wrote:
> > So, what workflow are you suggesting to Andrew?
>
> Librarize perf record, then in your code do something like:
>
> #include "perf_record.h"
>
> handle = perf_record_init(); /* creates perf events and creates
> a record thread that writes samples
> to perf.data, consumes env(PERF_*)
> for configuration, registers with
> at_exit() for cleanup */
> if (!handle)
> /* burn */
>
> /* do you other code */
>
> perf_record_start(handle);
>
> /* do the bit you want profiled */
>
> perf_record_stop(handle);
>
> Then build with -lperfrecord or so. Not too hard, right?

This looks like the test__PERF_RECORD function in
tools/perf/builtin-test.c, copying here just the equivalent parts to the
above:

#include "util/evlist.h"

struct perf_record_opts opts = {
.target_pid = -1,
.target_tid = -1,
.no_delay = true,
.freq = 10,
.mmap_pages = 256,
.sample_id_all_avail = true,
};

struct perf_evlist *handle = perf_evlist__new(NULL, NULL);

/*
* We need at least one evsel in the evlist, use the default
* one: "cycles".
*/
err = perf_evlist__add_default(evlist);

perf_evlist__config_attrs(evlist, &opts);

err = perf_evlist__open(evlist, opts.group);

perf_evlist__enable(evlist);

/* do the bit you want profiled */

perf_evlist__disable(evlist);


----


perf_evlist__config_attrs will, among other chores, do:

if (opts->target_pid == -1 && opts->target_tid == -1 &&
!opts->system_wide) {
attr->disabled = 1;
attr->enable_on_exec = 1;
}

And you can fudge it a bit more to your liking before calling
perf_evlist__open().

This 'perf test' use case was more for preparing for monitoring
a workload that a program would start, setting up the events, etc,
leaving all disabled and then letting the workload begin which would, by
means of enable_on_exec start the counters/events.

But I guess you can just setup evlist->workload.pid to getpid()
and use perf_evlist__enable()/ perf_evlist_disable() pairs to your
liking.

Writing a test case that would do exactly what you want in 'perf
test' would be awesome and would allow us to figure out if the
abstractions in place are enough for your use case. Then we could
librarize just this subset and go from there.

Take a look as well at test__basic_mmap, it may be useful as
another example of using these evsel/evlist classes.

What is needed to link you can find in tools/perf/util/setup.py,
remove util/python.c and you should be set.

- Arnaldo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/