diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2009-08-27 21:09:58 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-08-28 01:58:11 -0400 |
commit | 1ef2ed1066ae9f8080cd96cba11c2d41118b8792 (patch) | |
tree | 44c9e7216610bdca195f21d4934ece4d339df456 /tools | |
parent | 1909629fb1ec9800cf2cb0091870d6a1c1ca665f (diff) |
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>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/builtin-record.c | 4 | ||||
-rw-r--r-- | tools/perf/util/parse-events.c | 47 | ||||
-rw-r--r-- | tools/perf/util/parse-events.h | 13 | ||||
-rw-r--r-- | tools/perf/util/trace-event-info.c | 72 | ||||
-rw-r--r-- | tools/perf/util/trace-event-parse.c | 1 | ||||
-rw-r--r-- | tools/perf/util/trace-event-read.c | 1 | ||||
-rw-r--r-- | 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 acbe59444385..add514d53d2e 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) | |||
549 | 549 | ||
550 | 550 | ||
551 | if (raw_samples) { | 551 | if (raw_samples) { |
552 | read_tracing_data(); | 552 | read_tracing_data(attrs, nr_counters); |
553 | } else { | 553 | } else { |
554 | for (i = 0; i < nr_counters; i++) { | 554 | for (i = 0; i < nr_counters; i++) { |
555 | if (attrs[i].sample_type & PERF_SAMPLE_RAW) { | 555 | if (attrs[i].sample_type & PERF_SAMPLE_RAW) { |
556 | read_tracing_data(); | 556 | read_tracing_data(attrs, nr_counters); |
557 | break; | 557 | break; |
558 | } | 558 | } |
559 | } | 559 | } |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 1cda97b39118..89d46c99bc9c 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) | |||
158 | return 0; | 158 | return 0; |
159 | } | 159 | } |
160 | 160 | ||
161 | static const char *tracepoint_id_to_name(u64 config) | 161 | struct tracepoint_path *tracepoint_id_to_path(u64 config) |
162 | { | 162 | { |
163 | static char tracepoint_name[2 * MAX_EVENT_LENGTH]; | 163 | struct tracepoint_path *path = NULL; |
164 | DIR *sys_dir, *evt_dir; | 164 | DIR *sys_dir, *evt_dir; |
165 | struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; | 165 | struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; |
166 | struct stat st; | 166 | struct stat st; |
@@ -170,7 +170,7 @@ static const char *tracepoint_id_to_name(u64 config) | |||
170 | char evt_path[MAXPATHLEN]; | 170 | char evt_path[MAXPATHLEN]; |
171 | 171 | ||
172 | if (valid_debugfs_mount(debugfs_path)) | 172 | if (valid_debugfs_mount(debugfs_path)) |
173 | return "unkown"; | 173 | return NULL; |
174 | 174 | ||
175 | sys_dir = opendir(debugfs_path); | 175 | sys_dir = opendir(debugfs_path); |
176 | if (!sys_dir) | 176 | if (!sys_dir) |
@@ -197,10 +197,23 @@ static const char *tracepoint_id_to_name(u64 config) | |||
197 | if (id == config) { | 197 | if (id == config) { |
198 | closedir(evt_dir); | 198 | closedir(evt_dir); |
199 | closedir(sys_dir); | 199 | closedir(sys_dir); |
200 | snprintf(tracepoint_name, 2 * MAX_EVENT_LENGTH, | 200 | path = calloc(1, sizeof(path)); |
201 | "%s:%s", sys_dirent.d_name, | 201 | path->system = malloc(MAX_EVENT_LENGTH); |
202 | evt_dirent.d_name); | 202 | if (!path->system) { |
203 | return tracepoint_name; | 203 | free(path); |
204 | return NULL; | ||
205 | } | ||
206 | path->name = malloc(MAX_EVENT_LENGTH); | ||
207 | if (!path->name) { | ||
208 | free(path->system); | ||
209 | free(path); | ||
210 | return NULL; | ||
211 | } | ||
212 | strncpy(path->system, sys_dirent.d_name, | ||
213 | MAX_EVENT_LENGTH); | ||
214 | strncpy(path->name, evt_dirent.d_name, | ||
215 | MAX_EVENT_LENGTH); | ||
216 | return path; | ||
204 | } | 217 | } |
205 | } | 218 | } |
206 | closedir(evt_dir); | 219 | closedir(evt_dir); |
@@ -208,7 +221,25 @@ static const char *tracepoint_id_to_name(u64 config) | |||
208 | 221 | ||
209 | cleanup: | 222 | cleanup: |
210 | closedir(sys_dir); | 223 | closedir(sys_dir); |
211 | return "unkown"; | 224 | return NULL; |
225 | } | ||
226 | |||
227 | #define TP_PATH_LEN (MAX_EVENT_LENGTH * 2 + 1) | ||
228 | static const char *tracepoint_id_to_name(u64 config) | ||
229 | { | ||
230 | static char buf[TP_PATH_LEN]; | ||
231 | struct tracepoint_path *path; | ||
232 | |||
233 | path = tracepoint_id_to_path(config); | ||
234 | if (path) { | ||
235 | snprintf(buf, TP_PATH_LEN, "%s:%s", path->system, path->name); | ||
236 | free(path->name); | ||
237 | free(path->system); | ||
238 | free(path); | ||
239 | } else | ||
240 | snprintf(buf, TP_PATH_LEN, "%s:%s", "unknown", "unknown"); | ||
241 | |||
242 | return buf; | ||
212 | } | 243 | } |
213 | 244 | ||
214 | static int is_cache_op_valid(u8 cache_type, u8 cache_op) | 245 | 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 9b1aeea01636..60704c15961f 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h | |||
@@ -1,10 +1,19 @@ | |||
1 | 1 | #ifndef _PARSE_EVENTS_H | |
2 | #define _PARSE_EVENTS_H | ||
2 | /* | 3 | /* |
3 | * Parse symbolic events/counts passed in as options: | 4 | * Parse symbolic events/counts passed in as options: |
4 | */ | 5 | */ |
5 | 6 | ||
6 | struct option; | 7 | struct option; |
7 | 8 | ||
9 | struct tracepoint_path { | ||
10 | char *system; | ||
11 | char *name; | ||
12 | struct tracepoint_path *next; | ||
13 | }; | ||
14 | |||
15 | extern struct tracepoint_path *tracepoint_id_to_path(u64 config); | ||
16 | |||
8 | extern int nr_counters; | 17 | extern int nr_counters; |
9 | 18 | ||
10 | extern struct perf_counter_attr attrs[MAX_COUNTERS]; | 19 | extern struct perf_counter_attr attrs[MAX_COUNTERS]; |
@@ -21,3 +30,5 @@ extern void print_events(void); | |||
21 | extern char debugfs_path[]; | 30 | extern char debugfs_path[]; |
22 | extern int valid_debugfs_mount(const char *debugfs); | 31 | extern int valid_debugfs_mount(const char *debugfs); |
23 | 32 | ||
33 | |||
34 | #endif /* _PARSE_EVENTS_H */ | ||
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c index 78adff189bba..81615279b876 100644 --- a/tools/perf/util/trace-event-info.c +++ b/tools/perf/util/trace-event-info.c | |||
@@ -32,7 +32,9 @@ | |||
32 | #include <unistd.h> | 32 | #include <unistd.h> |
33 | #include <ctype.h> | 33 | #include <ctype.h> |
34 | #include <errno.h> | 34 | #include <errno.h> |
35 | #include <stdbool.h> | ||
35 | 36 | ||
37 | #include "../perf.h" | ||
36 | #include "trace-event.h" | 38 | #include "trace-event.h" |
37 | 39 | ||
38 | 40 | ||
@@ -289,7 +291,18 @@ static void read_header_files(void) | |||
289 | put_tracing_file(path); | 291 | put_tracing_file(path); |
290 | } | 292 | } |
291 | 293 | ||
292 | static void copy_event_system(const char *sys) | 294 | static bool name_in_tp_list(char *sys, struct tracepoint_path *tps) |
295 | { | ||
296 | while (tps) { | ||
297 | if (!strcmp(sys, tps->name)) | ||
298 | return true; | ||
299 | tps = tps->next; | ||
300 | } | ||
301 | |||
302 | return false; | ||
303 | } | ||
304 | |||
305 | static void copy_event_system(const char *sys, struct tracepoint_path *tps) | ||
293 | { | 306 | { |
294 | unsigned long long size, check_size; | 307 | unsigned long long size, check_size; |
295 | struct dirent *dent; | 308 | struct dirent *dent; |
@@ -305,7 +318,8 @@ static void copy_event_system(const char *sys) | |||
305 | 318 | ||
306 | while ((dent = readdir(dir))) { | 319 | while ((dent = readdir(dir))) { |
307 | if (strcmp(dent->d_name, ".") == 0 || | 320 | if (strcmp(dent->d_name, ".") == 0 || |
308 | strcmp(dent->d_name, "..") == 0) | 321 | strcmp(dent->d_name, "..") == 0 || |
322 | !name_in_tp_list(dent->d_name, tps)) | ||
309 | continue; | 323 | continue; |
310 | format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10); | 324 | format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10); |
311 | sprintf(format, "%s/%s/format", sys, dent->d_name); | 325 | sprintf(format, "%s/%s/format", sys, dent->d_name); |
@@ -321,7 +335,8 @@ static void copy_event_system(const char *sys) | |||
321 | rewinddir(dir); | 335 | rewinddir(dir); |
322 | while ((dent = readdir(dir))) { | 336 | while ((dent = readdir(dir))) { |
323 | if (strcmp(dent->d_name, ".") == 0 || | 337 | if (strcmp(dent->d_name, ".") == 0 || |
324 | strcmp(dent->d_name, "..") == 0) | 338 | strcmp(dent->d_name, "..") == 0 || |
339 | !name_in_tp_list(dent->d_name, tps)) | ||
325 | continue; | 340 | continue; |
326 | format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10); | 341 | format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10); |
327 | sprintf(format, "%s/%s/format", sys, dent->d_name); | 342 | sprintf(format, "%s/%s/format", sys, dent->d_name); |
@@ -340,18 +355,29 @@ static void copy_event_system(const char *sys) | |||
340 | } | 355 | } |
341 | } | 356 | } |
342 | 357 | ||
343 | static void read_ftrace_files(void) | 358 | static void read_ftrace_files(struct tracepoint_path *tps) |
344 | { | 359 | { |
345 | char *path; | 360 | char *path; |
346 | 361 | ||
347 | path = get_tracing_file("events/ftrace"); | 362 | path = get_tracing_file("events/ftrace"); |
348 | 363 | ||
349 | copy_event_system(path); | 364 | copy_event_system(path, tps); |
350 | 365 | ||
351 | put_tracing_file(path); | 366 | put_tracing_file(path); |
352 | } | 367 | } |
353 | 368 | ||
354 | static void read_event_files(void) | 369 | static bool system_in_tp_list(char *sys, struct tracepoint_path *tps) |
370 | { | ||
371 | while (tps) { | ||
372 | if (!strcmp(sys, tps->system)) | ||
373 | return true; | ||
374 | tps = tps->next; | ||
375 | } | ||
376 | |||
377 | return false; | ||
378 | } | ||
379 | |||
380 | static void read_event_files(struct tracepoint_path *tps) | ||
355 | { | 381 | { |
356 | struct dirent *dent; | 382 | struct dirent *dent; |
357 | struct stat st; | 383 | struct stat st; |
@@ -370,7 +396,8 @@ static void read_event_files(void) | |||
370 | while ((dent = readdir(dir))) { | 396 | while ((dent = readdir(dir))) { |
371 | if (strcmp(dent->d_name, ".") == 0 || | 397 | if (strcmp(dent->d_name, ".") == 0 || |
372 | strcmp(dent->d_name, "..") == 0 || | 398 | strcmp(dent->d_name, "..") == 0 || |
373 | strcmp(dent->d_name, "ftrace") == 0) | 399 | strcmp(dent->d_name, "ftrace") == 0 || |
400 | !system_in_tp_list(dent->d_name, tps)) | ||
374 | continue; | 401 | continue; |
375 | sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2); | 402 | sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2); |
376 | sprintf(sys, "%s/%s", path, dent->d_name); | 403 | sprintf(sys, "%s/%s", path, dent->d_name); |
@@ -388,7 +415,8 @@ static void read_event_files(void) | |||
388 | while ((dent = readdir(dir))) { | 415 | while ((dent = readdir(dir))) { |
389 | if (strcmp(dent->d_name, ".") == 0 || | 416 | if (strcmp(dent->d_name, ".") == 0 || |
390 | strcmp(dent->d_name, "..") == 0 || | 417 | strcmp(dent->d_name, "..") == 0 || |
391 | strcmp(dent->d_name, "ftrace") == 0) | 418 | strcmp(dent->d_name, "ftrace") == 0 || |
419 | !system_in_tp_list(dent->d_name, tps)) | ||
392 | continue; | 420 | continue; |
393 | sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2); | 421 | sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2); |
394 | sprintf(sys, "%s/%s", path, dent->d_name); | 422 | sprintf(sys, "%s/%s", path, dent->d_name); |
@@ -396,7 +424,7 @@ static void read_event_files(void) | |||
396 | if (ret >= 0) { | 424 | if (ret >= 0) { |
397 | if (S_ISDIR(st.st_mode)) { | 425 | if (S_ISDIR(st.st_mode)) { |
398 | write_or_die(dent->d_name, strlen(dent->d_name) + 1); | 426 | write_or_die(dent->d_name, strlen(dent->d_name) + 1); |
399 | copy_event_system(sys); | 427 | copy_event_system(sys, tps); |
400 | } | 428 | } |
401 | } | 429 | } |
402 | free(sys); | 430 | free(sys); |
@@ -450,9 +478,27 @@ static void read_ftrace_printk(void) | |||
450 | 478 | ||
451 | } | 479 | } |
452 | 480 | ||
453 | void read_tracing_data(void) | 481 | static struct tracepoint_path * |
482 | get_tracepoints_path(struct perf_counter_attr *pattrs, int nb_counters) | ||
483 | { | ||
484 | struct tracepoint_path path, *ppath = &path; | ||
485 | int i; | ||
486 | |||
487 | for (i = 0; i < nb_counters; i++) { | ||
488 | if (pattrs[i].type != PERF_TYPE_TRACEPOINT) | ||
489 | continue; | ||
490 | ppath->next = tracepoint_id_to_path(pattrs[i].config); | ||
491 | if (!ppath->next) | ||
492 | die("%s\n", "No memory to alloc tracepoints list"); | ||
493 | ppath = ppath->next; | ||
494 | } | ||
495 | |||
496 | return path.next; | ||
497 | } | ||
498 | void read_tracing_data(struct perf_counter_attr *pattrs, int nb_counters) | ||
454 | { | 499 | { |
455 | char buf[BUFSIZ]; | 500 | char buf[BUFSIZ]; |
501 | struct tracepoint_path *tps; | ||
456 | 502 | ||
457 | output_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, 0644); | 503 | output_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, 0644); |
458 | if (output_fd < 0) | 504 | if (output_fd < 0) |
@@ -483,9 +529,11 @@ void read_tracing_data(void) | |||
483 | page_size = getpagesize(); | 529 | page_size = getpagesize(); |
484 | write_or_die(&page_size, 4); | 530 | write_or_die(&page_size, 4); |
485 | 531 | ||
532 | tps = get_tracepoints_path(pattrs, nb_counters); | ||
533 | |||
486 | read_header_files(); | 534 | read_header_files(); |
487 | read_ftrace_files(); | 535 | read_ftrace_files(tps); |
488 | read_event_files(); | 536 | read_event_files(tps); |
489 | read_proc_kallsyms(); | 537 | read_proc_kallsyms(); |
490 | read_ftrace_printk(); | 538 | read_ftrace_printk(); |
491 | } | 539 | } |
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index b53b27f34e4e..a6577cdd9afd 100644 --- a/tools/perf/util/trace-event-parse.c +++ b/tools/perf/util/trace-event-parse.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <errno.h> | 29 | #include <errno.h> |
30 | 30 | ||
31 | #undef _GNU_SOURCE | 31 | #undef _GNU_SOURCE |
32 | #include "../perf.h" | ||
32 | #include "util.h" | 33 | #include "util.h" |
33 | #include "trace-event.h" | 34 | #include "trace-event.h" |
34 | 35 | ||
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c index 1dac301ae54f..b12e4903739a 100644 --- a/tools/perf/util/trace-event-read.c +++ b/tools/perf/util/trace-event-read.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <ctype.h> | 36 | #include <ctype.h> |
37 | #include <errno.h> | 37 | #include <errno.h> |
38 | 38 | ||
39 | #include "../perf.h" | ||
39 | #include "util.h" | 40 | #include "util.h" |
40 | #include "trace-event.h" | 41 | #include "trace-event.h" |
41 | 42 | ||
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h index 3ddb8947be8a..051fcf363825 100644 --- a/tools/perf/util/trace-event.h +++ b/tools/perf/util/trace-event.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef _PARSE_EVENTS_H | 1 | #ifndef _TRACE_EVENTS_H |
2 | #define _PARSE_EVENTS_H | 2 | #define _TRACE_EVENTS_H |
3 | 3 | ||
4 | #include "parse-events.h" | ||
4 | 5 | ||
5 | #define __unused __attribute__((unused)) | 6 | #define __unused __attribute__((unused)) |
6 | 7 | ||
@@ -233,6 +234,6 @@ extern int header_page_data_size; | |||
233 | 234 | ||
234 | int parse_header_page(char *buf, unsigned long size); | 235 | int parse_header_page(char *buf, unsigned long size); |
235 | 236 | ||
236 | void read_tracing_data(void); | 237 | void read_tracing_data(struct perf_counter_attr *pattrs, int nb_counters); |
237 | 238 | ||
238 | #endif /* _PARSE_EVENTS_H */ | 239 | #endif /* _TRACE_EVENTS_H */ |