1. 20 4月, 2017 4 次提交
  2. 24 10月, 2016 5 次提交
    • S
      perf jit: Check JITHEADER_VERSION · 6760d77b
      Stefano Sanfilippo 提交于
      Check the version number when opening a jitdump file.  Accept older
      versions, but not newer ones.
      Signed-off-by: NStefano Sanfilippo <ssanfilippo@chromium.org>
      Signed-off-by: NRoss McIlroy <rmcilroy@chromium.org>
      Reviewed-by: NStephane Eranian <eranian@google.com>
      Cc: Anton Blanchard <anton@ozlabs.org>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/1476356383-30100-9-git-send-email-eranian@google.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      6760d77b
    • S
      perf jit: Generate .eh_frame/.eh_frame_hdr in DSO · 086f9f3d
      Stefano Sanfilippo 提交于
      When the jit_buf_desc contains unwinding information, it is emitted as
      eh_frame unwinding sections in the DSOs generated by perf inject.
      
      The unwinding information is required to unwind of JITed code which do
      not maintain the frame pointer register during function calls.  It can
      be emitted by V8 / Chromium when the --perf_prof_unwinding_info is
      passed to V8.
      
      The eh_frame and eh_frame_hdr sections are emitted immediately after the
      .text.
      
      The .eh_frame is aligned at a 8-byte boundary, and .eh_frame_hdr at a
      4-byte one. Since size of the .eh_frame is required to be a multiple of
      the word size, which means there will never be additional padding
      between it and the .eh_frame_hdr on machines where the word size is 4 or
      8 bytes.
      
      However, additional padding might be inserted between .text and
      .eh_frame to reach the correct alignment, which will always be 8 bytes,
      also on 32bit machines. The reasoning behind this choice is that 4 extra
      bytes of padding worst case are not a large cost for the advantage of
      removing word-size dependent offset calculations when emitting the
      jitdump.
      Signed-off-by: NStefano Sanfilippo <ssanfilippo@chromium.org>
      Signed-off-by: NRoss McIlroy <rmcilroy@chromium.org>
      Reviewed-by: NStephane Eranian <eranian@google.com>
      Cc: Anton Blanchard <anton@ozlabs.org>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/1476356383-30100-8-git-send-email-eranian@google.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      086f9f3d
    • S
      perf jit: Add unwinding support · 0284fecd
      Stefano Sanfilippo 提交于
      This record is intended to provide unwinding information in the
      eh_frame format. This is required to unwind JITed code which
      does not maintain the frame pointer register during function calls.
      
      The eh_frame unwinding information can be emitted by V8 / Chromium
      when the --perf_prof_unwinding_info is passed.
      
      A record of type jr_code_unwinding_info comes before the jr_code_load
      it referred to and contains both the .eh_frame and .eh_frame_hdr.
      
      The fields in the header have the following meaning:
      
        * unwinding_size: size of the eh_frame and eh_frame_hdr, necessary
          for distinguishing the content from the padding.
      
        * eh_frame_hdr_size: as the name says.
      
        * mapped_size: size of the payload that was in memory at runtime.
          typically unwinding_size if the .eh_frame_hdr and .eh_frame were
          mapped, or 0 if they weren't. It should always be the former case,
          since the .eh_frame is guaranteed to be mapped in memory. However,
          certain JITs might want to inject an .eh_frame_hdr with an empty LUT
          to trigger fp-based unwinding fallback in libunwind. The only part
          of the .eh_frame_hdr that libunwind reads from remote memory is the
          LUT, and since there is none, mapping the unwinding info in memory
          is not necessary, and 0 in this field signifies that it wasn't.
          This practical hack allows to save bytes in code memory for those
          JIT compilers that might or might not maintain a valid frame pointer.
      
      The payload that follows is assumed to contain first the .eh_frame and
      then the .eh_header_hdr, with no padding between the two.
      Signed-off-by: NStefano Sanfilippo <ssanfilippo@chromium.org>
      Signed-off-by: NRoss McIlroy <rmcilroy@chromium.org>
      Reviewed-by: NStephane Eranian <eranian@google.com>
      Cc: Anton Blanchard <anton@ozlabs.org>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/1476356383-30100-7-git-send-email-eranian@google.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      0284fecd
    • S
      perf jit: Make perf skip unknown records · 7354ec7a
      Stefano Sanfilippo 提交于
      The behavior before this commit was to skip the remaining portion of the
      jitdump in case an unknown record was found, including those records
      that perf could handle.
      
      With this change, parsing a record with an unknown id will cause a
      warning to be emitted, the record will be skipped and parsing will
      resume from the next (valid) one.
      
      The patch aims at making perf more future proof, by extracting as much
      information as possible from jitdumps.
      Signed-off-by: NStefano Sanfilippo <ssanfilippo@chromium.org>
      Signed-off-by: NRoss McIlroy <rmcilroy@chromium.org>
      Reviewed-by: NStephane Eranian <eranian@google.com>
      Cc: Anton Blanchard <anton@ozlabs.org>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/1476356383-30100-5-git-send-email-eranian@google.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      7354ec7a
    • A
      perf jit: Avoid returning garbage for a ret variable · ef2c3e76
      Arnaldo Carvalho de Melo 提交于
      When the loop body isn't executed at all, then the 'ret' local variable,
      that is uninitialized will be used as the return value.
      
      This triggers this error on Alpine Linux:
      
          CC	   /tmp/build/perf/util/demangle-java.o
          CC	   /tmp/build/perf/util/demangle-rust.o
          CC       /tmp/build/perf/util/jitdump.o
          CC       /tmp/build/perf/util/genelf.o
        util/jitdump.c: In function 'jit_process':
        util/jitdump.c:622:3: error: 'ret' may be used uninitialized in this function [-Werror=maybe-uninitialized]
           fprintf(stderr, "injected: %s (%d)\n", path, ret);
           ^
        util/jitdump.c:584:6: note: 'ret' was declared here
          int ret;
              ^
          FLEX     /tmp/build/perf/util/parse-events-flex.c
      
        / $ gcc -v
        Using built-in specs.
        COLLECT_GCC=gcc
        COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-alpine-linux-musl/5.3.0/lto-wrapper
        Target: x86_64-alpine-linux-musl
        Configured with: /home/buildozer/aports/main/gcc/src/gcc-5.3.0/configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
        +--build=x86_64-alpine-linux-musl --host=x86_64-alpine-linux-musl --target=x86_64-alpine-linux-musl --with-pkgversion='Alpine 5.3.0' --enable-checking=release
        +--disable-fixed-point --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --disable-symvers --enable-__cxa_atexit --enable-esp
        +--enable-cloog-backend --enable-languages=c,c++,objc,java,fortran,ada --disable-libssp --disable-libmudflap --disable-libsanitizer --enable-shared
        +--enable-threads --enable-tls --with-system-zlib
        Thread model: posix
        gcc version 5.3.0 (Alpine 5.3.0)
      
      But this so far got under the radar, not causing any build problem, till the
      "perf jit: enable jitdump support without dwarf" gets applied, when the above
      problem takes place, some combination of inlining or whatever, the problem
      is real, so fix it by initializing the variable to zero.
      
      Cc: Anton Blanchard <anton@ozlabs.org>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Maciej Debski <maciejd@google.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: https://lkml.kernel.org/r/20161013200437.GA12815@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      ef2c3e76
  3. 16 8月, 2016 1 次提交
    • A
      perf jitdump: Add the right header to get the major()/minor() definitions · 49a7f010
      Arnaldo Carvalho de Melo 提交于
      Noticed on Fedora Rawhide:
      
        $ gcc --version
        gcc (GCC) 6.1.1 20160721 (Red Hat 6.1.1-4)
        $ rpm -q glibc
        glibc-2.24.90-1.fc26.x86_64
        $
      
          CC       /tmp/build/perf/util/jitdump.o
        util/jitdump.c: In function 'jit_repipe_code_load':
        util/jitdump.c:428:2: error: '__major_from_sys_types' is deprecated:
          In the GNU C Library, `major' is defined by <sys/sysmacros.h>.
          For historical compatibility, it is currently defined by
          <sys/types.h> as well, but we plan to remove this soon.
          To use `major', include <sys/sysmacros.h> directly.
          If you did not intend to use a system-defined macro `major',
          you should #undef it after including <sys/types.h>.
          [-Werror=deprecated-declarations]
          event->mmap2.maj   = major(st.st_dev);
          ^~~~~
        In file included from /usr/include/features.h:397:0,
                         from /usr/include/sys/types.h:25,
                         from util/jitdump.c:1:
        /usr/include/sys/sysmacros.h:87:1: note: declared here
         __SYSMACROS_DEFINE_MAJOR (__SYSMACROS_FST_IMPL_TEMPL)
      
      Fix it following that recomendation.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: http://lkml.kernel.org/n/tip-3majvd0adhfr25rvx4v5e9te@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      49a7f010
  4. 23 6月, 2016 1 次提交
  5. 19 4月, 2016 1 次提交
    • C
      perf jit: memset() variable 'st' using the correct size · f56ebf20
      Colin Ian King 提交于
      The current code is memsetting the 'struct stat' variable 'st' with the size of
      'stat' (which turns out to be 1 byte) rather than the size of variable 'sz'.
      
      Committer notes:
      
      sizeof(function) isn't valid, the result depends on the compiler used, with
      gcc, enabling pedantic warnings we get:
      
        $ cat sizeof_function.c
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <unistd.h>
        #include <stdio.h>
      
        int main(void)
        {
      	  printf("sizeof(stat)=%zd, stat=%p\n", sizeof(stat), stat);
      	  return 0;
        }
        $ readelf -sW sizeof_function | grep -w stat
            49: 0000000000400630    16 FUNC    WEAK   HIDDEN    13 stat
        $ cc -pedantic sizeof_function.c   -o sizeof_function
        sizeof_function.c: In function ‘main’:
        sizeof_function.c:8:46: warning: invalid application of ‘sizeof’ to a function type [-Wpointer-arith]
          printf("sizeof(stat)=%zd, stat=%p\n", sizeof(stat), stat);
                                                    ^
        $ ./sizeof_function
        sizeof(stat)=1, stat=0x400630
        $
      
        Standard C, section 6.5.3.4:
      
        "The sizeof operator shall not be applied to an expression that has function
         type or an incomplete type, to the parenthesized name of such a type,
         or to an expression that designates a bit-field member."
      
        http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdfSigned-off-by: NColin Ian King <colin.king@canonical.com>
      Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Fixes: 9b07e27f ("perf inject: Add jitdump mmap injection support")
      Link: http://lkml.kernel.org/r/1461020838-9260-1-git-send-email-colin.king@canonical.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      f56ebf20
  6. 02 4月, 2016 1 次提交
  7. 30 3月, 2016 1 次提交
    • A
      perf tools: Add missing initialization of perf_sample.cpumode in synthesized samples · 3ea223ad
      Arnaldo Carvalho de Melo 提交于
      In 473398a2 ("perf tools: Add cpumode to struct perf_sample"), I
      missed some places where perf_sample fields are directly initialized in
      addition to what is done in perf_evsel__parse_sample(), namely when
      synthesizing PERF_RECORD_{MMAP*,COMM,FORK,EXIT} for pre-existing threads
      and also in intel_pt and intel_bts when synthesizing events from
      processor trace, the jitdump code also was affected, fix it.
      
      The problem was noticed with running:
      
        # perf record -e intel_pt//u true
        # perf script
      
      Where the samples wouldn't get resolved because perf_sample.cpumode
      would be left as zero, i.e. PERF_RECORD_MISC_CPUMODE_UNKNOWN, not
      resolving as kernel, hypervisor or user cpu modes.
      
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Fixes: 473398a2 ("perf tools: Add cpumode to struct perf_sample")
      Link: http://lkml.kernel.org/n/tip-n5sdauxgk24d5nun8kuuu2mh@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      3ea223ad
  8. 08 3月, 2016 2 次提交
  9. 05 2月, 2016 2 次提交
    • S
      perf jit: add source line info support · 598b7c69
      Stephane Eranian 提交于
      This patch adds source line information support to perf for jitted code.
      
      The source line info must be emitted by the runtime, such as JVMTI.
      
      Perf injects extract the source line info from the jitdump file and adds
      the corresponding .debug_lines section in the ELF image generated for
      each jitted function.
      
      The source line enables matching any address in the profile with a
      source file and line number.
      
      The improvement is visible in perf annotate with the source code
      displayed alongside the assembly code.
      
      The dwarf code leverages the support from OProfile which is also
      released under GPLv2.  Copyright 2007 OProfile authors.
      Signed-off-by: NStephane Eranian <eranian@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Carl Love <cel@us.ibm.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: John McCutchan <johnmccutchan@google.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Pawel Moll <pawel.moll@arm.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Sonny Rao <sonnyrao@chromium.org>
      Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
      Link: http://lkml.kernel.org/r/1448874143-7269-5-git-send-email-eranian@google.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      598b7c69
    • S
      perf inject: Add jitdump mmap injection support · 9b07e27f
      Stephane Eranian 提交于
      This patch adds a --jit/-j option to perf inject.
      
      This options injects MMAP records into the perf.data file to cover the
      jitted code mmaps. It also emits ELF images for each function in the
      jidump file.  Those images are created where the jitdump file is.  The
      MMAP records point to that location as well.
      
      Typical flow:
      
        $ perf record -k mono -- java -agentpath:libpjvmti.so java_class
        $ perf inject --jit -i perf.data -o perf.data.jitted
        $ perf report -i perf.data.jitted
      
      Note that jitdump.h support is not limited to Java, it works with any
      jitted environment modified to emit the jitdump file format, include
      those where code can be jitted multiple times and moved around.
      
      The jitdump.h format is adapted from the Oprofile project.
      
      The genelf.c (ELF binary generation) depends on MD5 hash encoding for
      the buildid. To enable this, libssl-dev must be installed. If not, then
      genelf.c defaults to using urandom to generate the buildid, which is not
      ideal.  The Makefile auto-detects the presence on libssl-dev.
      
      This version mmaps the jitdump file to create a marker MMAP record in
      the perf.data file. The marker is used to detect jitdump and cause perf
      inject to inject the jitted mmaps and generate ELF images for jitted
      functions.
      
      In V8, the following fixes and changes were made among other things:
      
        -  the jidump header format include a new flags field to be used
           to carry information about the configuration of the runtime agent.
           Contributed by: Adrian Hunter <adrian.hunter@intel.com>
      
        - Fix mmap pgoff: MMAP event pgoff must be the offset within the ELF file
          at which the code resides.
          Contributed by: Adrian Hunter <adrian.hunter@intel.com>
      
        - Fix ELF virtual addresses: perf tools expect the ELF virtual addresses of dynamic
          objects to match the file offset.
          Contributed by: Adrian Hunter <adrian.hunter@intel.com>
      
        - JIT MMAP injection does not obey finished_round semantics. JIT MMAP injection injects all
          MMAP events in one go, so it does not obey finished_round semantics, so drop the
          finished_round events from the output perf.data file.
          Contributed by: Adrian Hunter <adrian.hunter@intel.com>
      Signed-off-by: NStephane Eranian <eranian@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Carl Love <cel@us.ibm.com>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: John McCutchan <johnmccutchan@google.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Pawel Moll <pawel.moll@arm.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Sonny Rao <sonnyrao@chromium.org>
      Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
      Link: http://lkml.kernel.org/r/1448874143-7269-3-git-send-email-eranian@google.com
      [ Moved inject.build_ids ordering bits to a separate patch, fixed the NO_LIBELF=1 build ]
      Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      9b07e27f