perf probe: Do not use map_load filters for function
Arnaldo Carvalho de Melo
maintainerPATCH 1/1 perf probe: Do not use map_load filters for function
From: Arnaldo Carvalho de Melo <[email protected]>
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 #
Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Masami Hiramatsu <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/probe-event.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-)
tools/perf/util/probe-event.c +10 -19
@@ -3289,24 +3289,10 @@ out:return ret; } -/* TODO: don't use a global variable for filter ... */ -static struct strfilter *available_func_filter; - -/* -* If a symbol corresponds to a function with global binding and -* matches filter return 0. For all others return 1. -*/ -static int filter_available_functions (struct map *map__maybe_unused , -struct symbol *sym) -{ -if (strfilter__compare (available_func_filter, sym->name)) -return 0 ; -return 1 ; -} -int show_available_funcs (const char *target,struct strfilter *_filter,bool user) { +struct rb_node *nd;struct map *map;int ret;
@@ -3324,9 +3310,7 @@ int show_available_funcs(const char *target, struct strfilter *_filter,return -EINVAL ; } -/* Load symbols with given filter */ - available_func_filter = _filter; - ret =map__load (map, filter_available_functions); + ret =map__load (map,NULL );if (ret) {if (ret ==-2 ) {char *str =strfilter__string (_filter);
@@ -3343,7 +3327,14 @@ int show_available_funcs(const char *target, struct strfilter *_filter,/* Show all (filtered) symbols */ setup_pager (); -dso__fprintf_symbols_by_name (map->dso, map->type, stdout); + +for (nd =rb_first (&map->dso->symbol_names[map->type]); nd; nd =rb_next (nd)) { + struct symbol_name_rb_node *pos = rb_entry(nd, struct symbol_name_rb_node, rb_node); + +if (strfilter__compare (_filter, pos->sym.name)) +printf ("%s\n" , pos->sym.name); + } + end:if (user) {map__put (map);
Signature · 1 line
2.7.4
Quoted 37 lines · On Wed, 31 Aug 2016 10:04:27 -0300 Arnaldo Carvalho de Melo <[email protected]>…
From: Arnaldo Carvalho de Melo <[email protected]>
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:
Quoted 10 lines
# 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 #
Looks good to me!
Acked-by Masami Hiramatsu <[email protected]>
Thanks!
Quoted 73 lines
Cc Adrian Hunter <[email protected]>Cc David Ahern <[email protected]>Cc Jiri Olsa <[email protected]>Cc Masami Hiramatsu <[email protected]>Cc Namhyung Kim <[email protected]>Cc Wang Nan <[email protected]>Signed-off-by Arnaldo Carvalho de Melo <[email protected]>--- tools/perf/util/probe-event.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-)tools/perf/util/probe-event.c +10
-19@@ -3289,24 +3289,10 @@ out:return ret; } -/* TODO: don't use a global variable for filter ... */ -static struct strfilter *available_func_filter; - -/* -* If a symbol corresponds to a function with global binding and -* matches filter return 0. For all others return 1. -*/ -static int filter_available_functions (struct map *map__maybe_unused , -struct symbol *sym) -{ -if (strfilter__compare (available_func_filter, sym->name)) -return 0 ; -return 1 ; -} -int show_available_funcs (const char *target,struct strfilter *_filter,bool user) { +struct rb_node *nd;struct map *map;int ret;@@ -3324,9 +3310,7 @@ int show_available_funcs(const char *target, struct strfilter *_filter,return -EINVAL ; } -/* Load symbols with given filter */ - available_func_filter = _filter; - ret =map__load (map, filter_available_functions); + ret =map__load (map,NULL );if (ret) {if (ret ==-2 ) {char *str =strfilter__string (_filter);@@ -3343,7 +3327,14 @@ int show_available_funcs(const char *target, struct strfilter *_filter,/* Show all (filtered) symbols */ setup_pager (); -dso__fprintf_symbols_by_name (map->dso, map->type, stdout); + +for (nd =rb_first (&map->dso->symbol_names[map->type]); nd; nd =rb_next (nd)) { + struct symbol_name_rb_node *pos = rb_entry(nd, struct symbol_name_rb_node, rb_node); + +if (strfilter__compare (_filter, pos->sym.name)) +printf ("%s\n" , pos->sym.name); + } + end:if (user) {map__put (map);Signature · 1 line
2.7.4
Signature · 1 line
Masami Hiramatsu <[email protected]>
tip-bot for Arnaldo Carvalho de Melo
merge botperf probe: Do not use map_load filters for function
Commit-ID: fd2275984d6e29c6737646ff39dd3de87a03f300 Gitweb: http://git.kernel.org/tip/fd2275984d6e29c6737646ff39dd3de87a03f300 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Wed, 31 Aug 2016 10:04:27 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 1 Sep 2016 09:43:57 -0300
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 <[email protected]>
Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/probe-event.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-)
tools/perf/util/probe-event.c +10 -19
@@ -3289,24 +3289,10 @@ out:return ret; } -/* TODO: don't use a global variable for filter ... */ -static struct strfilter *available_func_filter; - -/* -* If a symbol corresponds to a function with global binding and -* matches filter return 0. For all others return 1. -*/ -static int filter_available_functions (struct map *map__maybe_unused , -struct symbol *sym) -{ -if (strfilter__compare (available_func_filter, sym->name)) -return 0 ; -return 1 ; -} -int show_available_funcs (const char *target,struct strfilter *_filter,bool user) { +struct rb_node *nd;struct map *map;int ret;
@@ -3324,9 +3310,7 @@ int show_available_funcs(const char *target, struct strfilter *_filter,return -EINVAL ; } -/* Load symbols with given filter */ - available_func_filter = _filter; - ret =map__load (map, filter_available_functions); + ret =map__load (map,NULL );if (ret) {if (ret ==-2 ) {char *str =strfilter__string (_filter);
@@ -3343,7 +3327,14 @@ int show_available_funcs(const char *target, struct strfilter *_filter,/* Show all (filtered) symbols */ setup_pager (); -dso__fprintf_symbols_by_name (map->dso, map->type, stdout); + +for (nd =rb_first (&map->dso->symbol_names[map->type]); nd; nd =rb_next (nd)) { + struct symbol_name_rb_node *pos = rb_entry(nd, struct symbol_name_rb_node, rb_node); + +if (strfilter__compare (_filter, pos->sym.name)) +printf ("%s\n" , pos->sym.name); + } + end:if (user) {map__put (map);