diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-10-17 03:58:25 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-10-17 03:58:25 -0400 |
commit | bb3c3e807140816b5f5fd4840473ee52a916ad4f (patch) | |
tree | 9e8a69d266a7df86ca16177eefffab4b4e910753 /tools/perf/util | |
parent | 595c36490deb49381dc51231a3d5e6b66786ed27 (diff) | |
parent | 012abeea669ea49636cf952d13298bb68654146a (diff) |
Merge commit 'v2.6.32-rc5' into perf/probes
Conflicts:
kernel/trace/trace_event_profile.c
Merge reason: update to -rc5 and resolve conflict.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/util')
-rw-r--r-- | tools/perf/util/module.c | 96 | ||||
-rw-r--r-- | tools/perf/util/parse-events.c | 54 | ||||
-rw-r--r-- | tools/perf/util/svghelper.c | 14 | ||||
-rw-r--r-- | tools/perf/util/symbol.c | 20 | ||||
-rw-r--r-- | tools/perf/util/trace-event-parse.c | 17 |
5 files changed, 126 insertions, 75 deletions
diff --git a/tools/perf/util/module.c b/tools/perf/util/module.c index 3d567fe59c79..0d8c85defcd2 100644 --- a/tools/perf/util/module.c +++ b/tools/perf/util/module.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include "module.h" | 4 | #include "module.h" |
5 | 5 | ||
6 | #include <libelf.h> | 6 | #include <libelf.h> |
7 | #include <libgen.h> | ||
7 | #include <gelf.h> | 8 | #include <gelf.h> |
8 | #include <elf.h> | 9 | #include <elf.h> |
9 | #include <dirent.h> | 10 | #include <dirent.h> |
@@ -409,35 +410,40 @@ out_failure: | |||
409 | static int mod_dso__load_module_paths(struct mod_dso *self) | 410 | static int mod_dso__load_module_paths(struct mod_dso *self) |
410 | { | 411 | { |
411 | struct utsname uts; | 412 | struct utsname uts; |
412 | int count = 0, len; | 413 | int count = 0, len, err = -1; |
413 | char *line = NULL; | 414 | char *line = NULL; |
414 | FILE *file; | 415 | FILE *file; |
415 | char *path; | 416 | char *dpath, *dir; |
416 | size_t n; | 417 | size_t n; |
417 | 418 | ||
418 | if (uname(&uts) < 0) | 419 | if (uname(&uts) < 0) |
419 | goto out_failure; | 420 | return err; |
420 | 421 | ||
421 | len = strlen("/lib/modules/"); | 422 | len = strlen("/lib/modules/"); |
422 | len += strlen(uts.release); | 423 | len += strlen(uts.release); |
423 | len += strlen("/modules.dep"); | 424 | len += strlen("/modules.dep"); |
424 | 425 | ||
425 | path = calloc(1, len); | 426 | dpath = calloc(1, len + 1); |
426 | if (path == NULL) | 427 | if (dpath == NULL) |
427 | goto out_failure; | 428 | return err; |
428 | 429 | ||
429 | strcat(path, "/lib/modules/"); | 430 | strcat(dpath, "/lib/modules/"); |
430 | strcat(path, uts.release); | 431 | strcat(dpath, uts.release); |
431 | strcat(path, "/modules.dep"); | 432 | strcat(dpath, "/modules.dep"); |
432 | 433 | ||
433 | file = fopen(path, "r"); | 434 | file = fopen(dpath, "r"); |
434 | free(path); | ||
435 | if (file == NULL) | 435 | if (file == NULL) |
436 | goto out_failure; | 436 | goto out_failure; |
437 | 437 | ||
438 | dir = dirname(dpath); | ||
439 | if (!dir) | ||
440 | goto out_failure; | ||
441 | strcat(dir, "/"); | ||
442 | |||
438 | while (!feof(file)) { | 443 | while (!feof(file)) { |
439 | char *name, *tmp; | ||
440 | struct module *module; | 444 | struct module *module; |
445 | char *name, *path, *tmp; | ||
446 | FILE *modfile; | ||
441 | int line_len; | 447 | int line_len; |
442 | 448 | ||
443 | line_len = getline(&line, &n, file); | 449 | line_len = getline(&line, &n, file); |
@@ -445,17 +451,41 @@ static int mod_dso__load_module_paths(struct mod_dso *self) | |||
445 | break; | 451 | break; |
446 | 452 | ||
447 | if (!line) | 453 | if (!line) |
448 | goto out_failure; | 454 | break; |
449 | 455 | ||
450 | line[--line_len] = '\0'; /* \n */ | 456 | line[--line_len] = '\0'; /* \n */ |
451 | 457 | ||
452 | path = strtok(line, ":"); | 458 | path = strchr(line, ':'); |
459 | if (!path) | ||
460 | break; | ||
461 | *path = '\0'; | ||
462 | |||
463 | path = strdup(line); | ||
453 | if (!path) | 464 | if (!path) |
454 | goto out_failure; | 465 | break; |
466 | |||
467 | if (!strstr(path, dir)) { | ||
468 | if (strncmp(path, "kernel/", 7)) | ||
469 | break; | ||
470 | |||
471 | free(path); | ||
472 | path = calloc(1, strlen(dir) + strlen(line) + 1); | ||
473 | if (!path) | ||
474 | break; | ||
475 | strcat(path, dir); | ||
476 | strcat(path, line); | ||
477 | } | ||
478 | |||
479 | modfile = fopen(path, "r"); | ||
480 | if (modfile == NULL) | ||
481 | break; | ||
482 | fclose(modfile); | ||
455 | 483 | ||
456 | name = strdup(path); | 484 | name = strdup(path); |
457 | name = strtok(name, "/"); | 485 | if (!name) |
486 | break; | ||
458 | 487 | ||
488 | name = strtok(name, "/"); | ||
459 | tmp = name; | 489 | tmp = name; |
460 | 490 | ||
461 | while (tmp) { | 491 | while (tmp) { |
@@ -463,26 +493,25 @@ static int mod_dso__load_module_paths(struct mod_dso *self) | |||
463 | if (tmp) | 493 | if (tmp) |
464 | name = tmp; | 494 | name = tmp; |
465 | } | 495 | } |
496 | |||
466 | name = strsep(&name, "."); | 497 | name = strsep(&name, "."); |
498 | if (!name) | ||
499 | break; | ||
467 | 500 | ||
468 | /* Quirk: replace '-' with '_' in sound modules */ | 501 | /* Quirk: replace '-' with '_' in all modules */ |
469 | for (len = strlen(name); len; len--) { | 502 | for (len = strlen(name); len; len--) { |
470 | if (*(name+len) == '-') | 503 | if (*(name+len) == '-') |
471 | *(name+len) = '_'; | 504 | *(name+len) = '_'; |
472 | } | 505 | } |
473 | 506 | ||
474 | module = module__new(name, path); | 507 | module = module__new(name, path); |
475 | if (!module) { | 508 | if (!module) |
476 | fprintf(stderr, "load_module_paths: allocation error\n"); | 509 | break; |
477 | goto out_failure; | ||
478 | } | ||
479 | mod_dso__insert_module(self, module); | 510 | mod_dso__insert_module(self, module); |
480 | 511 | ||
481 | module->sections = sec_dso__new_dso("sections"); | 512 | module->sections = sec_dso__new_dso("sections"); |
482 | if (!module->sections) { | 513 | if (!module->sections) |
483 | fprintf(stderr, "load_module_paths: allocation error\n"); | 514 | break; |
484 | goto out_failure; | ||
485 | } | ||
486 | 515 | ||
487 | module->active = mod_dso__load_sections(module); | 516 | module->active = mod_dso__load_sections(module); |
488 | 517 | ||
@@ -490,13 +519,20 @@ static int mod_dso__load_module_paths(struct mod_dso *self) | |||
490 | count++; | 519 | count++; |
491 | } | 520 | } |
492 | 521 | ||
493 | free(line); | 522 | if (feof(file)) |
494 | fclose(file); | 523 | err = count; |
495 | 524 | else | |
496 | return count; | 525 | fprintf(stderr, "load_module_paths: modules.dep parsing failure!\n"); |
497 | 526 | ||
498 | out_failure: | 527 | out_failure: |
499 | return -1; | 528 | if (dpath) |
529 | free(dpath); | ||
530 | if (file) | ||
531 | fclose(file); | ||
532 | if (line) | ||
533 | free(line); | ||
534 | |||
535 | return err; | ||
500 | } | 536 | } |
501 | 537 | ||
502 | int mod_dso__load_modules(struct mod_dso *dso) | 538 | int mod_dso__load_modules(struct mod_dso *dso) |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 13ab4b842d49..8cfb48cbbea0 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
@@ -165,33 +165,31 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config) | |||
165 | DIR *sys_dir, *evt_dir; | 165 | DIR *sys_dir, *evt_dir; |
166 | struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; | 166 | struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; |
167 | char id_buf[4]; | 167 | char id_buf[4]; |
168 | int sys_dir_fd, fd; | 168 | int fd; |
169 | u64 id; | 169 | u64 id; |
170 | char evt_path[MAXPATHLEN]; | 170 | char evt_path[MAXPATHLEN]; |
171 | char dir_path[MAXPATHLEN]; | ||
171 | 172 | ||
172 | if (valid_debugfs_mount(debugfs_path)) | 173 | if (valid_debugfs_mount(debugfs_path)) |
173 | return NULL; | 174 | return NULL; |
174 | 175 | ||
175 | sys_dir = opendir(debugfs_path); | 176 | sys_dir = opendir(debugfs_path); |
176 | if (!sys_dir) | 177 | if (!sys_dir) |
177 | goto cleanup; | 178 | return NULL; |
178 | sys_dir_fd = dirfd(sys_dir); | ||
179 | 179 | ||
180 | for_each_subsystem(sys_dir, sys_dirent, sys_next) { | 180 | for_each_subsystem(sys_dir, sys_dirent, sys_next) { |
181 | int dfd = openat(sys_dir_fd, sys_dirent.d_name, | 181 | |
182 | O_RDONLY|O_DIRECTORY), evt_dir_fd; | 182 | snprintf(dir_path, MAXPATHLEN, "%s/%s", debugfs_path, |
183 | if (dfd == -1) | 183 | sys_dirent.d_name); |
184 | continue; | 184 | evt_dir = opendir(dir_path); |
185 | evt_dir = fdopendir(dfd); | 185 | if (!evt_dir) |
186 | if (!evt_dir) { | ||
187 | close(dfd); | ||
188 | continue; | 186 | continue; |
189 | } | 187 | |
190 | evt_dir_fd = dirfd(evt_dir); | ||
191 | for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next) { | 188 | for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next) { |
192 | snprintf(evt_path, MAXPATHLEN, "%s/id", | 189 | |
190 | snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, | ||
193 | evt_dirent.d_name); | 191 | evt_dirent.d_name); |
194 | fd = openat(evt_dir_fd, evt_path, O_RDONLY); | 192 | fd = open(evt_path, O_RDONLY); |
195 | if (fd < 0) | 193 | if (fd < 0) |
196 | continue; | 194 | continue; |
197 | if (read(fd, id_buf, sizeof(id_buf)) < 0) { | 195 | if (read(fd, id_buf, sizeof(id_buf)) < 0) { |
@@ -225,7 +223,6 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config) | |||
225 | closedir(evt_dir); | 223 | closedir(evt_dir); |
226 | } | 224 | } |
227 | 225 | ||
228 | cleanup: | ||
229 | closedir(sys_dir); | 226 | closedir(sys_dir); |
230 | return NULL; | 227 | return NULL; |
231 | } | 228 | } |
@@ -694,7 +691,10 @@ static void store_event_type(const char *orgname) | |||
694 | FILE *file; | 691 | FILE *file; |
695 | int id; | 692 | int id; |
696 | 693 | ||
697 | sprintf(filename, "/sys/kernel/debug/tracing/events/%s/id", orgname); | 694 | sprintf(filename, "%s/", debugfs_path); |
695 | strncat(filename, orgname, strlen(orgname)); | ||
696 | strcat(filename, "/id"); | ||
697 | |||
698 | c = strchr(filename, ':'); | 698 | c = strchr(filename, ':'); |
699 | if (c) | 699 | if (c) |
700 | *c = '/'; | 700 | *c = '/'; |
@@ -761,28 +761,24 @@ static void print_tracepoint_events(void) | |||
761 | { | 761 | { |
762 | DIR *sys_dir, *evt_dir; | 762 | DIR *sys_dir, *evt_dir; |
763 | struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; | 763 | struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; |
764 | int sys_dir_fd; | ||
765 | char evt_path[MAXPATHLEN]; | 764 | char evt_path[MAXPATHLEN]; |
765 | char dir_path[MAXPATHLEN]; | ||
766 | 766 | ||
767 | if (valid_debugfs_mount(debugfs_path)) | 767 | if (valid_debugfs_mount(debugfs_path)) |
768 | return; | 768 | return; |
769 | 769 | ||
770 | sys_dir = opendir(debugfs_path); | 770 | sys_dir = opendir(debugfs_path); |
771 | if (!sys_dir) | 771 | if (!sys_dir) |
772 | goto cleanup; | 772 | return; |
773 | sys_dir_fd = dirfd(sys_dir); | ||
774 | 773 | ||
775 | for_each_subsystem(sys_dir, sys_dirent, sys_next) { | 774 | for_each_subsystem(sys_dir, sys_dirent, sys_next) { |
776 | int dfd = openat(sys_dir_fd, sys_dirent.d_name, | 775 | |
777 | O_RDONLY|O_DIRECTORY), evt_dir_fd; | 776 | snprintf(dir_path, MAXPATHLEN, "%s/%s", debugfs_path, |
778 | if (dfd == -1) | 777 | sys_dirent.d_name); |
779 | continue; | 778 | evt_dir = opendir(dir_path); |
780 | evt_dir = fdopendir(dfd); | 779 | if (!evt_dir) |
781 | if (!evt_dir) { | ||
782 | close(dfd); | ||
783 | continue; | 780 | continue; |
784 | } | 781 | |
785 | evt_dir_fd = dirfd(evt_dir); | ||
786 | for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next) { | 782 | for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next) { |
787 | snprintf(evt_path, MAXPATHLEN, "%s:%s", | 783 | snprintf(evt_path, MAXPATHLEN, "%s:%s", |
788 | sys_dirent.d_name, evt_dirent.d_name); | 784 | sys_dirent.d_name, evt_dirent.d_name); |
@@ -791,8 +787,6 @@ static void print_tracepoint_events(void) | |||
791 | } | 787 | } |
792 | closedir(evt_dir); | 788 | closedir(evt_dir); |
793 | } | 789 | } |
794 | |||
795 | cleanup: | ||
796 | closedir(sys_dir); | 790 | closedir(sys_dir); |
797 | } | 791 | } |
798 | 792 | ||
diff --git a/tools/perf/util/svghelper.c b/tools/perf/util/svghelper.c index a778fd0f4ae4..856655d8b0b8 100644 --- a/tools/perf/util/svghelper.c +++ b/tools/perf/util/svghelper.c | |||
@@ -28,7 +28,7 @@ static u64 turbo_frequency, max_freq; | |||
28 | 28 | ||
29 | int svg_page_width = 1000; | 29 | int svg_page_width = 1000; |
30 | 30 | ||
31 | #define MIN_TEXT_SIZE 0.001 | 31 | #define MIN_TEXT_SIZE 0.01 |
32 | 32 | ||
33 | static u64 total_height; | 33 | static u64 total_height; |
34 | static FILE *svgfile; | 34 | static FILE *svgfile; |
@@ -217,6 +217,18 @@ static char *cpu_model(void) | |||
217 | } | 217 | } |
218 | fclose(file); | 218 | fclose(file); |
219 | } | 219 | } |
220 | |||
221 | /* CPU type */ | ||
222 | file = fopen("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies", "r"); | ||
223 | if (file) { | ||
224 | while (fgets(buf, 255, file)) { | ||
225 | unsigned int freq; | ||
226 | freq = strtoull(buf, NULL, 10); | ||
227 | if (freq > max_freq) | ||
228 | max_freq = freq; | ||
229 | } | ||
230 | fclose(file); | ||
231 | } | ||
220 | return cpu_m; | 232 | return cpu_m; |
221 | } | 233 | } |
222 | 234 | ||
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index fd3d9c8e90fc..47ea0609a760 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -324,8 +324,7 @@ static inline int elf_sym__is_function(const GElf_Sym *sym) | |||
324 | { | 324 | { |
325 | return elf_sym__type(sym) == STT_FUNC && | 325 | return elf_sym__type(sym) == STT_FUNC && |
326 | sym->st_name != 0 && | 326 | sym->st_name != 0 && |
327 | sym->st_shndx != SHN_UNDEF && | 327 | sym->st_shndx != SHN_UNDEF; |
328 | sym->st_size != 0; | ||
329 | } | 328 | } |
330 | 329 | ||
331 | static inline int elf_sym__is_label(const GElf_Sym *sym) | 330 | static inline int elf_sym__is_label(const GElf_Sym *sym) |
@@ -833,7 +832,7 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int v) | |||
833 | struct mod_dso *mods = mod_dso__new_dso("modules"); | 832 | struct mod_dso *mods = mod_dso__new_dso("modules"); |
834 | struct module *pos; | 833 | struct module *pos; |
835 | struct rb_node *next; | 834 | struct rb_node *next; |
836 | int err; | 835 | int err, count = 0; |
837 | 836 | ||
838 | err = mod_dso__load_modules(mods); | 837 | err = mod_dso__load_modules(mods); |
839 | 838 | ||
@@ -852,14 +851,16 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int v) | |||
852 | break; | 851 | break; |
853 | 852 | ||
854 | next = rb_next(&pos->rb_node); | 853 | next = rb_next(&pos->rb_node); |
854 | count += err; | ||
855 | } | 855 | } |
856 | 856 | ||
857 | if (err < 0) { | 857 | if (err < 0) { |
858 | mod_dso__delete_modules(mods); | 858 | mod_dso__delete_modules(mods); |
859 | mod_dso__delete_self(mods); | 859 | mod_dso__delete_self(mods); |
860 | return err; | ||
860 | } | 861 | } |
861 | 862 | ||
862 | return err; | 863 | return count; |
863 | } | 864 | } |
864 | 865 | ||
865 | static inline void dso__fill_symbol_holes(struct dso *self) | 866 | static inline void dso__fill_symbol_holes(struct dso *self) |
@@ -913,8 +914,15 @@ int dso__load_kernel(struct dso *self, const char *vmlinux, | |||
913 | 914 | ||
914 | if (vmlinux) { | 915 | if (vmlinux) { |
915 | err = dso__load_vmlinux(self, vmlinux, filter, v); | 916 | err = dso__load_vmlinux(self, vmlinux, filter, v); |
916 | if (err > 0 && use_modules) | 917 | if (err > 0 && use_modules) { |
917 | err = dso__load_modules(self, filter, v); | 918 | int syms = dso__load_modules(self, filter, v); |
919 | |||
920 | if (syms < 0) { | ||
921 | fprintf(stderr, "dso__load_modules failed!\n"); | ||
922 | return syms; | ||
923 | } | ||
924 | err += syms; | ||
925 | } | ||
918 | } | 926 | } |
919 | 927 | ||
920 | if (err <= 0) | 928 | if (err <= 0) |
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index f6a8437141c8..55c9659a56e2 100644 --- a/tools/perf/util/trace-event-parse.c +++ b/tools/perf/util/trace-event-parse.c | |||
@@ -618,7 +618,7 @@ static int test_type(enum event_type type, enum event_type expect) | |||
618 | } | 618 | } |
619 | 619 | ||
620 | static int test_type_token(enum event_type type, char *token, | 620 | static int test_type_token(enum event_type type, char *token, |
621 | enum event_type expect, char *expect_tok) | 621 | enum event_type expect, const char *expect_tok) |
622 | { | 622 | { |
623 | if (type != expect) { | 623 | if (type != expect) { |
624 | die("Error: expected type %d but read %d", | 624 | die("Error: expected type %d but read %d", |
@@ -650,7 +650,7 @@ static int read_expect_type(enum event_type expect, char **tok) | |||
650 | return __read_expect_type(expect, tok, 1); | 650 | return __read_expect_type(expect, tok, 1); |
651 | } | 651 | } |
652 | 652 | ||
653 | static int __read_expected(enum event_type expect, char *str, int newline_ok) | 653 | static int __read_expected(enum event_type expect, const char *str, int newline_ok) |
654 | { | 654 | { |
655 | enum event_type type; | 655 | enum event_type type; |
656 | char *token; | 656 | char *token; |
@@ -668,12 +668,12 @@ static int __read_expected(enum event_type expect, char *str, int newline_ok) | |||
668 | return 0; | 668 | return 0; |
669 | } | 669 | } |
670 | 670 | ||
671 | static int read_expected(enum event_type expect, char *str) | 671 | static int read_expected(enum event_type expect, const char *str) |
672 | { | 672 | { |
673 | return __read_expected(expect, str, 1); | 673 | return __read_expected(expect, str, 1); |
674 | } | 674 | } |
675 | 675 | ||
676 | static int read_expected_item(enum event_type expect, char *str) | 676 | static int read_expected_item(enum event_type expect, const char *str) |
677 | { | 677 | { |
678 | return __read_expected(expect, str, 0); | 678 | return __read_expected(expect, str, 0); |
679 | } | 679 | } |
@@ -1968,10 +1968,11 @@ static const struct flag flags[] = { | |||
1968 | { "NET_TX_SOFTIRQ", 2 }, | 1968 | { "NET_TX_SOFTIRQ", 2 }, |
1969 | { "NET_RX_SOFTIRQ", 3 }, | 1969 | { "NET_RX_SOFTIRQ", 3 }, |
1970 | { "BLOCK_SOFTIRQ", 4 }, | 1970 | { "BLOCK_SOFTIRQ", 4 }, |
1971 | { "TASKLET_SOFTIRQ", 5 }, | 1971 | { "BLOCK_IOPOLL_SOFTIRQ", 5 }, |
1972 | { "SCHED_SOFTIRQ", 6 }, | 1972 | { "TASKLET_SOFTIRQ", 6 }, |
1973 | { "HRTIMER_SOFTIRQ", 7 }, | 1973 | { "SCHED_SOFTIRQ", 7 }, |
1974 | { "RCU_SOFTIRQ", 8 }, | 1974 | { "HRTIMER_SOFTIRQ", 8 }, |
1975 | { "RCU_SOFTIRQ", 9 }, | ||
1975 | 1976 | ||
1976 | { "HRTIMER_NORESTART", 0 }, | 1977 | { "HRTIMER_NORESTART", 0 }, |
1977 | { "HRTIMER_RESTART", 1 }, | 1978 | { "HRTIMER_RESTART", 1 }, |