Cleanup the code flow of dso__find_kallsyms() to remove
redundant checking code and add some comment for readability.

Signed-off-by: Masami Hiramatsu <mhira...@kernel.org>
---
 Changes in v9:
  - Split into filename__readable() and others.

 Changes in v8:
  - Add comments why we can't use access(R_OK) for /proc/kcore access.
---
 tools/perf/util/symbol.c |   36 +++++++++++++-----------------------
 1 file changed, 13 insertions(+), 23 deletions(-)

diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index a469346..1df6092 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1674,21 +1674,8 @@ static char *dso__find_kallsyms(struct dso *dso, struct 
map *map)
                                 sizeof(host_build_id)) == 0)
                is_host = dso__build_id_equal(dso, host_build_id);
 
-       build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
-
-       scnprintf(path, sizeof(path), "%s/%s/%s", buildid_dir,
-                 DSO__NAME_KCORE, sbuild_id);
-
-       /* Use /proc/kallsyms if possible */
+       /* Try a fast path for /proc/kallsyms if possible */
        if (is_host) {
-               DIR *d;
-
-               /* If no cached kcore go with /proc/kallsyms */
-               d = opendir(path);
-               if (!d)
-                       goto proc_kallsyms;
-               closedir(d);
-
                /*
                 * Do not check the build-id cache, unless we know we cannot use
                 * /proc/kcore or module maps don't match to /proc/kallsyms.
@@ -1699,18 +1686,24 @@ static char *dso__find_kallsyms(struct dso *dso, struct 
map *map)
                if (filename__readable("/proc/kcore") &&
                    !validate_kcore_addresses("/proc/kallsyms", map))
                        goto proc_kallsyms;
-
-               /* Find kallsyms in build-id cache with kcore */
-               if (!find_matching_kcore(map, path, sizeof(path)))
-                       return strdup(path);
-
-               goto proc_kallsyms;
        }
 
+       build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
+
        /* Find kallsyms in build-id cache with kcore */
+       scnprintf(path, sizeof(path), "%s/%s/%s",
+                 buildid_dir, DSO__NAME_KCORE, sbuild_id);
+
        if (!find_matching_kcore(map, path, sizeof(path)))
                return strdup(path);
 
+       /* Use current /proc/kallsyms if possible */
+       if (is_host) {
+proc_kallsyms:
+               return strdup("/proc/kallsyms");
+       }
+
+       /* Finally, find a cache of kallsyms */
        scnprintf(path, sizeof(path), "%s/%s/%s",
                  buildid_dir, DSO__NAME_KALLSYMS, sbuild_id);
 
@@ -1721,9 +1714,6 @@ static char *dso__find_kallsyms(struct dso *dso, struct 
map *map)
        }
 
        return strdup(path);
-
-proc_kallsyms:
-       return strdup("/proc/kallsyms");
 }
 
 static int dso__load_kernel_sym(struct dso *dso, struct map *map,

Reply via email to