perf buildid-list: Add option to show the running kernel build id
authorArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 29 Aug 2011 11:07:22 +0000 (08:07 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 29 Sep 2011 19:41:37 +0000 (16:41 -0300)
[root@emilia ~]# perf buildid-list -k
07b0c016a2b30004e86132d0239945b1e88f5d75

Useful when diagnosing build id problems in debuginfo packages, etc.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-po1bl7acn6e1hhne90opmvtl@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-buildid-list.txt
tools/perf/builtin-buildid-list.c

index 5eaac6f..770a7f3 100644 (file)
@@ -16,6 +16,8 @@ This command displays the buildids found in a perf.data file, so that other
 tools can be used to fetch packages with matching symbol tables for use by
 perf report.
 
 tools can be used to fetch packages with matching symbol tables for use by
 perf report.
 
+It can also be used to show the build id of the running kernel.
+
 OPTIONS
 -------
 -H::
 OPTIONS
 -------
 -H::
@@ -27,6 +29,9 @@ OPTIONS
 -f::
 --force::
        Don't do ownership validation.
 -f::
 --force::
        Don't do ownership validation.
+-k::
+--kernel::
+       Show running kernel build id.
 -v::
 --verbose::
        Be more verbose.
 -v::
 --verbose::
        Be more verbose.
index 5af32ae..4102ead 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * builtin-buildid-list.c
  *
 /*
  * builtin-buildid-list.c
  *
- * Builtin buildid-list command: list buildids in perf.data
+ * Builtin buildid-list command: list buildids in perf.data or in the running
+ * kernel.
  *
  * Copyright (C) 2009, Red Hat Inc.
  * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com>
  *
  * Copyright (C) 2009, Red Hat Inc.
  * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com>
@@ -17,6 +18,7 @@
 
 static char const *input_name = "perf.data";
 static bool force;
 
 static char const *input_name = "perf.data";
 static bool force;
+static bool show_kernel;
 static bool with_hits;
 
 static const char * const buildid_list_usage[] = {
 static bool with_hits;
 
 static const char * const buildid_list_usage[] = {
@@ -29,12 +31,13 @@ static const struct option options[] = {
        OPT_STRING('i', "input", &input_name, "file",
                    "input file name"),
        OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
        OPT_STRING('i', "input", &input_name, "file",
                    "input file name"),
        OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
+       OPT_BOOLEAN('k', "kernel", &show_kernel, "Show current kernel build id"),
        OPT_INCR('v', "verbose", &verbose,
                    "be more verbose"),
        OPT_END()
 };
 
        OPT_INCR('v', "verbose", &verbose,
                    "be more verbose"),
        OPT_END()
 };
 
-static int __cmd_buildid_list(void)
+static int perf_session__list_build_ids(void)
 {
        struct perf_session *session;
 
 {
        struct perf_session *session;
 
@@ -52,6 +55,30 @@ static int __cmd_buildid_list(void)
        return 0;
 }
 
        return 0;
 }
 
+static int sysfs__fprintf_build_id(FILE *fp)
+{
+       u8 kallsyms_build_id[BUILD_ID_SIZE];
+       char sbuild_id[BUILD_ID_SIZE * 2 + 1];
+
+       if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id,
+                                sizeof(kallsyms_build_id)) != 0)
+               return -1;
+
+       build_id__sprintf(kallsyms_build_id, sizeof(kallsyms_build_id),
+                         sbuild_id);
+       fprintf(fp, "%s\n", sbuild_id);
+       return 0;
+}
+
+static int __cmd_buildid_list(void)
+{
+
+       if (show_kernel)
+               return sysfs__fprintf_build_id(stdout);
+
+       return perf_session__list_build_ids();
+}
+
 int cmd_buildid_list(int argc, const char **argv, const char *prefix __used)
 {
        argc = parse_options(argc, argv, options, buildid_list_usage, 0);
 int cmd_buildid_list(int argc, const char **argv, const char *prefix __used)
 {
        argc = parse_options(argc, argv, options, buildid_list_usage, 0);