linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHSET 0/8] perf tools: Fix build-id matching on vmlinux (v6)
@ 2014-11-04  1:14 Namhyung Kim
  2014-11-04  1:14 ` [PATCH 1/8] perf tools: Preparation for compressed kernel module support Namhyung Kim
                   ` (7 more replies)
  0 siblings, 8 replies; 43+ messages in thread
From: Namhyung Kim @ 2014-11-04  1:14 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Ingo Molnar, Paul Mackerras, Namhyung Kim,
	Namhyung Kim, LKML, Jiri Olsa, Adrian Hunter, David Ahern,
	Stephane Eranian

Hello,

This patchset addresses possible problem on kernel symbol matching.
Since commit 5b7ba82a7591 ("perf symbols: Load kernel maps before
using"), when perf record process samples to construct build-id table,
it loads kernel map and it replaces dso->long_name.  But perf report
doesn't know about name other than [kernel.kallsyms] it failed to find
existing kernel dso and falls back to running kernel's kallsyms.

So it's possible to report incorrect symbols for kernel functions if
it runs on a different kernel:

Before:

  $ perf report
  # Children      Self  Command  Shared Object      Symbol
  # ........  ........  .......  .................  ...............................
  #
      72.15%     0.00%  swapper  [kernel.kallsyms]  [k] set_curr_task_rt
      72.15%     0.00%  swapper  [kernel.kallsyms]  [k] native_calibrate_tsc
      72.15%     0.00%  swapper  [kernel.kallsyms]  [k] tsc_refine_calibration_work
      71.87%    71.87%  swapper  [kernel.kallsyms]  [k] module_finalize
   ...

After (for the same perf.data):

      72.15%     0.00%  swapper  [kernel.vmlinux]  [k] cpu_startup_entry
      72.15%     0.00%  swapper  [kernel.vmlinux]  [k] arch_cpu_idle
      72.15%     0.00%  swapper  [kernel.vmlinux]  [k] default_idle
      71.87%    71.87%  swapper  [kernel.vmlinux]  [k] native_safe_halt


In this patch, it's now changed to try to search a kernel dso in the
existing dso list which was constructed during build-id table parsing
so it'll always have a build-id.  If not found, search "[kernel.kallsyms]".

The patch 1-2 are to support module compression as some distro
(e.g. Arch) already does it.  The patch 3-5 are cleanup of build-id
handling functions.  The patch 6-7 are the main change of this series
and finally patch 8 is just for suggestion which can be squashed into
the previous patch or simply dropped.

 * changes from v5)
  - keep dsos__hit_all() in util/build-id.c  (Adrian)
  - fix bug in is_kernel_module function  (Jiri)
  - add missing zlib test to test-all.c  (Jiri)
  - move disable_buildid_cache function also


You can get it on 'perf/vmlinux-v6' branch in my tree:

  git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git


Any comments are welcome, thanks
Namhyung


Cc: Adrian Hunter <adrian.hunter@intel.com>


Namhyung Kim (8):
  perf tools: Preparation for compressed kernel module support
  perf tools: Add gzip decompression support for kernel module
  perf tools: Rename dsos__write_buildid_table()
  perf build-id: Move build-id related functions to util/build-id.c
  perf tools: Move disable_buildid_cache() to util/build-id.c
  perf record: Do not save pathname in ./debug/.build-id directory for
    vmlinux
  perf tools: Fix build-id matching on vmlinux
  perf tools: Make vmlinux short name more like kallsyms short name

 tools/perf/Makefile.perf                     |   7 +
 tools/perf/builtin-record.c                  |  11 +
 tools/perf/config/Makefile                   |  15 +-
 tools/perf/config/feature-checks/Makefile    |   6 +-
 tools/perf/config/feature-checks/test-all.c  |   5 +
 tools/perf/config/feature-checks/test-zlib.c |   9 +
 tools/perf/util/build-id.c                   | 345 ++++++++++++++++++++++++++
 tools/perf/util/build-id.h                   |  12 +
 tools/perf/util/dso.c                        |  71 ++++++
 tools/perf/util/dso.h                        |   7 +
 tools/perf/util/header.c                     | 353 +--------------------------
 tools/perf/util/header.h                     |   8 +-
 tools/perf/util/machine.c                    |  38 ++-
 tools/perf/util/symbol-elf.c                 |  35 ++-
 tools/perf/util/symbol.c                     |  19 +-
 tools/perf/util/symbol.h                     |   1 +
 tools/perf/util/util.h                       |   6 +-
 tools/perf/util/zlib.c                       |  78 ++++++
 18 files changed, 658 insertions(+), 368 deletions(-)
 create mode 100644 tools/perf/config/feature-checks/test-zlib.c
 create mode 100644 tools/perf/util/zlib.c

-- 
2.1.2


^ permalink raw reply	[flat|nested] 43+ messages in thread
* [PATCHSET 0/8] perf tools: Fix build-id matching on vmlinux (v5)
@ 2014-11-03  7:27 Namhyung Kim
  2014-11-03  7:27 ` [PATCH 1/8] perf tools: Preparation for compressed kernel module support Namhyung Kim
                   ` (7 more replies)
  0 siblings, 8 replies; 43+ messages in thread
From: Namhyung Kim @ 2014-11-03  7:27 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Ingo Molnar, Paul Mackerras, Namhyung Kim,
	Namhyung Kim, LKML, Jiri Olsa, Adrian Hunter, David Ahern,
	Stephane Eranian

Hello,

This patchset addresses possible problem on kernel symbol matching.
Since commit 5b7ba82a7591 ("perf symbols: Load kernel maps before
using"), when perf record process samples to construct build-id table,
it loads kernel map and it replaces dso->long_name.  But perf report
doesn't know about name other than [kernel.kallsyms] it failed to find
existing kernel dso and falls back to running kernel's kallsyms.

So it's possible to report incorrect symbols for kernel functions if
it runs on a different kernel:

Before:

  $ perf report
  # Children      Self  Command  Shared Object      Symbol
  # ........  ........  .......  .................  ...............................
  #
      72.15%     0.00%  swapper  [kernel.kallsyms]  [k] set_curr_task_rt
      72.15%     0.00%  swapper  [kernel.kallsyms]  [k] native_calibrate_tsc
      72.15%     0.00%  swapper  [kernel.kallsyms]  [k] tsc_refine_calibration_work
      71.87%    71.87%  swapper  [kernel.kallsyms]  [k] module_finalize
   ...

After (for the same perf.data):

      72.15%     0.00%  swapper  [kernel.vmlinux]  [k] cpu_startup_entry
      72.15%     0.00%  swapper  [kernel.vmlinux]  [k] arch_cpu_idle
      72.15%     0.00%  swapper  [kernel.vmlinux]  [k] default_idle
      71.87%    71.87%  swapper  [kernel.vmlinux]  [k] native_safe_halt


In this patch, it's now changed to try to search a kernel dso in the
existing dso list which was constructed during build-id table parsing
so it'll always have a build-id.  If not found, search "[kernel.kallsyms]".

The patch 1-2 are to support module compression as some distro
(e.g. Arch) already does it.  The patch 3-5 are cleanup of build-id
handling functions.  The patch 6-7 are the main change of this series
and finally patch 8 is just for suggestion which can be squashed into
the previous patch or simply dropped.

You can get it on 'perf/vmlinux-v5' branch in my tree:

  git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git


Any comments are welcome, thanks
Namhyung


Cc: Adrian Hunter <adrian.hunter@intel.com>


Namhyung Kim (8):
  perf tools: Preparation for compressed kernel module support
  perf tools: Add gzip decompression support for kernel module
  perf tools: Get rid of unused dsos__hit_all()
  perf tools: Rename dsos__write_buildid_table()
  perf build-id: Move build-id related functions to util/build-id.c
  perf record: Do not save pathname in ./debug/.build-id directory for
    vmlinux
  perf tools: Fix build-id matching on vmlinux
  perf tools: Make vmlinux short name more like kallsyms short name

 tools/perf/Makefile.perf                     |   7 +
 tools/perf/builtin-record.c                  |  11 +
 tools/perf/config/Makefile                   |  15 +-
 tools/perf/config/feature-checks/Makefile    |   6 +-
 tools/perf/config/feature-checks/test-zlib.c |   9 +
 tools/perf/util/build-id.c                   | 293 +++++++++++++++++++++++
 tools/perf/util/build-id.h                   |   5 +
 tools/perf/util/dso.c                        |  71 ++++++
 tools/perf/util/dso.h                        |   7 +
 tools/perf/util/header.c                     | 343 +--------------------------
 tools/perf/util/header.h                     |   4 +-
 tools/perf/util/machine.c                    |  38 ++-
 tools/perf/util/symbol-elf.c                 |  35 ++-
 tools/perf/util/symbol.c                     |  19 +-
 tools/perf/util/symbol.h                     |   1 +
 tools/perf/util/util.h                       |   5 +
 tools/perf/util/zlib.c                       |  78 ++++++
 17 files changed, 593 insertions(+), 354 deletions(-)
 create mode 100644 tools/perf/config/feature-checks/test-zlib.c
 create mode 100644 tools/perf/util/zlib.c

-- 
2.1.2


^ permalink raw reply	[flat|nested] 43+ messages in thread
* [PATCH v4] perf tools: Fix build-id matching on vmlinux
@ 2014-09-22  8:04 Namhyung Kim
  2014-09-24  7:33 ` Ingo Molnar
  0 siblings, 1 reply; 43+ messages in thread
From: Namhyung Kim @ 2014-09-22  8:04 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Ingo Molnar, Paul Mackerras, Namhyung Kim,
	Namhyung Kim, LKML, Jiri Olsa, David Ahern, Adrian Hunter,
	Stephane Eranian, Andi Kleen, stable

There's a problem on finding correct kernel symbols when perf report
runs on a different kernel.  Although a part of the problem was solved
by the prior commit 0a7e6d1b6844 ("perf tools: Check recorded kernel
version when finding vmlinux"), there's a remaining problem still.

When perf records samples, it synthesizes the kernel map using
machine__mmap_name() and ref_reloc_sym like "[kernel.kallsyms]_text".
You can easily see it using 'perf report -D' command.

After finishing record, it goes through the recorded events to find
maps/dsos actually used.  And then record build-id info of them.

During this process, it needs to load symbols in a dso and it'd call
dso__load_vmlinux() since the default value of the symbol_conf.try_
vmlinux_path is true.  However it changes dso->long_name to a real
path of the vmlinux file (e.g. /lib/modules/3.16.0-rc2+/build/vmlinux)
if one is running on a custom kernel.

It resulted in that perf report reads the build-id of the vmlinux, but
cannot use it since it only knows about the [kernel.kallsyms] map.  It
then falls back to possible vmlinux paths by using the recorded kernel
version (in case of a recent version) or a running kernel silently.

Even with the recent tools, this still has a possibility of breaking
the result.  As the build directory is a symbolic link, if one built a
new kernel in the same directory with different source/config, the old
link to vmlinux will point the new file.  So it's absolutely needed to
use build-id when finding a kernel image.

In this patch, it's now changed to try to search a kernel dso in the
existing dso list which was constructed during build-id table parsing
so it'll always have a build-id.  If not found, search "[kernel.kallsyms]".

Before:

  $ perf report
  # Children      Self  Command  Shared Object      Symbol
  # ........  ........  .......  .................  ...............................
  #
      72.15%     0.00%  swapper  [kernel.kallsyms]  [k] set_curr_task_rt
      72.15%     0.00%  swapper  [kernel.kallsyms]  [k] native_calibrate_tsc
      72.15%     0.00%  swapper  [kernel.kallsyms]  [k] tsc_refine_calibration_work
      71.87%    71.87%  swapper  [kernel.kallsyms]  [k] module_finalize
   ...

After (for the same perf.data):

      72.15%     0.00%  swapper  vmlinux  [k] cpu_startup_entry
      72.15%     0.00%  swapper  vmlinux  [k] arch_cpu_idle
      72.15%     0.00%  swapper  vmlinux  [k] default_idle
      71.87%    71.87%  swapper  vmlinux  [k] native_safe_halt
   ...

Cc: stable@vger.kernel.org
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/machine.c | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index b2ec38bf211e..5661195a8cf6 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -12,6 +12,7 @@
 #include <stdbool.h>
 #include <symbol/kallsyms.h>
 #include "unwind.h"
+#include "asm/bug.h"
 
 int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
 {
@@ -1062,8 +1063,26 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
 		 * Should be there already, from the build-id table in
 		 * the header.
 		 */
-		struct dso *kernel = __dsos__findnew(&machine->kernel_dsos,
-						     kmmap_prefix);
+		struct dso *kernel = NULL;
+		struct dso *dso;
+
+		list_for_each_entry(dso, &machine->kernel_dsos, node) {
+			const char *suffix;
+			size_t len = strlen(dso->long_name);
+
+			if (WARN_ONCE(len <= 3, "Too short dso name"))
+				continue;
+
+			suffix = dso->long_name + len - 3;
+			if (strcmp(suffix, ".ko")) {
+				kernel = dso;
+				break;
+			}
+		}
+
+		if (kernel == NULL)
+			kernel = __dsos__findnew(&machine->kernel_dsos,
+						 kmmap_prefix);
 		if (kernel == NULL)
 			goto out_problem;
 
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 43+ messages in thread

end of thread, other threads:[~2014-11-07  5:31 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-04  1:14 [PATCHSET 0/8] perf tools: Fix build-id matching on vmlinux (v6) Namhyung Kim
2014-11-04  1:14 ` [PATCH 1/8] perf tools: Preparation for compressed kernel module support Namhyung Kim
2014-11-04 10:58   ` Jiri Olsa
2014-11-07  5:29   ` [tip:perf/core] perf symbols: " tip-bot for Namhyung Kim
2014-11-04  1:14 ` [PATCH 2/8] perf tools: Add gzip decompression support for kernel module Namhyung Kim
2014-11-04 11:00   ` Jiri Olsa
2014-11-04 13:42     ` Arnaldo Carvalho de Melo
2014-11-05  2:59       ` Namhyung Kim
2014-11-07  5:30         ` [tip:perf/core] " tip-bot for Namhyung Kim
2014-11-04 14:15   ` [PATCH 2/8] " Arnaldo Carvalho de Melo
2014-11-05  3:04     ` Namhyung Kim
2014-11-04  1:14 ` [PATCH 3/8] perf tools: Rename dsos__write_buildid_table() Namhyung Kim
2014-11-07  5:30   ` [tip:perf/core] perf build-id: " tip-bot for Namhyung Kim
2014-11-04  1:14 ` [PATCH 4/8] perf build-id: Move build-id related functions to util/build-id.c Namhyung Kim
2014-11-07  5:30   ` [tip:perf/core] " tip-bot for Namhyung Kim
2014-11-04  1:14 ` [PATCH 5/8] perf tools: Move disable_buildid_cache() " Namhyung Kim
2014-11-04  1:14 ` [PATCH 6/8] perf record: Do not save pathname in ./debug/.build-id directory for vmlinux Namhyung Kim
2014-11-04 13:29   ` Arnaldo Carvalho de Melo
2014-11-05  2:54     ` Namhyung Kim
2014-11-07  5:30   ` [tip:perf/core] perf record: Do not save pathname in ./debug/ .build-id " tip-bot for Namhyung Kim
2014-11-04  1:14 ` [PATCH 7/8] perf tools: Fix build-id matching on vmlinux Namhyung Kim
2014-11-07  5:31   ` [tip:perf/core] " tip-bot for Namhyung Kim
2014-11-04  1:14 ` [PATCH 8/8] perf tools: Make vmlinux short name more like kallsyms short name Namhyung Kim
2014-11-07  5:31   ` [tip:perf/core] " tip-bot for Namhyung Kim
  -- strict thread matches above, loose matches on Subject: below --
2014-11-03  7:27 [PATCHSET 0/8] perf tools: Fix build-id matching on vmlinux (v5) Namhyung Kim
2014-11-03  7:27 ` [PATCH 1/8] perf tools: Preparation for compressed kernel module support Namhyung Kim
2014-11-03 13:51   ` Jiri Olsa
2014-11-03 15:01     ` Namhyung Kim
2014-11-03  7:27 ` [PATCH 2/8] perf tools: Add gzip decompression support for kernel module Namhyung Kim
2014-11-03 13:54   ` Jiri Olsa
2014-11-03 15:02     ` Namhyung Kim
2014-11-03  7:27 ` [PATCH 3/8] perf tools: Get rid of unused dsos__hit_all() Namhyung Kim
2014-11-03  7:35   ` Adrian Hunter
2014-11-03  7:39     ` Namhyung Kim
2014-11-03  7:51       ` Adrian Hunter
2014-11-03  7:27 ` [PATCH 4/8] perf tools: Rename dsos__write_buildid_table() Namhyung Kim
2014-11-03  7:27 ` [PATCH 5/8] perf build-id: Move build-id related functions to util/build-id.c Namhyung Kim
2014-11-03  7:27 ` [PATCH 6/8] perf record: Do not save pathname in ./debug/.build-id directory for vmlinux Namhyung Kim
2014-11-03  7:27 ` [PATCH 7/8] perf tools: Fix build-id matching on vmlinux Namhyung Kim
2014-11-03  7:27 ` [PATCH 8/8] perf tools: Make vmlinux short name more like kallsyms short name Namhyung Kim
2014-09-22  8:04 [PATCH v4] perf tools: Fix build-id matching on vmlinux Namhyung Kim
2014-09-24  7:33 ` Ingo Molnar
2014-09-29  4:45   ` Namhyung Kim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).