diff options
Diffstat (limited to 'tools/perf/builtin-top.c')
-rw-r--r-- | tools/perf/builtin-top.c | 44 |
1 files changed, 9 insertions, 35 deletions
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 7a3c0c7aad3d..e0a374d0e43a 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -929,55 +929,28 @@ static int symbol_filter(struct map *map, struct symbol *sym) | |||
929 | static void event__process_sample(const event_t *self, int counter) | 929 | static void event__process_sample(const event_t *self, int counter) |
930 | { | 930 | { |
931 | u64 ip = self->ip.ip; | 931 | u64 ip = self->ip.ip; |
932 | struct map *map; | ||
933 | struct sym_entry *syme; | 932 | struct sym_entry *syme; |
934 | struct symbol *sym; | 933 | struct addr_location al; |
935 | u8 origin = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; | 934 | u8 origin = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; |
936 | 935 | ||
937 | switch (origin) { | 936 | switch (origin) { |
938 | case PERF_RECORD_MISC_USER: { | 937 | case PERF_RECORD_MISC_USER: |
939 | struct thread *thread; | ||
940 | |||
941 | if (hide_user_symbols) | 938 | if (hide_user_symbols) |
942 | return; | 939 | return; |
943 | 940 | break; | |
944 | thread = threads__findnew(self->ip.pid); | ||
945 | if (thread == NULL) | ||
946 | return; | ||
947 | |||
948 | map = thread__find_map(thread, MAP__FUNCTION, ip); | ||
949 | if (map != NULL) { | ||
950 | ip = map->map_ip(map, ip); | ||
951 | sym = map__find_symbol(map, ip, symbol_filter); | ||
952 | if (sym == NULL) | ||
953 | return; | ||
954 | userspace_samples++; | ||
955 | break; | ||
956 | } | ||
957 | } | ||
958 | /* | ||
959 | * If this is outside of all known maps, | ||
960 | * and is a negative address, try to look it | ||
961 | * up in the kernel dso, as it might be a | ||
962 | * vsyscall or vdso (which executes in user-mode). | ||
963 | */ | ||
964 | if ((long long)ip >= 0) | ||
965 | return; | ||
966 | /* Fall thru */ | ||
967 | case PERF_RECORD_MISC_KERNEL: | 941 | case PERF_RECORD_MISC_KERNEL: |
968 | if (hide_kernel_symbols) | 942 | if (hide_kernel_symbols) |
969 | return; | 943 | return; |
970 | |||
971 | sym = kernel_maps__find_function(ip, &map, symbol_filter); | ||
972 | if (sym == NULL) | ||
973 | return; | ||
974 | break; | 944 | break; |
975 | default: | 945 | default: |
976 | return; | 946 | return; |
977 | } | 947 | } |
978 | 948 | ||
979 | syme = symbol__priv(sym); | 949 | if (event__preprocess_sample(self, &al, symbol_filter) < 0 || |
950 | al.sym == NULL) | ||
951 | return; | ||
980 | 952 | ||
953 | syme = symbol__priv(al.sym); | ||
981 | if (!syme->skip) { | 954 | if (!syme->skip) { |
982 | syme->count[counter]++; | 955 | syme->count[counter]++; |
983 | syme->origin = origin; | 956 | syme->origin = origin; |
@@ -986,8 +959,9 @@ static void event__process_sample(const event_t *self, int counter) | |||
986 | if (list_empty(&syme->node) || !syme->node.next) | 959 | if (list_empty(&syme->node) || !syme->node.next) |
987 | __list_insert_active_sym(syme); | 960 | __list_insert_active_sym(syme); |
988 | pthread_mutex_unlock(&active_symbols_lock); | 961 | pthread_mutex_unlock(&active_symbols_lock); |
962 | if (origin == PERF_RECORD_MISC_USER) | ||
963 | ++userspace_samples; | ||
989 | ++samples; | 964 | ++samples; |
990 | return; | ||
991 | } | 965 | } |
992 | } | 966 | } |
993 | 967 | ||