* [PATCH] perf tools: Only save the event formats we need
@ 2009-08-28 1:09 Frederic Weisbecker
2009-08-28 1:25 ` Frederic Weisbecker
2009-08-28 6:01 ` [tip:perfcounters/tracing] " tip-bot for Frederic Weisbecker
0 siblings, 2 replies; 3+ messages in thread
From: Frederic Weisbecker @ 2009-08-28 1:09 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Frederic Weisbecker, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt
While opening a trace event counter, every events are saved in the
trace.info file. But we only want to save the specifications of the
events we are using.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
tools/perf/builtin-record.c | 4 +-
tools/perf/util/parse-events.c | 47 +++++++++++++++++++----
tools/perf/util/parse-events.h | 13 ++++++-
tools/perf/util/trace-event-info.c | 72 +++++++++++++++++++++++++++++------
tools/perf/util/trace-event-parse.c | 1 +
tools/perf/util/trace-event-read.c | 1 +
tools/perf/util/trace-event.h | 9 ++--
7 files changed, 120 insertions(+), 27 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index acbe594..add514d 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -549,11 +549,11 @@ static int __cmd_record(int argc, const char **argv)
if (raw_samples) {
- read_tracing_data();
+ read_tracing_data(attrs, nr_counters);
} else {
for (i = 0; i < nr_counters; i++) {
if (attrs[i].sample_type & PERF_SAMPLE_RAW) {
- read_tracing_data();
+ read_tracing_data(attrs, nr_counters);
break;
}
}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 967d17f..8c20239 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -158,9 +158,9 @@ int valid_debugfs_mount(const char *debugfs)
return 0;
}
-static const char *tracepoint_id_to_name(u64 config)
+struct tracepoint_path *tracepoint_id_to_path(u64 config)
{
- static char tracepoint_name[2 * MAX_EVENT_LENGTH];
+ struct tracepoint_path *path = NULL;
DIR *sys_dir, *evt_dir;
struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent;
struct stat st;
@@ -170,7 +170,7 @@ static const char *tracepoint_id_to_name(u64 config)
char evt_path[MAXPATHLEN];
if (valid_debugfs_mount(debugfs_path))
- return "unkown";
+ return NULL;
sys_dir = opendir(debugfs_path);
if (!sys_dir)
@@ -197,10 +197,23 @@ static const char *tracepoint_id_to_name(u64 config)
if (id == config) {
closedir(evt_dir);
closedir(sys_dir);
- snprintf(tracepoint_name, 2 * MAX_EVENT_LENGTH,
- "%s:%s", sys_dirent.d_name,
- evt_dirent.d_name);
- return tracepoint_name;
+ path = calloc(1, sizeof(path));
+ path->system = malloc(MAX_EVENT_LENGTH);
+ if (!path->system) {
+ free(path);
+ return NULL;
+ }
+ path->name = malloc(MAX_EVENT_LENGTH);
+ if (!path->name) {
+ free(path->system);
+ free(path);
+ return NULL;
+ }
+ strncpy(path->system, sys_dirent.d_name,
+ MAX_EVENT_LENGTH);
+ strncpy(path->name, evt_dirent.d_name,
+ MAX_EVENT_LENGTH);
+ return path;
}
}
closedir(evt_dir);
@@ -208,7 +221,25 @@ static const char *tracepoint_id_to_name(u64 config)
cleanup:
closedir(sys_dir);
- return "unkown";
+ return NULL;
+}
+
+#define TP_PATH_LEN (MAX_EVENT_LENGTH * 2 + 1)
+static const char *tracepoint_id_to_name(u64 config)
+{
+ static char buf[TP_PATH_LEN];
+ struct tracepoint_path *path;
+
+ path = tracepoint_id_to_path(config);
+ if (path) {
+ snprintf(buf, TP_PATH_LEN, "%s:%s", path->system, path->name);
+ free(path->name);
+ free(path->system);
+ free(path);
+ } else
+ snprintf(buf, TP_PATH_LEN, "%s:%s", "unknown", "unknown");
+
+ return buf;
}
static int is_cache_op_valid(u8 cache_type, u8 cache_op)
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 9b1aeea..60704c1 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -1,10 +1,19 @@
-
+#ifndef _PARSE_EVENTS_H
+#define _PARSE_EVENTS_H
/*
* Parse symbolic events/counts passed in as options:
*/
struct option;
+struct tracepoint_path {
+ char *system;
+ char *name;
+ struct tracepoint_path *next;
+};
+
+extern struct tracepoint_path *tracepoint_id_to_path(u64 config);
+
extern int nr_counters;
extern struct perf_counter_attr attrs[MAX_COUNTERS];
@@ -21,3 +30,5 @@ extern void print_events(void);
extern char debugfs_path[];
extern int valid_debugfs_mount(const char *debugfs);
+
+#endif /* _PARSE_EVENTS_H */
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index 78adff1..8161527 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -32,7 +32,9 @@
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
+#include <stdbool.h>
+#include "../perf.h"
#include "trace-event.h"
@@ -289,7 +291,18 @@ static void read_header_files(void)
put_tracing_file(path);
}
-static void copy_event_system(const char *sys)
+static bool name_in_tp_list(char *sys, struct tracepoint_path *tps)
+{
+ while (tps) {
+ if (!strcmp(sys, tps->name))
+ return true;
+ tps = tps->next;
+ }
+
+ return false;
+}
+
+static void copy_event_system(const char *sys, struct tracepoint_path *tps)
{
unsigned long long size, check_size;
struct dirent *dent;
@@ -305,7 +318,8 @@ static void copy_event_system(const char *sys)
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
- strcmp(dent->d_name, "..") == 0)
+ strcmp(dent->d_name, "..") == 0 ||
+ !name_in_tp_list(dent->d_name, tps))
continue;
format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10);
sprintf(format, "%s/%s/format", sys, dent->d_name);
@@ -321,7 +335,8 @@ static void copy_event_system(const char *sys)
rewinddir(dir);
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
- strcmp(dent->d_name, "..") == 0)
+ strcmp(dent->d_name, "..") == 0 ||
+ !name_in_tp_list(dent->d_name, tps))
continue;
format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10);
sprintf(format, "%s/%s/format", sys, dent->d_name);
@@ -340,18 +355,29 @@ static void copy_event_system(const char *sys)
}
}
-static void read_ftrace_files(void)
+static void read_ftrace_files(struct tracepoint_path *tps)
{
char *path;
path = get_tracing_file("events/ftrace");
- copy_event_system(path);
+ copy_event_system(path, tps);
put_tracing_file(path);
}
-static void read_event_files(void)
+static bool system_in_tp_list(char *sys, struct tracepoint_path *tps)
+{
+ while (tps) {
+ if (!strcmp(sys, tps->system))
+ return true;
+ tps = tps->next;
+ }
+
+ return false;
+}
+
+static void read_event_files(struct tracepoint_path *tps)
{
struct dirent *dent;
struct stat st;
@@ -370,7 +396,8 @@ static void read_event_files(void)
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0 ||
- strcmp(dent->d_name, "ftrace") == 0)
+ strcmp(dent->d_name, "ftrace") == 0 ||
+ !system_in_tp_list(dent->d_name, tps))
continue;
sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2);
sprintf(sys, "%s/%s", path, dent->d_name);
@@ -388,7 +415,8 @@ static void read_event_files(void)
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0 ||
- strcmp(dent->d_name, "ftrace") == 0)
+ strcmp(dent->d_name, "ftrace") == 0 ||
+ !system_in_tp_list(dent->d_name, tps))
continue;
sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2);
sprintf(sys, "%s/%s", path, dent->d_name);
@@ -396,7 +424,7 @@ static void read_event_files(void)
if (ret >= 0) {
if (S_ISDIR(st.st_mode)) {
write_or_die(dent->d_name, strlen(dent->d_name) + 1);
- copy_event_system(sys);
+ copy_event_system(sys, tps);
}
}
free(sys);
@@ -450,9 +478,27 @@ static void read_ftrace_printk(void)
}
-void read_tracing_data(void)
+static struct tracepoint_path *
+get_tracepoints_path(struct perf_counter_attr *pattrs, int nb_counters)
+{
+ struct tracepoint_path path, *ppath = &path;
+ int i;
+
+ for (i = 0; i < nb_counters; i++) {
+ if (pattrs[i].type != PERF_TYPE_TRACEPOINT)
+ continue;
+ ppath->next = tracepoint_id_to_path(pattrs[i].config);
+ if (!ppath->next)
+ die("%s\n", "No memory to alloc tracepoints list");
+ ppath = ppath->next;
+ }
+
+ return path.next;
+}
+void read_tracing_data(struct perf_counter_attr *pattrs, int nb_counters)
{
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)
@@ -483,9 +529,11 @@ void read_tracing_data(void)
page_size = getpagesize();
write_or_die(&page_size, 4);
+ tps = get_tracepoints_path(pattrs, nb_counters);
+
read_header_files();
- read_ftrace_files();
- read_event_files();
+ read_ftrace_files(tps);
+ read_event_files(tps);
read_proc_kallsyms();
read_ftrace_printk();
}
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
index b53b27f..a6577cd 100644
--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -29,6 +29,7 @@
#include <errno.h>
#undef _GNU_SOURCE
+#include "../perf.h"
#include "util.h"
#include "trace-event.h"
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 1dac301..b12e490 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -36,6 +36,7 @@
#include <ctype.h>
#include <errno.h>
+#include "../perf.h"
#include "util.h"
#include "trace-event.h"
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 3ddb894..051fcf3 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -1,6 +1,7 @@
-#ifndef _PARSE_EVENTS_H
-#define _PARSE_EVENTS_H
+#ifndef _TRACE_EVENTS_H
+#define _TRACE_EVENTS_H
+#include "parse-events.h"
#define __unused __attribute__((unused))
@@ -233,6 +234,6 @@ extern int header_page_data_size;
int parse_header_page(char *buf, unsigned long size);
-void read_tracing_data(void);
+void read_tracing_data(struct perf_counter_attr *pattrs, int nb_counters);
-#endif /* _PARSE_EVENTS_H */
+#endif /* _TRACE_EVENTS_H */
--
1.6.2.3
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] perf tools: Only save the event formats we need
2009-08-28 1:09 [PATCH] perf tools: Only save the event formats we need Frederic Weisbecker
@ 2009-08-28 1:25 ` Frederic Weisbecker
2009-08-28 6:01 ` [tip:perfcounters/tracing] " tip-bot for Frederic Weisbecker
1 sibling, 0 replies; 3+ messages in thread
From: Frederic Weisbecker @ 2009-08-28 1:25 UTC (permalink / raw)
To: Ingo Molnar
Cc: LKML, Peter Zijlstra, Arnaldo Carvalho de Melo, Steven Rostedt
On Fri, Aug 28, 2009 at 03:09:58AM +0200, Frederic Weisbecker wrote:
> While opening a trace event counter, every events are saved in the
> trace.info file. But we only want to save the specifications of the
> events we are using.
I must confess I haven't done that because I care much about the amount
of saved format, you can also beat me because this patch regress perf trace
in that it won't support the trace appending mode anymore (for now).
That said, tracing/events/*/*/format is full of non trivial cases.
perf trace was failing because it can't yet handle scalar dereference
in the format arguments (since the recent sys_enter tracepoint add).
So what I plan toward this patch is to start iterating on trivial
cases and make them work well without beeing annoyed by format fetching
that are not supported yet.
^ permalink raw reply [flat|nested] 3+ messages in thread
* [tip:perfcounters/tracing] perf tools: Only save the event formats we need
2009-08-28 1:09 [PATCH] perf tools: Only save the event formats we need Frederic Weisbecker
2009-08-28 1:25 ` Frederic Weisbecker
@ 2009-08-28 6:01 ` tip-bot for Frederic Weisbecker
1 sibling, 0 replies; 3+ messages in thread
From: tip-bot for Frederic Weisbecker @ 2009-08-28 6:01 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, acme, hpa, mingo, peterz, fweisbec, rostedt, tglx,
mingo
Commit-ID: 1ef2ed1066ae9f8080cd96cba11c2d41118b8792
Gitweb: http://git.kernel.org/tip/1ef2ed1066ae9f8080cd96cba11c2d41118b8792
Author: Frederic Weisbecker <fweisbec@gmail.com>
AuthorDate: Fri, 28 Aug 2009 03:09:58 +0200
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Fri, 28 Aug 2009 07:58:11 +0200
perf tools: Only save the event formats we need
While opening a trace event counter, every events are saved in
the trace.info file. But we only want to save the
specifications of the events we are using.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <1251421798-9101-1-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
tools/perf/builtin-record.c | 4 +-
tools/perf/util/parse-events.c | 47 +++++++++++++++++++----
tools/perf/util/parse-events.h | 13 ++++++-
tools/perf/util/trace-event-info.c | 72 +++++++++++++++++++++++++++++------
tools/perf/util/trace-event-parse.c | 1 +
tools/perf/util/trace-event-read.c | 1 +
tools/perf/util/trace-event.h | 9 ++--
7 files changed, 120 insertions(+), 27 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index acbe594..add514d 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -549,11 +549,11 @@ static int __cmd_record(int argc, const char **argv)
if (raw_samples) {
- read_tracing_data();
+ read_tracing_data(attrs, nr_counters);
} else {
for (i = 0; i < nr_counters; i++) {
if (attrs[i].sample_type & PERF_SAMPLE_RAW) {
- read_tracing_data();
+ read_tracing_data(attrs, nr_counters);
break;
}
}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 1cda97b..89d46c9 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -158,9 +158,9 @@ int valid_debugfs_mount(const char *debugfs)
return 0;
}
-static const char *tracepoint_id_to_name(u64 config)
+struct tracepoint_path *tracepoint_id_to_path(u64 config)
{
- static char tracepoint_name[2 * MAX_EVENT_LENGTH];
+ struct tracepoint_path *path = NULL;
DIR *sys_dir, *evt_dir;
struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent;
struct stat st;
@@ -170,7 +170,7 @@ static const char *tracepoint_id_to_name(u64 config)
char evt_path[MAXPATHLEN];
if (valid_debugfs_mount(debugfs_path))
- return "unkown";
+ return NULL;
sys_dir = opendir(debugfs_path);
if (!sys_dir)
@@ -197,10 +197,23 @@ static const char *tracepoint_id_to_name(u64 config)
if (id == config) {
closedir(evt_dir);
closedir(sys_dir);
- snprintf(tracepoint_name, 2 * MAX_EVENT_LENGTH,
- "%s:%s", sys_dirent.d_name,
- evt_dirent.d_name);
- return tracepoint_name;
+ path = calloc(1, sizeof(path));
+ path->system = malloc(MAX_EVENT_LENGTH);
+ if (!path->system) {
+ free(path);
+ return NULL;
+ }
+ path->name = malloc(MAX_EVENT_LENGTH);
+ if (!path->name) {
+ free(path->system);
+ free(path);
+ return NULL;
+ }
+ strncpy(path->system, sys_dirent.d_name,
+ MAX_EVENT_LENGTH);
+ strncpy(path->name, evt_dirent.d_name,
+ MAX_EVENT_LENGTH);
+ return path;
}
}
closedir(evt_dir);
@@ -208,7 +221,25 @@ static const char *tracepoint_id_to_name(u64 config)
cleanup:
closedir(sys_dir);
- return "unkown";
+ return NULL;
+}
+
+#define TP_PATH_LEN (MAX_EVENT_LENGTH * 2 + 1)
+static const char *tracepoint_id_to_name(u64 config)
+{
+ static char buf[TP_PATH_LEN];
+ struct tracepoint_path *path;
+
+ path = tracepoint_id_to_path(config);
+ if (path) {
+ snprintf(buf, TP_PATH_LEN, "%s:%s", path->system, path->name);
+ free(path->name);
+ free(path->system);
+ free(path);
+ } else
+ snprintf(buf, TP_PATH_LEN, "%s:%s", "unknown", "unknown");
+
+ return buf;
}
static int is_cache_op_valid(u8 cache_type, u8 cache_op)
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 9b1aeea..60704c1 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -1,10 +1,19 @@
-
+#ifndef _PARSE_EVENTS_H
+#define _PARSE_EVENTS_H
/*
* Parse symbolic events/counts passed in as options:
*/
struct option;
+struct tracepoint_path {
+ char *system;
+ char *name;
+ struct tracepoint_path *next;
+};
+
+extern struct tracepoint_path *tracepoint_id_to_path(u64 config);
+
extern int nr_counters;
extern struct perf_counter_attr attrs[MAX_COUNTERS];
@@ -21,3 +30,5 @@ extern void print_events(void);
extern char debugfs_path[];
extern int valid_debugfs_mount(const char *debugfs);
+
+#endif /* _PARSE_EVENTS_H */
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index 78adff1..8161527 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -32,7 +32,9 @@
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
+#include <stdbool.h>
+#include "../perf.h"
#include "trace-event.h"
@@ -289,7 +291,18 @@ static void read_header_files(void)
put_tracing_file(path);
}
-static void copy_event_system(const char *sys)
+static bool name_in_tp_list(char *sys, struct tracepoint_path *tps)
+{
+ while (tps) {
+ if (!strcmp(sys, tps->name))
+ return true;
+ tps = tps->next;
+ }
+
+ return false;
+}
+
+static void copy_event_system(const char *sys, struct tracepoint_path *tps)
{
unsigned long long size, check_size;
struct dirent *dent;
@@ -305,7 +318,8 @@ static void copy_event_system(const char *sys)
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
- strcmp(dent->d_name, "..") == 0)
+ strcmp(dent->d_name, "..") == 0 ||
+ !name_in_tp_list(dent->d_name, tps))
continue;
format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10);
sprintf(format, "%s/%s/format", sys, dent->d_name);
@@ -321,7 +335,8 @@ static void copy_event_system(const char *sys)
rewinddir(dir);
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
- strcmp(dent->d_name, "..") == 0)
+ strcmp(dent->d_name, "..") == 0 ||
+ !name_in_tp_list(dent->d_name, tps))
continue;
format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10);
sprintf(format, "%s/%s/format", sys, dent->d_name);
@@ -340,18 +355,29 @@ static void copy_event_system(const char *sys)
}
}
-static void read_ftrace_files(void)
+static void read_ftrace_files(struct tracepoint_path *tps)
{
char *path;
path = get_tracing_file("events/ftrace");
- copy_event_system(path);
+ copy_event_system(path, tps);
put_tracing_file(path);
}
-static void read_event_files(void)
+static bool system_in_tp_list(char *sys, struct tracepoint_path *tps)
+{
+ while (tps) {
+ if (!strcmp(sys, tps->system))
+ return true;
+ tps = tps->next;
+ }
+
+ return false;
+}
+
+static void read_event_files(struct tracepoint_path *tps)
{
struct dirent *dent;
struct stat st;
@@ -370,7 +396,8 @@ static void read_event_files(void)
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0 ||
- strcmp(dent->d_name, "ftrace") == 0)
+ strcmp(dent->d_name, "ftrace") == 0 ||
+ !system_in_tp_list(dent->d_name, tps))
continue;
sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2);
sprintf(sys, "%s/%s", path, dent->d_name);
@@ -388,7 +415,8 @@ static void read_event_files(void)
while ((dent = readdir(dir))) {
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0 ||
- strcmp(dent->d_name, "ftrace") == 0)
+ strcmp(dent->d_name, "ftrace") == 0 ||
+ !system_in_tp_list(dent->d_name, tps))
continue;
sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2);
sprintf(sys, "%s/%s", path, dent->d_name);
@@ -396,7 +424,7 @@ static void read_event_files(void)
if (ret >= 0) {
if (S_ISDIR(st.st_mode)) {
write_or_die(dent->d_name, strlen(dent->d_name) + 1);
- copy_event_system(sys);
+ copy_event_system(sys, tps);
}
}
free(sys);
@@ -450,9 +478,27 @@ static void read_ftrace_printk(void)
}
-void read_tracing_data(void)
+static struct tracepoint_path *
+get_tracepoints_path(struct perf_counter_attr *pattrs, int nb_counters)
+{
+ struct tracepoint_path path, *ppath = &path;
+ int i;
+
+ for (i = 0; i < nb_counters; i++) {
+ if (pattrs[i].type != PERF_TYPE_TRACEPOINT)
+ continue;
+ ppath->next = tracepoint_id_to_path(pattrs[i].config);
+ if (!ppath->next)
+ die("%s\n", "No memory to alloc tracepoints list");
+ ppath = ppath->next;
+ }
+
+ return path.next;
+}
+void read_tracing_data(struct perf_counter_attr *pattrs, int nb_counters)
{
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)
@@ -483,9 +529,11 @@ void read_tracing_data(void)
page_size = getpagesize();
write_or_die(&page_size, 4);
+ tps = get_tracepoints_path(pattrs, nb_counters);
+
read_header_files();
- read_ftrace_files();
- read_event_files();
+ read_ftrace_files(tps);
+ read_event_files(tps);
read_proc_kallsyms();
read_ftrace_printk();
}
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
index b53b27f..a6577cd 100644
--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -29,6 +29,7 @@
#include <errno.h>
#undef _GNU_SOURCE
+#include "../perf.h"
#include "util.h"
#include "trace-event.h"
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 1dac301..b12e490 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -36,6 +36,7 @@
#include <ctype.h>
#include <errno.h>
+#include "../perf.h"
#include "util.h"
#include "trace-event.h"
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 3ddb894..051fcf3 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -1,6 +1,7 @@
-#ifndef _PARSE_EVENTS_H
-#define _PARSE_EVENTS_H
+#ifndef _TRACE_EVENTS_H
+#define _TRACE_EVENTS_H
+#include "parse-events.h"
#define __unused __attribute__((unused))
@@ -233,6 +234,6 @@ extern int header_page_data_size;
int parse_header_page(char *buf, unsigned long size);
-void read_tracing_data(void);
+void read_tracing_data(struct perf_counter_attr *pattrs, int nb_counters);
-#endif /* _PARSE_EVENTS_H */
+#endif /* _TRACE_EVENTS_H */
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-08-28 6:02 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-28 1:09 [PATCH] perf tools: Only save the event formats we need Frederic Weisbecker
2009-08-28 1:25 ` Frederic Weisbecker
2009-08-28 6:01 ` [tip:perfcounters/tracing] " tip-bot for Frederic Weisbecker
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox