![Arjan van de Ven](/assets/img/avatar_default.png)
for some reason, this structure gets compiled as 36 bytes in some files (the ones that alloacte it) but 40 bytes in others (the ones that use it). The cause is an off_t type that gets a different size in different compilation units for some yet-to-be-explained reason. But the effect is disasterous; the size/offset members of the struct are at different offsets, and result in mostly complete garbage. The parser in perf is so robust that this all gets hidden, and after skipping an certain amount of samples, it recovers.... so this bug is not normally noticed. .... except when you want every sample to be exact. Fix this by just using an explicitly sized type. Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <4A655917.9080504@linux.intel.com>
38 lines
811 B
C
38 lines
811 B
C
#ifndef _PERF_HEADER_H
|
|
#define _PERF_HEADER_H
|
|
|
|
#include "../../../include/linux/perf_counter.h"
|
|
#include <sys/types.h>
|
|
#include "types.h"
|
|
|
|
struct perf_header_attr {
|
|
struct perf_counter_attr attr;
|
|
int ids, size;
|
|
u64 *id;
|
|
off_t id_offset;
|
|
};
|
|
|
|
struct perf_header {
|
|
int frozen;
|
|
int attrs, size;
|
|
struct perf_header_attr **attr;
|
|
s64 attr_offset;
|
|
u64 data_offset;
|
|
u64 data_size;
|
|
};
|
|
|
|
struct perf_header *perf_header__read(int fd);
|
|
void perf_header__write(struct perf_header *self, int fd);
|
|
|
|
void perf_header__add_attr(struct perf_header *self,
|
|
struct perf_header_attr *attr);
|
|
|
|
struct perf_header_attr *
|
|
perf_header_attr__new(struct perf_counter_attr *attr);
|
|
void perf_header_attr__add_id(struct perf_header_attr *self, u64 id);
|
|
|
|
|
|
struct perf_header *perf_header__new(void);
|
|
|
|
#endif /* _PERF_HEADER_H */
|