Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 169476
b: refs/heads/master
c: 03456a1
h: refs/heads/master
v: v3
  • Loading branch information
Frederic Weisbecker authored and Ingo Molnar committed Oct 7, 2009
1 parent bcd482d commit 554741c
Show file tree
Hide file tree
Showing 9 changed files with 55 additions and 19 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b209aa1f83964d49a332a7b6b818ebede5cdc6ef
refs/heads/master: 03456a158d9067d2f657bec170506009db81756d
7 changes: 3 additions & 4 deletions trunk/tools/perf/builtin-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#include "util/header.h"
#include "util/event.h"
#include "util/debug.h"
#include "util/trace-event.h"

#include <unistd.h>
#include <sched.h>
Expand Down Expand Up @@ -566,17 +565,17 @@ static int __cmd_record(int argc, const char **argv)
else
header = perf_header__new();


if (raw_samples) {
read_tracing_data(attrs, nr_counters);
perf_header__set_trace_info();
} else {
for (i = 0; i < nr_counters; i++) {
if (attrs[i].sample_type & PERF_SAMPLE_RAW) {
read_tracing_data(attrs, nr_counters);
perf_header__set_trace_info();
break;
}
}
}

atexit(atexit_header);

if (!system_wide) {
Expand Down
1 change: 0 additions & 1 deletion trunk/tools/perf/builtin-sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -1634,7 +1634,6 @@ static int read_events(void)
uint32_t size;
char *buf;

trace_report();
register_idle_thread(&threads, &last_match);

input = open(input_name, O_RDONLY);
Expand Down
1 change: 0 additions & 1 deletion trunk/tools/perf/builtin-trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,6 @@ static int __cmd_trace(void)
uint32_t size;
char *buf;

trace_report();
register_idle_thread(&threads, &last_match);

input = open(input_name, O_RDONLY);
Expand Down
42 changes: 42 additions & 0 deletions trunk/tools/perf/util/header.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

#include "util.h"
#include "header.h"
#include "../perf.h"
#include "trace-event.h"

/*
* Create new perf.data header attribute:
Expand Down Expand Up @@ -62,6 +64,8 @@ struct perf_header *perf_header__new(void)

self->data_offset = 0;
self->data_size = 0;
self->trace_info_offset = 0;
self->trace_info_size = 0;

return self;
}
Expand Down Expand Up @@ -145,8 +149,16 @@ struct perf_file_header {
struct perf_file_section attrs;
struct perf_file_section data;
struct perf_file_section event_types;
struct perf_file_section trace_info;
};

static int trace_info;

void perf_header__set_trace_info(void)
{
trace_info = 1;
}

static void do_write(int fd, void *buf, size_t size)
{
while (size) {
Expand Down Expand Up @@ -198,6 +210,23 @@ void perf_header__write(struct perf_header *self, int fd)
if (events)
do_write(fd, events, self->event_size);

if (trace_info) {
static int trace_info_written;

/*
* Write it only once
*/
if (!trace_info_written) {
self->trace_info_offset = lseek(fd, 0, SEEK_CUR);
read_tracing_data(fd, attrs, nr_counters);
self->trace_info_size = lseek(fd, 0, SEEK_CUR) -
self->trace_info_offset;
trace_info_written = 1;
} else {
lseek(fd, self->trace_info_offset +
self->trace_info_size, SEEK_SET);
}
}

self->data_offset = lseek(fd, 0, SEEK_CUR);

Expand All @@ -217,6 +246,10 @@ void perf_header__write(struct perf_header *self, int fd)
.offset = self->event_offset,
.size = self->event_size,
},
.trace_info = {
.offset = self->trace_info_offset,
.size = self->trace_info_size,
},
};

lseek(fd, 0, SEEK_SET);
Expand Down Expand Up @@ -290,6 +323,15 @@ struct perf_header *perf_header__read(int fd)
do_read(fd, events, f_header.event_types.size);
event_count = f_header.event_types.size / sizeof(struct perf_trace_event_type);
}

self->trace_info_offset = f_header.trace_info.offset;
self->trace_info_size = f_header.trace_info.size;

if (self->trace_info_size) {
lseek(fd, self->trace_info_offset, SEEK_SET);
trace_report(fd);
}

self->event_offset = f_header.event_types.offset;
self->event_size = f_header.event_types.size;

Expand Down
4 changes: 3 additions & 1 deletion trunk/tools/perf/util/header.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ struct perf_header {
u64 data_size;
u64 event_offset;
u64 event_size;
u64 trace_info_offset;
u64 trace_info_size;
};

struct perf_header *perf_header__read(int fd);
Expand All @@ -40,7 +42,7 @@ void perf_header_attr__add_id(struct perf_header_attr *self, u64 id);
u64 perf_header__sample_type(struct perf_header *header);
struct perf_event_attr *
perf_header__find_attr(u64 id, struct perf_header *header);

void perf_header__set_trace_info(void);

struct perf_header *perf_header__new(void);

Expand Down
6 changes: 2 additions & 4 deletions trunk/tools/perf/util/trace-event-info.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,14 +496,12 @@ get_tracepoints_path(struct perf_event_attr *pattrs, int nb_events)

return path.next;
}
void read_tracing_data(struct perf_event_attr *pattrs, int nb_events)
void read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events)
{
char buf[BUFSIZ];
struct tracepoint_path *tps;

output_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, 0644);
if (output_fd < 0)
die("creating file '%s'", output_file);
output_fd = fd;

buf[0] = 23;
buf[1] = 8;
Expand Down
7 changes: 2 additions & 5 deletions trunk/tools/perf/util/trace-event-read.c
Original file line number Diff line number Diff line change
Expand Up @@ -458,19 +458,16 @@ struct record *trace_read_data(int cpu)
return data;
}

void trace_report(void)
void trace_report(int fd)
{
const char *input_file = "trace.info";
char buf[BUFSIZ];
char test[] = { 23, 8, 68 };
char *version;
int show_version = 0;
int show_funcs = 0;
int show_printk = 0;

input_fd = open(input_file, O_RDONLY);
if (input_fd < 0)
die("opening '%s'\n", input_file);
input_fd = fd;

read_or_die(buf, 3);
if (memcmp(buf, test, 3) != 0)
Expand Down
4 changes: 2 additions & 2 deletions trunk/tools/perf/util/trace-event.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ struct record *trace_read_data(int cpu);

void parse_set_info(int nr_cpus, int long_sz);

void trace_report(void);
void trace_report(int fd);

void *malloc_or_die(unsigned int size);

Expand Down Expand Up @@ -244,6 +244,6 @@ unsigned long long
raw_field_value(struct event *event, const char *name, void *data);
void *raw_field_ptr(struct event *event, const char *name, void *data);

void read_tracing_data(struct perf_event_attr *pattrs, int nb_events);
void read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events);

#endif /* __PERF_TRACE_EVENTS_H */

0 comments on commit 554741c

Please sign in to comment.