ping ?

On 2015年06月19日 16:57, Li Zhang wrote:
There 2 problems when reading symbols files:

*  It doesn't report any errors even if when users specify symbol
    files which don't exist with --kallsyms or --vmlinux. The result
    just shows the address without symbols, which is not what is expected.
    So it's better to report errors and exit the program.

*  When using command perf report --kallsyms=/proc/kallsyms with a
    non-root user, symbols are resolved. Then select one symbol and
    annotate it, it reports the error as the following:
    Can't annotate __clear_user: No vmlinux file with build id xxx was
    found.

    The problem is caused by reading /proc/kcore without access permission.
    /proc/kcore requires CAP_SYS_RAWIO capability to access, so it needs to
    change access permission to allow a specific user to read /proc/kcore or
    use root to execute the perf command.

This patch is to report errors when symbol files specified by users
don't exist. And check access permission of /proc/kcore when reading it.

Signed-off-by: Li Zhang <zhlci...@linux.vnet.ibm.com>
---

v3 -> v2:
   * Add checking symbol files when user specify these files.
   * Report an error to users when open fails. Suggested by Sukar

v2 -> v1:
   * Report one useful message to users about the access permision,
     then go back to the tools. Suggested by Arnaldo Carvalho de Melo.

  tools/perf/builtin-report.c | 11 +++++++++++
  tools/perf/util/symbol.c    |  5 ++++-
  2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 476cdf7..1c353b1 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -731,6 +731,17 @@ int cmd_report(int argc, const char **argv, const char 
*prefix __maybe_unused)

        argc = parse_options(argc, argv, options, report_usage, 0);

+       if (symbol_conf.vmlinux_name &&
+               access(symbol_conf.vmlinux_name, R_OK)) {
+               pr_err("Invalid file: %s\n", symbol_conf.vmlinux_name);
+               return -EINVAL;
+       }
+       if (symbol_conf.kallsyms_name &&
+               access(symbol_conf.kallsyms_name, R_OK)) {
+               pr_err("Invalid file: %s\n", symbol_conf.kallsyms_name);
+               return -EINVAL;
+       }
+
        if (report.use_stdio)
                use_browser = 0;
        else if (report.use_tui)
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 201f6c4c..46aa93d 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1126,8 +1126,11 @@ static int dso__load_kcore(struct dso *dso, struct map 
*map,
        INIT_LIST_HEAD(&md.maps);

        fd = open(kcore_filename, O_RDONLY);
-       if (fd < 0)
+       if (fd < 0) {
+               pr_err("%s requires CAP_SYS_RAWIO capability to access.\n",
+                       kcore_filename);
                return -EINVAL;
+       }

        /* Read new maps into temporary lists */
        err = file__read_maps(fd, md.type == MAP__FUNCTION, kcore_mapfn, &md,


--

Li Zhang
IBM China Linux Technology Centre

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to