diff options
author | Richard Yao <ryao@gentoo.org> | 2014-04-26 13:17:55 -0400 |
---|---|---|
committer | Jiri Olsa <jolsa@kernel.org> | 2014-04-30 10:49:29 -0400 |
commit | 61d4290cc1f10588147b76b385875f06827d47ff (patch) | |
tree | 1ecb38dfa2a5cdd6046395fc17a625a86746a378 | |
parent | 611ec127165b572f02823e152d6774e2145305a3 (diff) |
perf machine: Search for modules in %s/lib/modules/%s
Modules installed outside of the kernel's build system should go into
"%s/lib/modules/%s/extra", but at present, perf will only look at them
when they are in "%s/lib/modules/%s/kernel". Lets encourage good
citizenship by relaxing this requirement to "%s/lib/modules/%s". This
way open source modules that are out-of-tree have no incentive to start
populating a directory reserved for in-kernel modules and I can stop
hex-editing my system's perf binary when profiling OSS out-of-tree
modules.
Feedback from Namhyung Kim correctly revealed that the hex-edits that I
had been doing meant that perf was also traversing the build and source
symlinks in %s/lib/modules/%s. That is undesireable, so we explicitly
exclude them from traversal with a minor tweak to the traversal routine.
Signed-off-by: Richard Yao <ryao@gentoo.org>
Acked-by: Namhyung kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/1398532675-13684-1-git-send-email-ryao@gentoo.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
-rw-r--r-- | tools/perf/util/machine.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index a53cd0b8c151..27c2a5efe450 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c | |||
@@ -717,7 +717,7 @@ static char *get_kernel_version(const char *root_dir) | |||
717 | } | 717 | } |
718 | 718 | ||
719 | static int map_groups__set_modules_path_dir(struct map_groups *mg, | 719 | static int map_groups__set_modules_path_dir(struct map_groups *mg, |
720 | const char *dir_name) | 720 | const char *dir_name, int depth) |
721 | { | 721 | { |
722 | struct dirent *dent; | 722 | struct dirent *dent; |
723 | DIR *dir = opendir(dir_name); | 723 | DIR *dir = opendir(dir_name); |
@@ -742,7 +742,15 @@ static int map_groups__set_modules_path_dir(struct map_groups *mg, | |||
742 | !strcmp(dent->d_name, "..")) | 742 | !strcmp(dent->d_name, "..")) |
743 | continue; | 743 | continue; |
744 | 744 | ||
745 | ret = map_groups__set_modules_path_dir(mg, path); | 745 | /* Do not follow top-level source and build symlinks */ |
746 | if (depth == 0) { | ||
747 | if (!strcmp(dent->d_name, "source") || | ||
748 | !strcmp(dent->d_name, "build")) | ||
749 | continue; | ||
750 | } | ||
751 | |||
752 | ret = map_groups__set_modules_path_dir(mg, path, | ||
753 | depth + 1); | ||
746 | if (ret < 0) | 754 | if (ret < 0) |
747 | goto out; | 755 | goto out; |
748 | } else { | 756 | } else { |
@@ -786,11 +794,11 @@ static int machine__set_modules_path(struct machine *machine) | |||
786 | if (!version) | 794 | if (!version) |
787 | return -1; | 795 | return -1; |
788 | 796 | ||
789 | snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s/kernel", | 797 | snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s", |
790 | machine->root_dir, version); | 798 | machine->root_dir, version); |
791 | free(version); | 799 | free(version); |
792 | 800 | ||
793 | return map_groups__set_modules_path_dir(&machine->kmaps, modules_path); | 801 | return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0); |
794 | } | 802 | } |
795 | 803 | ||
796 | static int machine__create_module(void *arg, const char *name, u64 start) | 804 | static int machine__create_module(void *arg, const char *name, u64 start) |