Messages in this thread Patch in this message | | | From | Frederic Weisbecker <> | Subject | [PATCH 5/5] perf: Support for task/softirq/hardirq exclusion on tools | Date | Thu, 10 Jun 2010 05:49:20 +0200 |
| |
Bring the following new flags on perf events:
- t = Profile task context - s = Profile softirq context - i = Profile hardirq context
Example:
perf record -a -g -e cycles:i ls -R /usr > /dev/null
3.11% ls [kernel.kallsyms] [k] __lock_acquire | --- __lock_acquire | |--95.83%-- lock_acquire | _raw_spin_lock | | | |--30.43%-- perf_ctx_adjust_freq | | perf_event_task_tick | | scheduler_tick | | update_process_times | | tick_sched_timer | | __run_hrtimer | | hrtimer_interrupt | | smp_apic_timer_interrupt | | apic_timer_interrupt
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Cyrill Gorcunov <gorcunov@gmail.com> Cc: Zhang Yanmin <yanmin_zhang@linux.intel.com> Cc: Steven Rostedt <rostedt@goodmis.org> --- tools/perf/util/parse-events.c | 37 ++++++++++++++++++++++++++----------- 1 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 9bf0f40..7a18e71 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -688,24 +688,36 @@ static enum event_result parse_event_modifier(const char **strp, struct perf_event_attr *attr) { const char *str = *strp; - int exclude = 0; - int eu = 0, ek = 0, eh = 0, precise = 0; + int exclude_ring = 0, exclude_context = 0; + int eu = 0, ek = 0, eh = 0, et = 0, es = 0, ei = 0, precise = 0; if (*str++ != ':') return 0; while (*str) { if (*str == 'u') { - if (!exclude) - exclude = eu = ek = eh = 1; + if (!exclude_ring) + exclude_ring = eu = ek = eh = 1; eu = 0; } else if (*str == 'k') { - if (!exclude) - exclude = eu = ek = eh = 1; + if (!exclude_ring) + exclude_ring = eu = ek = eh = 1; ek = 0; } else if (*str == 'h') { - if (!exclude) - exclude = eu = ek = eh = 1; + if (!exclude_ring) + exclude_ring = eu = ek = eh = 1; eh = 0; + } else if (*str == 't') { + if (!exclude_context) + exclude_context = et = es = ei = 1; + et = 0; + } else if (*str == 's') { + if (!exclude_context) + exclude_context = et = es = ei = 1; + es = 0; + } else if (*str == 'i') { + if (!exclude_context) + exclude_context = et = es = ei = 1; + ei = 0; } else if (*str == 'p') { precise++; } else @@ -715,9 +727,12 @@ parse_event_modifier(const char **strp, struct perf_event_attr *attr) } if (str >= *strp + 2) { *strp = str; - attr->exclude_user = eu; - attr->exclude_kernel = ek; - attr->exclude_hv = eh; + attr->exclude_user = eu; + attr->exclude_kernel = ek; + attr->exclude_hv = eh; + attr->exclude_task = et; + attr->exclude_softirq = es; + attr->exclude_hardirq = ei; attr->precise_ip = precise; return 1; } -- 1.6.2.3
| |