perf tools: Add support to display build ids when available in PERF_RECORD_MMAP2...
authorJiri Olsa <jolsa@kernel.org>
Mon, 14 Dec 2020 10:54:53 +0000 (11:54 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 28 Dec 2020 14:36:52 +0000 (11:36 -0300)
Add support to display the build id in PERF_RECORD_MMAP2 events, when
available:

  $ perf script --show-mmap-events | head -4
  swapper ... @ 0xffffffff81000000 <ff1969b3ba5e43911208bb46fa7d5b1eb809e422>]: ---p [kernel.kallsyms]_text
  swapper ... @ 0 <5f62adb730272c9417883ae8b8a8ec224df8cddd>]: ---p /lib/modules/5.9.0-rc5buildid+/kernel/drivers/firmware/qemu_fw_cfg.ko
  swapper ... @ 0 <c9ac6e1dafc1ebdadb048f967854e810706c8bab>]: ---p /lib/modules/5.9.0-rc5buildid+/kernel/drivers/char/virtio_console.ko
  swapper ... @ 0 <86441a4c5b2c2ff5b440682f4c612bd4b426eb5c>]: ---p /lib/modules/5.9.0-rc5buildid+/kernel/lib/libcrc32c.ko

  $ perf report -D | grep MMAP2 | head -4
  0 0 ... @ 0xffffffff81000000 <ff1969b3ba5e43911208bb46fa7d5b1eb809e422>]: ---p [kernel.kallsyms]_text
  0 0 ... @ 0 <5f62adb730272c9417883ae8b8a8ec224df8cddd>]: ---p /lib/modules/5.9.0-rc5buildid+/kernel/drivers/firmware/qemu_fw_cfg.ko
  0 0 ... @ 0 <c9ac6e1dafc1ebdadb048f967854e810706c8bab>]: ---p /lib/modules/5.9.0-rc5buildid+/kernel/drivers/char/virtio_console.ko
  0 0 ... @ 0 <86441a4c5b2c2ff5b440682f4c612bd4b426eb5c>]: ---p /lib/modules/5.9.0-rc5buildid+/kernel/lib/libcrc32c.ko

Adding build id data into <> brackets.

Committer testing:

  $ perf record -vv --buildid-mmap sleep 1 |& grep -m1 build
  Enabling build id in mmap2 events.
  $ perf evlist -v
  cycles:u: size: 120, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, read_format: ID, disabled: 1, inherit: 1, exclude_kernel: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1, ksymbol: 1, bpf_event: 1, build_id: 1
  $
  $ perf script --show-mmap-events | head -4
           sleep 274800  2843.556112: PERF_RECORD_MMAP2 274800/274800: [0x564e2fd32000(0x3000) @ 0x2000 <c37cb90b77c79fc719798b066d78ef121285843e>]: r-xp /usr/bin/sleep
           sleep 274800  2843.556129: PERF_RECORD_MMAP2 274800/274800: [0x7fa9550d7000(0x21000) @ 0x1000 <fc190f17c4f4dc4a8a26df18eaeed41ecdb2c61b>]: r-xp /usr/lib64/ld-2.32.so
           sleep 274800  2843.556140: PERF_RECORD_MMAP2 274800/274800: [0x7ffd8fa96000(0x2000) @ 0 00:00 0 0]: r-xp [vdso]
           sleep 274800  2843.556162:          1 cycles:u:  ffffffffbb26bff4 [unknown] ([unknown])
  $
  $ perf buildid-list -i /usr/bin/sleep
  c37cb90b77c79fc719798b066d78ef121285843e
  $ perf buildid-list -i /usr/lib64/ld-2.32.so
  fc190f17c4f4dc4a8a26df18eaeed41ecdb2c61b

And now on a system wide session to check the build ids synthesized for
the kernel and some kernel modules:

  # perf record -a --buildid-mmap sleep 2s
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 0.717 MB perf.data ]
  # perf script --show-mmap-events | head -4
           swapper     0 [000]     0.000000: PERF_RECORD_MMAP2 -1/0: [0xffffffffbb000000(0xe02557) @ 0xffffffffbb000000 <e71ac4b0b0631c27181dab25d63be18dad02feb8>]: ---p [kernel.kallsyms]_text
           swapper     0 [000]     0.000000: PERF_RECORD_MMAP2 -1/0: [0xffffffffc01dc000(0x6000) @ 0 <36d21515c0b22eb2859b6419a6cdf87ef4cd01c8>]: ---p /lib/modules/5.11.0-rc1+/kernel/drivers/i2c/i2c-dev.ko
           swapper     0 [000]     0.000000: PERF_RECORD_MMAP2 -1/0: [0xffffffffc01eb000(0x24000) @ 0 <c4fbfea32d0518b3e7879de8deca40ea142bb782>]: ---p /lib/modules/5.11.0-rc1+/kernel/fs/fuse/fuse.ko
           swapper     0 [000]     0.000000: PERF_RECORD_MMAP2 -1/0: [0xffffffffc0210000(0x7000) @ 0 <dd6cfb10ae66aa7b1e7b37000a004004be8092e0>]: ---p /lib/modules/5.11.0-rc1+/kernel/drivers/block/zram/zram.ko
  # perf buildid-list -h kernel

   Usage: perf buildid-list [<options>]

      -k, --kernel          Show current kernel build id

  # perf buildid-list --kernel
  e71ac4b0b0631c27181dab25d63be18dad02feb8
  # file /lib/modules/5.11.0-rc1+/kernel/drivers/i2c/i2c-dev.ko
  /lib/modules/5.11.0-rc1+/kernel/drivers/i2c/i2c-dev.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=36d21515c0b22eb2859b6419a6cdf87ef4cd01c8, with debug_info, not stripped
  # perf buildid-list -i /lib/modules/5.11.0-rc1+/kernel/drivers/i2c/i2c-dev.ko
  36d21515c0b22eb2859b6419a6cdf87ef4cd01c8
  # perf buildid-list -i /lib/modules/5.11.0-rc1+/kernel/fs/fuse/fuse.ko
  c4fbfea32d0518b3e7879de8deca40ea142bb782
  # perf buildid-list -i /lib/modules/5.11.0-rc1+/kernel/drivers/block/zram/zram.ko
  dd6cfb10ae66aa7b1e7b37000a004004be8092e0
  #

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Budankov <abudankov@huawei.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lore.kernel.org/lkml/20201214105457.543111-12-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/event.c

index 05616d4..fbe8578 100644 (file)
@@ -288,17 +288,36 @@ size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp)
 
 size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp)
 {
-       return fprintf(fp, " %d/%d: [%#" PRI_lx64 "(%#" PRI_lx64 ") @ %#" PRI_lx64
-                          " %02x:%02x %"PRI_lu64" %"PRI_lu64"]: %c%c%c%c %s\n",
-                      event->mmap2.pid, event->mmap2.tid, event->mmap2.start,
-                      event->mmap2.len, event->mmap2.pgoff, event->mmap2.maj,
-                      event->mmap2.min, event->mmap2.ino,
-                      event->mmap2.ino_generation,
-                      (event->mmap2.prot & PROT_READ) ? 'r' : '-',
-                      (event->mmap2.prot & PROT_WRITE) ? 'w' : '-',
-                      (event->mmap2.prot & PROT_EXEC) ? 'x' : '-',
-                      (event->mmap2.flags & MAP_SHARED) ? 's' : 'p',
-                      event->mmap2.filename);
+       if (event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID) {
+               char sbuild_id[SBUILD_ID_SIZE];
+               struct build_id bid;
+
+               build_id__init(&bid, event->mmap2.build_id,
+                              event->mmap2.build_id_size);
+               build_id__sprintf(&bid, sbuild_id);
+
+               return fprintf(fp, " %d/%d: [%#" PRI_lx64 "(%#" PRI_lx64 ") @ %#" PRI_lx64
+                                  " <%s>]: %c%c%c%c %s\n",
+                              event->mmap2.pid, event->mmap2.tid, event->mmap2.start,
+                              event->mmap2.len, event->mmap2.pgoff, sbuild_id,
+                              (event->mmap2.prot & PROT_READ) ? 'r' : '-',
+                              (event->mmap2.prot & PROT_WRITE) ? 'w' : '-',
+                              (event->mmap2.prot & PROT_EXEC) ? 'x' : '-',
+                              (event->mmap2.flags & MAP_SHARED) ? 's' : 'p',
+                              event->mmap2.filename);
+       } else {
+               return fprintf(fp, " %d/%d: [%#" PRI_lx64 "(%#" PRI_lx64 ") @ %#" PRI_lx64
+                                  " %02x:%02x %"PRI_lu64" %"PRI_lu64"]: %c%c%c%c %s\n",
+                              event->mmap2.pid, event->mmap2.tid, event->mmap2.start,
+                              event->mmap2.len, event->mmap2.pgoff, event->mmap2.maj,
+                              event->mmap2.min, event->mmap2.ino,
+                              event->mmap2.ino_generation,
+                              (event->mmap2.prot & PROT_READ) ? 'r' : '-',
+                              (event->mmap2.prot & PROT_WRITE) ? 'w' : '-',
+                              (event->mmap2.prot & PROT_EXEC) ? 'x' : '-',
+                              (event->mmap2.flags & MAP_SHARED) ? 's' : 'p',
+                              event->mmap2.filename);
+       }
 }
 
 size_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp)