On Fri, Jul 27, 2012 at 09:26:47AM +0200, Ingo Molnar wrote: > > * Iegorov Oleg <[email protected]> wrote: > > > as there was no proposed solution that helped me in response to the > > same post by Andrew Steets, I would like to know if it is possible > > to disable/enable perf event counters from the source code? > > > > calling prctl(PR_TASK_PERF_EVENTS_DISABLE) has no effect, nor does > > compiling with -fno-omit-frame-pointer option. > > > > It would be extremely useful to disable perf event counters for some > > parts of code and re-enable them for other parts of code, like: > > > > prctl(PR_TASK_PERF_EVENTS_DISABLE); > > // not important for performance analysis code > > prctl(PR_TASK_PERF_EVENTS_ENABLE); > > // code that needs to be analysed > > > > and then, run perf: > > > > $ perf record ./program > > $ perf report > > > > Can anyone tell me how can I enable such functionality? > > So, the kernel bits to do this in a pretty quirky way are there, > see: > > https://lkml.org/lkml/2012/1/30/99 > > but the librarization bits are definitely non-obvious to do and > it's no surprise that it has not been done yet. > > Regular 'perf record' in itself is not self-profiling - it's > another task profiling you, so we cannot blanket allow > PR_TASK_PERF_EVENTS_DISABLE to disable profiling. > > What we might want to do instead on the kernel side to offer the > functionality you are asking for is to enable 'public/weak' > events be created by the profiler on an opt-in basis, which can > be turned off by child tasks as well via > PR_TASK_PERF_EVENTS_DISABLE. > > On the profiling workflow side it would work in a very simple > way, like this: > > perf record --self-profiling ./my-app > > In your app you stick in appropriately placed > PR_TASK_PERF_EVENTS_DISABLE/ENABLE calls. > > On the technical side perf record creates events with that > struct perf_event_attr::self_profiling flag set to 1. (the flag > is disabled by default) > > The PR_TASK_PERF_EVENTS_DISABLE code in the modified kernel then > iterates through all events and disables those that have this > flag set, not just the ones owned by this task. > > Maybe someone on Cc: would be interested in implementing this > new perf events feature?
The problem is more general than that I think. We need to be able to define finer grained contexts than just "task" and/or "CPU". And reusing events themselves would be a nice interface. For example create 3 events: A = irq entry tracepoint B = irq exit tracepoint C = cpu-cycles And say: I want to count cpu-cycles when event A fires and stop counting when B fires. With that you can count cpu cycles on irqs. You could use any event you want to define your contexts: lock, functions, etc... And even uprobes to define areas in userspace to profile. Would that solve the initial problem in the thread? Like hook on function library entry/exit? I talked about that to Jiri Olsa several times. May be he would be interested in implementing this. I posted some patchets one year ago but got sidetracked. This can give you an idea from where we can start: https://lkml.org/lkml/2011/3/14/346 Jiri, would you be interested in working on this? -- To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
