diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/lib/lockdep/include/liblockdep/mutex.h | 4 | ||||
| -rw-r--r-- | tools/lib/lockdep/include/liblockdep/rwlock.h | 8 | ||||
| -rw-r--r-- | tools/lib/lockdep/preload.c | 20 | ||||
| -rw-r--r-- | tools/perf/ui/browsers/hists.c | 21 | ||||
| -rw-r--r-- | tools/perf/util/machine.c | 54 |
5 files changed, 53 insertions, 54 deletions
diff --git a/tools/lib/lockdep/include/liblockdep/mutex.h b/tools/lib/lockdep/include/liblockdep/mutex.h index c342f7087147..ee53a42818ca 100644 --- a/tools/lib/lockdep/include/liblockdep/mutex.h +++ b/tools/lib/lockdep/include/liblockdep/mutex.h | |||
| @@ -35,7 +35,7 @@ static inline int __mutex_init(liblockdep_pthread_mutex_t *lock, | |||
| 35 | 35 | ||
| 36 | static inline int liblockdep_pthread_mutex_lock(liblockdep_pthread_mutex_t *lock) | 36 | static inline int liblockdep_pthread_mutex_lock(liblockdep_pthread_mutex_t *lock) |
| 37 | { | 37 | { |
| 38 | lock_acquire(&lock->dep_map, 0, 0, 0, 2, NULL, (unsigned long)_RET_IP_); | 38 | lock_acquire(&lock->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); |
| 39 | return pthread_mutex_lock(&lock->mutex); | 39 | return pthread_mutex_lock(&lock->mutex); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| @@ -47,7 +47,7 @@ static inline int liblockdep_pthread_mutex_unlock(liblockdep_pthread_mutex_t *lo | |||
| 47 | 47 | ||
| 48 | static inline int liblockdep_pthread_mutex_trylock(liblockdep_pthread_mutex_t *lock) | 48 | static inline int liblockdep_pthread_mutex_trylock(liblockdep_pthread_mutex_t *lock) |
| 49 | { | 49 | { |
| 50 | lock_acquire(&lock->dep_map, 0, 1, 0, 2, NULL, (unsigned long)_RET_IP_); | 50 | lock_acquire(&lock->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); |
| 51 | return pthread_mutex_trylock(&lock->mutex) == 0 ? 1 : 0; | 51 | return pthread_mutex_trylock(&lock->mutex) == 0 ? 1 : 0; |
| 52 | } | 52 | } |
| 53 | 53 | ||
diff --git a/tools/lib/lockdep/include/liblockdep/rwlock.h b/tools/lib/lockdep/include/liblockdep/rwlock.h index a680ab8c2e36..4ec03f861551 100644 --- a/tools/lib/lockdep/include/liblockdep/rwlock.h +++ b/tools/lib/lockdep/include/liblockdep/rwlock.h | |||
| @@ -36,7 +36,7 @@ static inline int __rwlock_init(liblockdep_pthread_rwlock_t *lock, | |||
| 36 | 36 | ||
| 37 | static inline int liblockdep_pthread_rwlock_rdlock(liblockdep_pthread_rwlock_t *lock) | 37 | static inline int liblockdep_pthread_rwlock_rdlock(liblockdep_pthread_rwlock_t *lock) |
| 38 | { | 38 | { |
| 39 | lock_acquire(&lock->dep_map, 0, 0, 2, 2, NULL, (unsigned long)_RET_IP_); | 39 | lock_acquire(&lock->dep_map, 0, 0, 2, 1, NULL, (unsigned long)_RET_IP_); |
| 40 | return pthread_rwlock_rdlock(&lock->rwlock); | 40 | return pthread_rwlock_rdlock(&lock->rwlock); |
| 41 | 41 | ||
| 42 | } | 42 | } |
| @@ -49,19 +49,19 @@ static inline int liblockdep_pthread_rwlock_unlock(liblockdep_pthread_rwlock_t * | |||
| 49 | 49 | ||
| 50 | static inline int liblockdep_pthread_rwlock_wrlock(liblockdep_pthread_rwlock_t *lock) | 50 | static inline int liblockdep_pthread_rwlock_wrlock(liblockdep_pthread_rwlock_t *lock) |
| 51 | { | 51 | { |
| 52 | lock_acquire(&lock->dep_map, 0, 0, 0, 2, NULL, (unsigned long)_RET_IP_); | 52 | lock_acquire(&lock->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); |
| 53 | return pthread_rwlock_wrlock(&lock->rwlock); | 53 | return pthread_rwlock_wrlock(&lock->rwlock); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | static inline int liblockdep_pthread_rwlock_tryrdlock(liblockdep_pthread_rwlock_t *lock) | 56 | static inline int liblockdep_pthread_rwlock_tryrdlock(liblockdep_pthread_rwlock_t *lock) |
| 57 | { | 57 | { |
| 58 | lock_acquire(&lock->dep_map, 0, 1, 2, 2, NULL, (unsigned long)_RET_IP_); | 58 | lock_acquire(&lock->dep_map, 0, 1, 2, 1, NULL, (unsigned long)_RET_IP_); |
| 59 | return pthread_rwlock_tryrdlock(&lock->rwlock) == 0 ? 1 : 0; | 59 | return pthread_rwlock_tryrdlock(&lock->rwlock) == 0 ? 1 : 0; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | static inline int liblockdep_pthread_rwlock_trywlock(liblockdep_pthread_rwlock_t *lock) | 62 | static inline int liblockdep_pthread_rwlock_trywlock(liblockdep_pthread_rwlock_t *lock) |
| 63 | { | 63 | { |
| 64 | lock_acquire(&lock->dep_map, 0, 1, 0, 2, NULL, (unsigned long)_RET_IP_); | 64 | lock_acquire(&lock->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); |
| 65 | return pthread_rwlock_trywlock(&lock->rwlock) == 0 ? 1 : 0; | 65 | return pthread_rwlock_trywlock(&lock->rwlock) == 0 ? 1 : 0; |
| 66 | } | 66 | } |
| 67 | 67 | ||
diff --git a/tools/lib/lockdep/preload.c b/tools/lib/lockdep/preload.c index 23bd69cb5ade..6f803609e498 100644 --- a/tools/lib/lockdep/preload.c +++ b/tools/lib/lockdep/preload.c | |||
| @@ -92,7 +92,7 @@ enum { none, prepare, done, } __init_state; | |||
| 92 | static void init_preload(void); | 92 | static void init_preload(void); |
| 93 | static void try_init_preload(void) | 93 | static void try_init_preload(void) |
| 94 | { | 94 | { |
| 95 | if (!__init_state != done) | 95 | if (__init_state != done) |
| 96 | init_preload(); | 96 | init_preload(); |
| 97 | } | 97 | } |
| 98 | 98 | ||
| @@ -252,7 +252,7 @@ int pthread_mutex_lock(pthread_mutex_t *mutex) | |||
| 252 | 252 | ||
| 253 | try_init_preload(); | 253 | try_init_preload(); |
| 254 | 254 | ||
| 255 | lock_acquire(&__get_lock(mutex)->dep_map, 0, 0, 0, 2, NULL, | 255 | lock_acquire(&__get_lock(mutex)->dep_map, 0, 0, 0, 1, NULL, |
| 256 | (unsigned long)_RET_IP_); | 256 | (unsigned long)_RET_IP_); |
| 257 | /* | 257 | /* |
| 258 | * Here's the thing with pthread mutexes: unlike the kernel variant, | 258 | * Here's the thing with pthread mutexes: unlike the kernel variant, |
| @@ -281,7 +281,7 @@ int pthread_mutex_trylock(pthread_mutex_t *mutex) | |||
| 281 | 281 | ||
| 282 | try_init_preload(); | 282 | try_init_preload(); |
| 283 | 283 | ||
| 284 | lock_acquire(&__get_lock(mutex)->dep_map, 0, 1, 0, 2, NULL, (unsigned long)_RET_IP_); | 284 | lock_acquire(&__get_lock(mutex)->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); |
| 285 | r = ll_pthread_mutex_trylock(mutex); | 285 | r = ll_pthread_mutex_trylock(mutex); |
| 286 | if (r) | 286 | if (r) |
| 287 | lock_release(&__get_lock(mutex)->dep_map, 0, (unsigned long)_RET_IP_); | 287 | lock_release(&__get_lock(mutex)->dep_map, 0, (unsigned long)_RET_IP_); |
| @@ -303,7 +303,7 @@ int pthread_mutex_unlock(pthread_mutex_t *mutex) | |||
| 303 | */ | 303 | */ |
| 304 | r = ll_pthread_mutex_unlock(mutex); | 304 | r = ll_pthread_mutex_unlock(mutex); |
| 305 | if (r) | 305 | if (r) |
| 306 | lock_acquire(&__get_lock(mutex)->dep_map, 0, 0, 0, 2, NULL, (unsigned long)_RET_IP_); | 306 | lock_acquire(&__get_lock(mutex)->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); |
| 307 | 307 | ||
| 308 | return r; | 308 | return r; |
| 309 | } | 309 | } |
| @@ -352,7 +352,7 @@ int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock) | |||
| 352 | 352 | ||
| 353 | init_preload(); | 353 | init_preload(); |
| 354 | 354 | ||
| 355 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 0, 2, 2, NULL, (unsigned long)_RET_IP_); | 355 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 0, 2, 1, NULL, (unsigned long)_RET_IP_); |
| 356 | r = ll_pthread_rwlock_rdlock(rwlock); | 356 | r = ll_pthread_rwlock_rdlock(rwlock); |
| 357 | if (r) | 357 | if (r) |
| 358 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); | 358 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); |
| @@ -366,7 +366,7 @@ int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) | |||
| 366 | 366 | ||
| 367 | init_preload(); | 367 | init_preload(); |
| 368 | 368 | ||
| 369 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 1, 2, 2, NULL, (unsigned long)_RET_IP_); | 369 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 1, 2, 1, NULL, (unsigned long)_RET_IP_); |
| 370 | r = ll_pthread_rwlock_tryrdlock(rwlock); | 370 | r = ll_pthread_rwlock_tryrdlock(rwlock); |
| 371 | if (r) | 371 | if (r) |
| 372 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); | 372 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); |
| @@ -380,7 +380,7 @@ int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock) | |||
| 380 | 380 | ||
| 381 | init_preload(); | 381 | init_preload(); |
| 382 | 382 | ||
| 383 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 1, 0, 2, NULL, (unsigned long)_RET_IP_); | 383 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); |
| 384 | r = ll_pthread_rwlock_trywrlock(rwlock); | 384 | r = ll_pthread_rwlock_trywrlock(rwlock); |
| 385 | if (r) | 385 | if (r) |
| 386 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); | 386 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); |
| @@ -394,7 +394,7 @@ int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock) | |||
| 394 | 394 | ||
| 395 | init_preload(); | 395 | init_preload(); |
| 396 | 396 | ||
| 397 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 0, 0, 2, NULL, (unsigned long)_RET_IP_); | 397 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); |
| 398 | r = ll_pthread_rwlock_wrlock(rwlock); | 398 | r = ll_pthread_rwlock_wrlock(rwlock); |
| 399 | if (r) | 399 | if (r) |
| 400 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); | 400 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); |
| @@ -411,7 +411,7 @@ int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) | |||
| 411 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); | 411 | lock_release(&__get_lock(rwlock)->dep_map, 0, (unsigned long)_RET_IP_); |
| 412 | r = ll_pthread_rwlock_unlock(rwlock); | 412 | r = ll_pthread_rwlock_unlock(rwlock); |
| 413 | if (r) | 413 | if (r) |
| 414 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 0, 0, 2, NULL, (unsigned long)_RET_IP_); | 414 | lock_acquire(&__get_lock(rwlock)->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); |
| 415 | 415 | ||
| 416 | return r; | 416 | return r; |
| 417 | } | 417 | } |
| @@ -439,8 +439,6 @@ __attribute__((constructor)) static void init_preload(void) | |||
| 439 | ll_pthread_rwlock_unlock = dlsym(RTLD_NEXT, "pthread_rwlock_unlock"); | 439 | ll_pthread_rwlock_unlock = dlsym(RTLD_NEXT, "pthread_rwlock_unlock"); |
| 440 | #endif | 440 | #endif |
| 441 | 441 | ||
| 442 | printf("%p\n", ll_pthread_mutex_trylock);fflush(stdout); | ||
| 443 | |||
| 444 | lockdep_init(); | 442 | lockdep_init(); |
| 445 | 443 | ||
| 446 | __init_state = done; | 444 | __init_state = done; |
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index 52c03fbbba17..04a229aa5c0f 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include "../util.h" | 17 | #include "../util.h" |
| 18 | #include "../ui.h" | 18 | #include "../ui.h" |
| 19 | #include "map.h" | 19 | #include "map.h" |
| 20 | #include "annotate.h" | ||
| 20 | 21 | ||
| 21 | struct hist_browser { | 22 | struct hist_browser { |
| 22 | struct ui_browser b; | 23 | struct ui_browser b; |
| @@ -1593,13 +1594,18 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, | |||
| 1593 | bi->to.sym->name) > 0) | 1594 | bi->to.sym->name) > 0) |
| 1594 | annotate_t = nr_options++; | 1595 | annotate_t = nr_options++; |
| 1595 | } else { | 1596 | } else { |
| 1596 | |||
| 1597 | if (browser->selection != NULL && | 1597 | if (browser->selection != NULL && |
| 1598 | browser->selection->sym != NULL && | 1598 | browser->selection->sym != NULL && |
| 1599 | !browser->selection->map->dso->annotate_warned && | 1599 | !browser->selection->map->dso->annotate_warned) { |
| 1600 | asprintf(&options[nr_options], "Annotate %s", | 1600 | struct annotation *notes; |
| 1601 | browser->selection->sym->name) > 0) | 1601 | |
| 1602 | annotate = nr_options++; | 1602 | notes = symbol__annotation(browser->selection->sym); |
| 1603 | |||
| 1604 | if (notes->src && | ||
| 1605 | asprintf(&options[nr_options], "Annotate %s", | ||
| 1606 | browser->selection->sym->name) > 0) | ||
| 1607 | annotate = nr_options++; | ||
| 1608 | } | ||
| 1603 | } | 1609 | } |
| 1604 | 1610 | ||
| 1605 | if (thread != NULL && | 1611 | if (thread != NULL && |
| @@ -1656,6 +1662,7 @@ retry_popup_menu: | |||
| 1656 | 1662 | ||
| 1657 | if (choice == annotate || choice == annotate_t || choice == annotate_f) { | 1663 | if (choice == annotate || choice == annotate_t || choice == annotate_f) { |
| 1658 | struct hist_entry *he; | 1664 | struct hist_entry *he; |
| 1665 | struct annotation *notes; | ||
| 1659 | int err; | 1666 | int err; |
| 1660 | do_annotate: | 1667 | do_annotate: |
| 1661 | if (!objdump_path && perf_session_env__lookup_objdump(env)) | 1668 | if (!objdump_path && perf_session_env__lookup_objdump(env)) |
| @@ -1679,6 +1686,10 @@ do_annotate: | |||
| 1679 | he->ms.map = he->branch_info->to.map; | 1686 | he->ms.map = he->branch_info->to.map; |
| 1680 | } | 1687 | } |
| 1681 | 1688 | ||
| 1689 | notes = symbol__annotation(he->ms.sym); | ||
| 1690 | if (!notes->src) | ||
| 1691 | continue; | ||
| 1692 | |||
| 1682 | /* | 1693 | /* |
| 1683 | * Don't let this be freed, say, by hists__decay_entry. | 1694 | * Don't let this be freed, say, by hists__decay_entry. |
| 1684 | */ | 1695 | */ |
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 0e5fea95d596..c73e1fc12e53 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c | |||
| @@ -496,18 +496,6 @@ struct process_args { | |||
| 496 | u64 start; | 496 | u64 start; |
| 497 | }; | 497 | }; |
| 498 | 498 | ||
| 499 | static int symbol__in_kernel(void *arg, const char *name, | ||
| 500 | char type __maybe_unused, u64 start) | ||
| 501 | { | ||
| 502 | struct process_args *args = arg; | ||
| 503 | |||
| 504 | if (strchr(name, '[')) | ||
| 505 | return 0; | ||
| 506 | |||
| 507 | args->start = start; | ||
| 508 | return 1; | ||
| 509 | } | ||
| 510 | |||
| 511 | static void machine__get_kallsyms_filename(struct machine *machine, char *buf, | 499 | static void machine__get_kallsyms_filename(struct machine *machine, char *buf, |
| 512 | size_t bufsz) | 500 | size_t bufsz) |
| 513 | { | 501 | { |
| @@ -517,27 +505,41 @@ static void machine__get_kallsyms_filename(struct machine *machine, char *buf, | |||
| 517 | scnprintf(buf, bufsz, "%s/proc/kallsyms", machine->root_dir); | 505 | scnprintf(buf, bufsz, "%s/proc/kallsyms", machine->root_dir); |
| 518 | } | 506 | } |
| 519 | 507 | ||
| 520 | /* Figure out the start address of kernel map from /proc/kallsyms */ | 508 | const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL}; |
| 521 | static u64 machine__get_kernel_start_addr(struct machine *machine) | 509 | |
| 510 | /* Figure out the start address of kernel map from /proc/kallsyms. | ||
| 511 | * Returns the name of the start symbol in *symbol_name. Pass in NULL as | ||
| 512 | * symbol_name if it's not that important. | ||
| 513 | */ | ||
| 514 | static u64 machine__get_kernel_start_addr(struct machine *machine, | ||
| 515 | const char **symbol_name) | ||
| 522 | { | 516 | { |
| 523 | char filename[PATH_MAX]; | 517 | char filename[PATH_MAX]; |
| 524 | struct process_args args; | 518 | int i; |
| 519 | const char *name; | ||
| 520 | u64 addr = 0; | ||
| 525 | 521 | ||
| 526 | machine__get_kallsyms_filename(machine, filename, PATH_MAX); | 522 | machine__get_kallsyms_filename(machine, filename, PATH_MAX); |
| 527 | 523 | ||
| 528 | if (symbol__restricted_filename(filename, "/proc/kallsyms")) | 524 | if (symbol__restricted_filename(filename, "/proc/kallsyms")) |
| 529 | return 0; | 525 | return 0; |
| 530 | 526 | ||
| 531 | if (kallsyms__parse(filename, &args, symbol__in_kernel) <= 0) | 527 | for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) { |
| 532 | return 0; | 528 | addr = kallsyms__get_function_start(filename, name); |
| 529 | if (addr) | ||
| 530 | break; | ||
| 531 | } | ||
| 532 | |||
| 533 | if (symbol_name) | ||
| 534 | *symbol_name = name; | ||
| 533 | 535 | ||
| 534 | return args.start; | 536 | return addr; |
| 535 | } | 537 | } |
| 536 | 538 | ||
| 537 | int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel) | 539 | int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel) |
| 538 | { | 540 | { |
| 539 | enum map_type type; | 541 | enum map_type type; |
| 540 | u64 start = machine__get_kernel_start_addr(machine); | 542 | u64 start = machine__get_kernel_start_addr(machine, NULL); |
| 541 | 543 | ||
| 542 | for (type = 0; type < MAP__NR_TYPES; ++type) { | 544 | for (type = 0; type < MAP__NR_TYPES; ++type) { |
| 543 | struct kmap *kmap; | 545 | struct kmap *kmap; |
| @@ -852,23 +854,11 @@ static int machine__create_modules(struct machine *machine) | |||
| 852 | return 0; | 854 | return 0; |
| 853 | } | 855 | } |
| 854 | 856 | ||
| 855 | const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL}; | ||
| 856 | |||
| 857 | int machine__create_kernel_maps(struct machine *machine) | 857 | int machine__create_kernel_maps(struct machine *machine) |
| 858 | { | 858 | { |
| 859 | struct dso *kernel = machine__get_kernel(machine); | 859 | struct dso *kernel = machine__get_kernel(machine); |
| 860 | char filename[PATH_MAX]; | ||
| 861 | const char *name; | 860 | const char *name; |
| 862 | u64 addr = 0; | 861 | u64 addr = machine__get_kernel_start_addr(machine, &name); |
| 863 | int i; | ||
| 864 | |||
| 865 | machine__get_kallsyms_filename(machine, filename, PATH_MAX); | ||
| 866 | |||
| 867 | for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) { | ||
| 868 | addr = kallsyms__get_function_start(filename, name); | ||
| 869 | if (addr) | ||
| 870 | break; | ||
| 871 | } | ||
| 872 | if (!addr) | 862 | if (!addr) |
| 873 | return -1; | 863 | return -1; |
| 874 | 864 | ||
