[PATCH 4/4] perf: Support for task/softirq/hardirq exclusion on tools

From: Frederic Weisbecker
Date: Fri May 21 2010 - 10:13:01 EST


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@xxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxx>
Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
Cc: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
Cc: Paul Mackerras <paulus@xxxxxxxxx>
---
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

--
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/