Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf probe: Do not use map_load filters for function

It is simpler to just do the loop, no need for globals and the last user
of such facility disappears.

Testing:

# perf probe -F [a-z]*recvmsg
aead_recvmsg
compat_SyS_recvmsg
compat_sys_recvmsg
hash_recvmsg
inet_recvmsg
kernel_recvmsg
netlink_recvmsg
packet_recvmsg
ping_recvmsg
raw_recvmsg
rawv6_recvmsg
rng_recvmsg
security_socket_recvmsg
selinux_socket_recvmsg
skcipher_recvmsg
sock_common_recvmsg
sock_no_recvmsg
sock_recvmsg
sys_recvmsg
tcp_recvmsg
udp_recvmsg
udpv6_recvmsg
unix_dgram_recvmsg
unix_seqpacket_recvmsg
unix_stream_recvmsg
#

Without filters:

# perf probe -F | tail -5
zswap_pool_create
zswap_pool_current
zswap_update_total_size
zswap_writeback_entry
zswap_zpool_param_set
#
# perf probe -F | wc -l
33311
#

Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/20160831130427.GA13095@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

+10 -19
+10 -19
tools/perf/util/probe-event.c
··· 3289 3289 return ret; 3290 3290 } 3291 3291 3292 - /* TODO: don't use a global variable for filter ... */ 3293 - static struct strfilter *available_func_filter; 3294 - 3295 - /* 3296 - * If a symbol corresponds to a function with global binding and 3297 - * matches filter return 0. For all others return 1. 3298 - */ 3299 - static int filter_available_functions(struct map *map __maybe_unused, 3300 - struct symbol *sym) 3301 - { 3302 - if (strfilter__compare(available_func_filter, sym->name)) 3303 - return 0; 3304 - return 1; 3305 - } 3306 - 3307 3292 int show_available_funcs(const char *target, struct strfilter *_filter, 3308 3293 bool user) 3309 3294 { 3295 + struct rb_node *nd; 3310 3296 struct map *map; 3311 3297 int ret; 3312 3298 ··· 3310 3324 return -EINVAL; 3311 3325 } 3312 3326 3313 - /* Load symbols with given filter */ 3314 - available_func_filter = _filter; 3315 - ret = map__load(map, filter_available_functions); 3327 + ret = map__load(map, NULL); 3316 3328 if (ret) { 3317 3329 if (ret == -2) { 3318 3330 char *str = strfilter__string(_filter); ··· 3327 3343 3328 3344 /* Show all (filtered) symbols */ 3329 3345 setup_pager(); 3330 - dso__fprintf_symbols_by_name(map->dso, map->type, stdout); 3346 + 3347 + for (nd = rb_first(&map->dso->symbol_names[map->type]); nd; nd = rb_next(nd)) { 3348 + struct symbol_name_rb_node *pos = rb_entry(nd, struct symbol_name_rb_node, rb_node); 3349 + 3350 + if (strfilter__compare(_filter, pos->sym.name)) 3351 + printf("%s\n", pos->sym.name); 3352 + } 3353 + 3331 3354 end: 3332 3355 if (user) { 3333 3356 map__put(map);