perf tools: Use kmod_path__parse in map_groups__set_modules_path_dir
tip-bot for Jiri Olsa
merge botCommit-ID: bb58a8a459c322196613ad4af8801de41469cebb Gitweb: http://git.kernel.org/tip/bb58a8a459c322196613ad4af8801de41469cebb Author: Jiri Olsa <[email protected]> AuthorDate: Thu, 12 Feb 2015 22:20:01 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 23 Mar 2015 11:43:25 -0300
perf tools: Use kmod_path__parse in map_groups__set_modules_path_dir
Replacing the file name parsing with kmod_path__parse and moving the dso update into new separate function.
Signed-off-by Jiri Olsa <[email protected]>
Acked-by Namhyung Kim <[email protected]>
Cc Adrian Hunter <[email protected]>
Cc Corey Ashford <[email protected]>
Cc David Ahern <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/machine.c | 65 ++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 24 deletions(-)
tools/perf/util/machine.c +41 -24
@@ -851,6 +851,39 @@ static char *get_kernel_version(const char *root_dir)return strdup (name); } +static bool is_kmod_dso (struct dso *dso) +{ +return dso->symtab_type ==DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE || + dso->symtab_type ==DSO_BINARY_TYPE__GUEST_KMODULE ; +} + +static int map_groups__set_module_path (struct map_groups *mg,const char *path, +struct kmod_path *m) +{ +struct map *map; +char *long_name; + + map =map_groups__find_by_name (mg,MAP__FUNCTION , m->name); +if (map ==NULL ) +return 0 ; + + long_name =strdup (path); +if (long_name ==NULL ) +return -ENOMEM ; + +dso__set_long_name (map->dso, long_name, true); +dso__kernel_module_get_build_id (map->dso,"" ); + +/* +* Full name could reveal us kmod compression, so +* we need to update the symtab_type if needed. +*/ +if (m->comp &&is_kmod_dso (map->dso)) + map->dso->symtab_type++; + +return 0 ; +} +static int map_groups__set_modules_path_dir (struct map_groups *mg,const char *dir_name,int depth) {
@@ -889,35 +922,19 @@ static int map_groups__set_modules_path_dir(struct map_groups *mg,if (ret <0 ) goto out; }else { -char *dot =strrchr (dent->d_name,'.' ), - dso_name[PATH_MAX ]; -struct map *map; -char *long_name; +struct kmod_path m; -if (dot ==NULL ) -continue ; + ret =kmod_path__parse_name (&m, dent->d_name); +if (ret) + goto out; -/* On some system, modules are compressed like .ko.gz */ -if (is_supported_compression (dot +1 ) && -is_kmodule_extension (dot -2 )) - dot -=3 ; +if (m.kmod) + ret =map_groups__set_module_path (mg, path, &m); -snprintf (dso_name,sizeof (dso_name),"[%.*s]" , - (int )(dot - dent->d_name), dent->d_name); +free (m.name); -strxfrchar (dso_name,'-' ,'_' ); - map =map_groups__find_by_name (mg,MAP__FUNCTION , - dso_name); -if (map ==NULL ) -continue ; - - long_name =strdup (path); -if (long_name ==NULL ) { - ret =-1 ; +if (ret) goto out; - } -dso__set_long_name (map->dso, long_name, true); -dso__kernel_module_get_build_id (map->dso,"" ); } }