diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-11 16:22:43 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-11 16:22:43 -0400 |
| commit | 4f0ac854167846bd55cd81dbc9a36e03708aa01c (patch) | |
| tree | 0eb34d18a667f8e68ad9255f791560b028fed2a6 /tools/perf/util/header.c | |
| parent | b9356c53ba2f593081e5aa45eb67adcce243d1c0 (diff) | |
| parent | 6b58e7f146f8d79c08f62087f928e1f01747de71 (diff) | |
Merge branch 'perfcounters-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perfcounters-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (60 commits)
perf tools: Avoid unnecessary work in directory lookups
perf stat: Clean up statistics calculations a bit more
perf stat: More advanced variance computation
perf stat: Use stddev_mean in stead of stddev
perf stat: Remove the limit on repeat
perf stat: Change noise calculation to use stddev
x86, perf_counter, bts: Do not allow kernel BTS tracing for now
x86, perf_counter, bts: Correct pointer-to-u64 casts
x86, perf_counter, bts: Fail if BTS is not available
perf_counter: Fix output-sharing error path
perf trace: Fix read_string()
perf trace: Print out in nanoseconds
perf tools: Seek to the end of the header area
perf trace: Fix parsing of perf.data
perf trace: Sample timestamps as well
perf_counter: Introduce new (non-)paranoia level to allow raw tracepoint access
perf trace: Sample the CPU too
perf tools: Work around strict aliasing related warnings
perf tools: Clean up warnings list in the Makefile
perf tools: Complete support for dynamic strings
...
Diffstat (limited to 'tools/perf/util/header.c')
| -rw-r--r-- | tools/perf/util/header.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index b92a457ca32e..ec4d4c2f9522 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
| @@ -237,9 +237,44 @@ struct perf_header *perf_header__read(int fd) | |||
| 237 | self->data_offset = f_header.data.offset; | 237 | self->data_offset = f_header.data.offset; |
| 238 | self->data_size = f_header.data.size; | 238 | self->data_size = f_header.data.size; |
| 239 | 239 | ||
| 240 | lseek(fd, self->data_offset + self->data_size, SEEK_SET); | 240 | lseek(fd, self->data_offset, SEEK_SET); |
| 241 | 241 | ||
| 242 | self->frozen = 1; | 242 | self->frozen = 1; |
| 243 | 243 | ||
| 244 | return self; | 244 | return self; |
| 245 | } | 245 | } |
| 246 | |||
| 247 | u64 perf_header__sample_type(struct perf_header *header) | ||
| 248 | { | ||
| 249 | u64 type = 0; | ||
| 250 | int i; | ||
| 251 | |||
| 252 | for (i = 0; i < header->attrs; i++) { | ||
| 253 | struct perf_header_attr *attr = header->attr[i]; | ||
| 254 | |||
| 255 | if (!type) | ||
| 256 | type = attr->attr.sample_type; | ||
| 257 | else if (type != attr->attr.sample_type) | ||
| 258 | die("non matching sample_type"); | ||
| 259 | } | ||
| 260 | |||
| 261 | return type; | ||
| 262 | } | ||
| 263 | |||
| 264 | struct perf_counter_attr * | ||
| 265 | perf_header__find_attr(u64 id, struct perf_header *header) | ||
| 266 | { | ||
| 267 | int i; | ||
| 268 | |||
| 269 | for (i = 0; i < header->attrs; i++) { | ||
| 270 | struct perf_header_attr *attr = header->attr[i]; | ||
| 271 | int j; | ||
| 272 | |||
| 273 | for (j = 0; j < attr->ids; j++) { | ||
| 274 | if (attr->id[j] == id) | ||
| 275 | return &attr->attr; | ||
| 276 | } | ||
| 277 | } | ||
| 278 | |||
| 279 | return NULL; | ||
| 280 | } | ||
