Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754954AbbBRRWy (ORCPT ); Wed, 18 Feb 2015 12:22:54 -0500 Received: from mail-qc0-f174.google.com ([209.85.216.174]:57617 "EHLO mail-qc0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753570AbbBRRWu (ORCPT ); Wed, 18 Feb 2015 12:22:50 -0500 From: Stephane Eranian To: linux-kernel@vger.kernel.org Cc: acme@redhat.com, peterz@infradead.org, mingo@elte.hu, ak@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, cel@us.ibm.com, sukadev@linux.vnet.ibm.com, sonnyrao@chromium.org, johnmccutchan@google.com, dsahern@gmail.com, adrian.hunter@intel.com, pawell.moll@arm.com Subject: [PATCH v2 0/4] perf: add support for profiling jitted code Date: Wed, 18 Feb 2015 18:21:45 +0100 Message-Id: <1424280109-9801-1-git-send-email-eranian@google.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6785 Lines: 146 This patch series extends perf record/report/annotate to enable profiling of jitted (just-in-time compiled) code. The current perf tool provides very limited support for profiling jitted code for some runtime environments. But the support is experimental and cannot be used in complex environments. It relies on files in /tmp, for instance. It does not support annotate mode or rejitted code. This patch series adds a better way of profiling jitted code with the following advantages: - support any jitted code environment (some with modifications) - support Java runtime with JVMTI interface with no modifications - provides a portable JVMTI agent library - known to support V8 runtime - known to support DART runtime - supports code rejitting and movements - no files in /tmp - meta-data file is unique to each run - no changes to perf report/annotate The support is based on cooperation with the runtime. For Java runtimes, supporting the JVMTI interface, there is no change necessary. For other runtimes, modifications are necessary to emit the meta-data necessary to support symbolization and annotation of the samples. Those modifications are fairly straighforward and already tested on V8 and DART. The jit environment emits a binary dump file which contains the jitted code (in raw format) and meta-data describing the mapping of functions. The binary format is documented in the jitdump.h header file. It is adapted from the OProfile jitdump format. To enable synchronization of the runtime MMAPs with those recorded by the kernel on behalf of the perf tool, the runtime needs to timestamp any record in the dump file using the same time source. This second version is using Pawell Moll's patch and David Ahern's re-packaging on the patch which has a new POSIX clock: PERF_CLOCK. See the following page: https://github.com/dsahern/linux/blob/perf-full-monty/README.ahern Without this driver installed, records emitted by the runtime cannot be properly synchronized (inserted in the flow on MMAPS) and symbolization is not possible. The current support only works when the runtime is monitored from start to finish: perf record java --agenpath:libpfmjvmti.so my_class. Once the run is completed, the jitdump file needs to be injected into the perf.data file. This is accomplished by using the perf inject command. This will also generate an ELF image for each jitted function. The inject MMAP records will point to those ELF images. The reasoning behind using ELF images is that it makes processing for perf report and annotate automatic and transparent. It also makes it easier to package and analyze on a remote machine. The reporting is unchanged, simply invoke perf report or perf annotate on the modified perf.data file. The jitted code will appear symbolized and the assembly view will display the instruction level profile! As an added bonus, the series includes support for demangling function signature from OpenJDK. The current patch series does not include support for source line information. Therefore, the source code cannot yet be displayed in perf annotate. This will come in a later update. Furthermore, we believe there is a way to skip the perf inject phase and have perf report/annotate directly inject the MMAP records on the fly during processing of the perf.data file. Perf report would also generate the ELF files if necessary. Such optimization, would make using this extension seamless in system-wide mode and larger environments. This will be added in a later update as well. In V2, we have switchde to Pawell Moll and David Ahern posix clock kernel module instead. We have dropped the patch which modified the arguments to map_init() because the change was not used. We are not printing the return type of Java methods anymore and have made the Java demangler a separate module. We also rebased to 3.19.0+ from tip.git. To use the new feature: - compile and install the perf_posix_clock.ko module: - make modules (say M to PERF_CLOCK config option) - make modules_install; - modprobe perf_posix_clock - dmesg should say: perf_clock clock registered - compile perf - cd tools/perf/jvmti; make; install wherever is appropriate Example using openJDK: $ perf record java -agentpath:libjvmti.so my_class java: jvmti: jitdump in $HOME/.debug/jit/java-jit-20150207.XXL9649H/jit-6320.dump $ perf inject -i perf.data -j $HOME/.debug/jit/java-jit-20150207.XXL9649H/jit-6320.dump -o perf.data.jitted $ perf report -i perf.data.jitted Thanks to all the contributors and testers. Enjoy, Stephane Eranian (4): perf tools: add Java demangling support perf inject: add jitdump mmap injection support perf tools: add JVMTI agent library clock: add perf_clock posix clock include/uapi/linux/time.h | 1 + kernel/time/Kconfig | 6 + kernel/time/Makefile | 1 + kernel/time/perf_posix_clock.c | 54 ++++ tools/perf/Documentation/perf-inject.txt | 11 + tools/perf/Makefile.perf | 8 +- tools/perf/builtin-inject.c | 205 ++++++++++++++ tools/perf/jvmti/Makefile | 70 +++++ tools/perf/jvmti/jvmti_agent.c | 320 +++++++++++++++++++++ tools/perf/jvmti/jvmti_agent.h | 23 ++ tools/perf/jvmti/libjvmti.c | 149 ++++++++++ tools/perf/util/demangle-java.c | 199 +++++++++++++ tools/perf/util/demangle-java.h | 10 + tools/perf/util/genelf.c | 463 +++++++++++++++++++++++++++++++ tools/perf/util/genelf.h | 6 + tools/perf/util/jit.h | 27 ++ tools/perf/util/jitdump.c | 233 ++++++++++++++++ tools/perf/util/jitdump.h | 92 ++++++ tools/perf/util/symbol-elf.c | 3 + tools/perf/util/symbol.c | 6 +- 20 files changed, 1885 insertions(+), 2 deletions(-) create mode 100644 kernel/time/perf_posix_clock.c create mode 100644 tools/perf/jvmti/Makefile create mode 100644 tools/perf/jvmti/jvmti_agent.c create mode 100644 tools/perf/jvmti/jvmti_agent.h create mode 100644 tools/perf/jvmti/libjvmti.c create mode 100644 tools/perf/util/demangle-java.c create mode 100644 tools/perf/util/demangle-java.h create mode 100644 tools/perf/util/genelf.c create mode 100644 tools/perf/util/genelf.h create mode 100644 tools/perf/util/jit.h create mode 100644 tools/perf/util/jitdump.c create mode 100644 tools/perf/util/jitdump.h -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/