diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-05-08 12:52:23 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-05-08 14:36:58 -0400 |
commit | a85f61abe11a46553c4562e74edb27ebc782aeb7 (patch) | |
tree | 47a7fab94fe75dc75c0fdf8c590a6f41ef2be527 | |
parent | 3df5edad87a998273aa5a9a8c728c05d855ad00e (diff) |
perf_counter: add PERF_RECORD_CONFIG
Much like CONFIG_RECORD_GROUP records the hw_event.config to
identify the values, allow to record this for all counters.
[ Impact: extend perfcounter output record format ]
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
LKML-Reference: <20090508170028.923228280@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | include/linux/perf_counter.h | 2 | ||||
-rw-r--r-- | kernel/perf_counter.c | 8 |
2 files changed, 10 insertions, 0 deletions
diff --git a/include/linux/perf_counter.h b/include/linux/perf_counter.h index 88f863ec2748..0e6303d36c66 100644 --- a/include/linux/perf_counter.h +++ b/include/linux/perf_counter.h | |||
@@ -104,6 +104,7 @@ enum perf_counter_record_format { | |||
104 | PERF_RECORD_ADDR = 1U << 3, | 104 | PERF_RECORD_ADDR = 1U << 3, |
105 | PERF_RECORD_GROUP = 1U << 4, | 105 | PERF_RECORD_GROUP = 1U << 4, |
106 | PERF_RECORD_CALLCHAIN = 1U << 5, | 106 | PERF_RECORD_CALLCHAIN = 1U << 5, |
107 | PERF_RECORD_CONFIG = 1U << 6, | ||
107 | }; | 108 | }; |
108 | 109 | ||
109 | /* | 110 | /* |
@@ -258,6 +259,7 @@ enum perf_event_type { | |||
258 | * { u32 pid, tid; } && PERF_RECORD_TID | 259 | * { u32 pid, tid; } && PERF_RECORD_TID |
259 | * { u64 time; } && PERF_RECORD_TIME | 260 | * { u64 time; } && PERF_RECORD_TIME |
260 | * { u64 addr; } && PERF_RECORD_ADDR | 261 | * { u64 addr; } && PERF_RECORD_ADDR |
262 | * { u64 config; } && PERF_RECORD_CONFIG | ||
261 | * | 263 | * |
262 | * { u64 nr; | 264 | * { u64 nr; |
263 | * { u64 event, val; } cnt[nr]; } && PERF_RECORD_GROUP | 265 | * { u64 event, val; } cnt[nr]; } && PERF_RECORD_GROUP |
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index f4883f1f47eb..c615f52aa408 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
@@ -1994,6 +1994,11 @@ static void perf_counter_output(struct perf_counter *counter, | |||
1994 | header.size += sizeof(u64); | 1994 | header.size += sizeof(u64); |
1995 | } | 1995 | } |
1996 | 1996 | ||
1997 | if (record_type & PERF_RECORD_CONFIG) { | ||
1998 | header.type |= PERF_RECORD_CONFIG; | ||
1999 | header.size += sizeof(u64); | ||
2000 | } | ||
2001 | |||
1997 | if (record_type & PERF_RECORD_GROUP) { | 2002 | if (record_type & PERF_RECORD_GROUP) { |
1998 | header.type |= PERF_RECORD_GROUP; | 2003 | header.type |= PERF_RECORD_GROUP; |
1999 | header.size += sizeof(u64) + | 2004 | header.size += sizeof(u64) + |
@@ -2029,6 +2034,9 @@ static void perf_counter_output(struct perf_counter *counter, | |||
2029 | if (record_type & PERF_RECORD_ADDR) | 2034 | if (record_type & PERF_RECORD_ADDR) |
2030 | perf_output_put(&handle, addr); | 2035 | perf_output_put(&handle, addr); |
2031 | 2036 | ||
2037 | if (record_type & PERF_RECORD_CONFIG) | ||
2038 | perf_output_put(&handle, counter->hw_event.config); | ||
2039 | |||
2032 | /* | 2040 | /* |
2033 | * XXX PERF_RECORD_GROUP vs inherited counters seems difficult. | 2041 | * XXX PERF_RECORD_GROUP vs inherited counters seems difficult. |
2034 | */ | 2042 | */ |