1. 18 Dec, 2018 34 commits
    • Leo Yan's avatar
      perf cs-etm: Generate branch sample for exception packet · 7100b12c
      Leo Yan authored
      The exception packet appears as one element with 'elem_type' ==
      OCSD_GEN_TRC_ELEM_EXCEPTION or OCSD_GEN_TRC_ELEM_EXCEPTION_RET, which is
      present for exception entry and exit respectively.  The decoder sets the
      packet fields 'packet->exc' and 'packet->exc_ret' to indicate the
      exception packets; but exception packets don't have a dedicated sample
      type and shares the same sample type CS_ETM_RANGE with normal
      instruction packets.
      
      As a result, the exception packets are taken as normal instruction
      packets and this introduces confusion in mixing different packet types.
      Furthermore, these instruction range packets will be processed for
      branch samples only when 'packet->last_instr_taken_branch' is true,
      otherwise they will be omitted, this can introduce a mess for exception
      and exception returning due to not having the complete address range
      info for context switching.
      
      To process exception packets properly, this patch introduces two new
      sample types: CS_ETM_EXCEPTION and CS_ETM_EXCEPTION_RET; these two types
      of packets will be handled by cs_etm__exception().  The function
      cs_etm__exception() forces setting the previous CS_ETM_RANGE packet flag
      'prev_packet->last_instr_taken_branch' to true, this matches well with
      the program flow when the exception is trapped from user space to kernel
      space, no matter if the most recent flow has branch taken or not; this
      is also safe for returning to user space after exception handling.
      
      After exception packets have their own sample type, the packet fields
      'packet->exc' and 'packet->exc_ret' aren't needed anymore, so remove
      them.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight ml <coresight@lists.linaro.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-9-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7100b12c
    • Leo Yan's avatar
      perf cs-etm: Treat EO_TRACE element as trace discontinuity · 02e7e250
      Leo Yan authored
      If the decoder outputs an EO_TRACE element, it means the end of the
      trace buffer; this is a discontinuity and in this case the end of trace
      data needs to be saved.
      
      This patch generates a CS_ETM_DISCONTINUITY packet for the EO_TRACE
      element hereby flushing the end of trace data in cs-etm.c.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-8-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      02e7e250
    • Leo Yan's avatar
      perf cs-etm: Treat NO_SYNC element as trace discontinuity · 37bb3716
      Leo Yan authored
      The CoreSight tracer driver might insert barrier packets between
      different buffers, thus the decoder can spot the boundaries based on the
      barrier packet; it is possible for the decoder to hit a barrier packet
      and emit a NO_SYNC element, then the decoder will find a periodic
      synchronisation point inside that next trace block that starts the trace
      again but does not have the TRACE_ON element as indicator - usually
      because this trace block has wrapped the buffer so we have lost the
      original point when the trace was enabled.
      
      In the first case it causes the insertion of a OCSD_GEN_TRC_ELEM_NO_SYNC
      in the middle of the tracing stream, but as we were not handling the
      NO_SYNC element properly this ends up making users miss the
      discontinuity indications.
      
      Though OCSD_GEN_TRC_ELEM_NO_SYNC is different from CS_ETM_TRACE_ON when
      output from the decoder, both indicate that the trace data is
      discontinuous; this patch treats OCSD_GEN_TRC_ELEM_NO_SYNC as a trace
      discontinuity and generates a CS_ETM_DISCONTINUITY packet for it, so
      cs-etm can handle the discontinuity for this case, finally it saves the
      last trace data for the previous trace block and restart samples for the
      new block.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight ml <coresight@lists.linaro.org>
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-7-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      37bb3716
    • Leo Yan's avatar
      perf cs-etm: Rename CS_ETM_TRACE_ON to CS_ETM_DISCONTINUITY · 49ccf87b
      Leo Yan authored
      TRACE_ON element is used at the beginning of trace, it also can be
      appeared in the middle of trace data to indicate discontinuity; for
      example, it's possible to see multiple TRACE_ON elements in the trace
      stream if the trace is being limited by address range filtering.
      
      Furthermore, except TRACE_ON element is for discontinuity, NO_SYNC and
      EO_TRACE also can be used to indicate discontinuity, though they are
      used for different scenarios for which the trace is interrupted.
      
      This patch renames sample type CS_ETM_TRACE_ON to CS_ETM_DISCONTINUITY,
      firstly the new name describes more closely the purpose of the packet;
      secondly this is a preparation for other output elements which also
      cause the trace discontinuity thus they can share the same one packet
      type.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-6-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      49ccf87b
    • Leo Yan's avatar
      perf cs-etm: Refactor enumeration cs_etm_sample_type · cfc1d427
      Leo Yan authored
      The values in enumeration cs_etm_sample_type are defined with setting
      bit N for each packet type, this is not suggested in the usual case.
      
      This patch refactor cs_etm_sample_type by converting from bit shifting
      values to continuous numbers.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-5-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      cfc1d427
    • Leo Yan's avatar
      perf cs-etm: Remove unused 'trace_on' in cs_etm_decoder · cee7a6a2
      Leo Yan authored
      cs_etm_decoder::trace_on is being assigned when TRACE_ON or NO_SYNC
      element is coming, but it is never used hence it is redundant and can
      be removed.
      
      So let's remove 'trace_on' field from cs_etm_decoder struct.
      Suggested-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-4-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      cee7a6a2
    • Leo Yan's avatar
      perf cs-etm: Avoid stale branch samples when flush packet · 24fff5eb
      Leo Yan authored
      At the end of trace buffer handling, function cs_etm__flush() is invoked
      to flush any remaining branch stack entries.  As a side effect, it also
      generates branch sample, because the 'etmq->packet' doesn't contains any
      new coming packet but point to one stale packet after packets swapping,
      so it wrongly makes synthesize branch samples with stale packet info.
      
      We could review below detailed flow which causes issue:
      
        Packet1: start_addr=0xffff000008b1fbf0 end_addr=0xffff000008b1fbfc
        Packet2: start_addr=0xffff000008b1fb5c end_addr=0xffff000008b1fb6c
      
        step 1: cs_etm__sample():
      	sample: ip=(0xffff000008b1fbfc-4) addr=0xffff000008b1fb5c
      
        step 2: flush packet in cs_etm__run_decoder():
      	cs_etm__run_decoder()
      	  `-> err = cs_etm__flush(etmq, false);
      	sample: ip=(0xffff000008b1fb6c-4) addr=0xffff000008b1fbf0
      
      Packet1 and packet2 are two continuous packets, when packet2 is the new
      coming packet, cs_etm__sample() generates branch sample for these two
      packets and use [packet1::end_addr - 4 => packet2::start_addr] as branch
      jump flow, thus we can see the first generated branch sample in step 1.
      At the end of cs_etm__sample() it swaps packets so 'etm->prev_packet'=
      packet2 and 'etm->packet'=packet1, so far it's okay for branch sample.
      
      If packet2 is the last one packet in trace buffer, even there have no
      any new coming packet, cs_etm__run_decoder() invokes cs_etm__flush() to
      flush branch stack entries as expected, but it also generates branch
      samples by taking 'etm->packet' as a new coming packet, thus the branch
      jump flow is as [packet2::end_addr - 4 =>  packet1::start_addr]; this
      is the second sample which is generated in step 2.  So actually the
      second sample is a stale sample and we should not generate it.
      
      This patch introduces a new function cs_etm__end_block(), at the end of
      trace block this function is invoked to only flush branch stack entries
      and thus can avoid to generate branch sample for stale packet.
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-3-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      24fff5eb
    • Leo Yan's avatar
      perf cs-etm: Correct packets swapping in cs_etm__flush() · 43fd5666
      Leo Yan authored
      The structure cs_etm_queue uses 'prev_packet' to point to previous
      packet, this can be used to combine with new coming packet to generate
      samples.
      
      In function cs_etm__flush() it swaps packets only when the flag
      'etm->synth_opts.last_branch' is true, this means that it will not swap
      packets if without option '--itrace=il' to generate last branch entries;
      thus for this case the 'prev_packet' doesn't point to the correct
      previous packet and the stale packet still will be used to generate
      sequential sample.  Thus if dump trace with 'perf script' command we can
      see the incorrect flow with the stale packet's address info.
      
      This patch corrects packets swapping in cs_etm__flush(); except using
      the flag 'etm->synth_opts.last_branch' it also checks the another flag
      'etm->sample_branches', if any flag is true then it swaps packets so can
      save correct content to 'prev_packet'.  Finally this can fix the wrong
      program flow dumping issue.
      
      The patch has a minor refactoring to use 'etm->synth_opts.last_branch'
      instead of 'etmq->etm->synth_opts.last_branch' for condition checking,
      this is consistent with that is done in cs_etm__sample().
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Robert Walker <robert.walker@arm.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: http://lkml.kernel.org/r/1544513908-16805-2-git-send-email-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      43fd5666
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Switch to using a struct for the aumented_raw_syscalls syscalls map values · bbab50dd
      Arnaldo Carvalho de Melo authored
      We'll start adding more perf-syscall stuff, so lets do this prep step so
      that the next ones are just about adding more fields.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-vac4sn1ns1vj4y07lzj7y4b8@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      bbab50dd
    • Arnaldo Carvalho de Melo's avatar
      perf augmented_syscalls: Switch to using a struct for the syscalls map values · 27f2992e
      Arnaldo Carvalho de Melo authored
      We'll start adding more perf-syscall stuff, so lets do this prep step so
      that the next ones are just about adding more fields.
      
      Run it with the .c file once to cache the .o file:
      
        # trace --filter-pids 2834,2199 -e openat,augmented_raw_syscalls.c
        LLVM: dumping augmented_raw_syscalls.o
             0.000 ( 0.021 ms): tmux: server/4952 openat(dfd: CWD, filename: /proc/5691/cmdline                         ) = 11
           349.807 ( 0.040 ms): DNS Res~er #39/11082 openat(dfd: CWD, filename: /etc/hosts, flags: CLOEXEC                 ) = 44
          4988.759 ( 0.052 ms): gsd-color/2431 openat(dfd: CWD, filename: /etc/localtime                             ) = 18
          4988.976 ( 0.029 ms): gsd-color/2431 openat(dfd: CWD, filename: /etc/localtime                             ) = 18
        ^C[root@quaco bpf]#
      
      From now on, we can use just the newly built .o file, skipping the
      compilation step for a faster startup:
      
        # trace --filter-pids 2834,2199 -e openat,augmented_raw_syscalls.o
             0.000 ( 0.046 ms): DNS Res~er #39/11088 openat(dfd: CWD, filename: /etc/hosts, flags: CLOEXEC                 ) = 44
          1946.408 ( 0.190 ms): systemd/1 openat(dfd: CWD, filename: /proc/1071/cgroup, flags: CLOEXEC          ) = 20
          1946.792 ( 0.215 ms): systemd/1 openat(dfd: CWD, filename: /proc/954/cgroup, flags: CLOEXEC           ) = 20
        ^C#
      
      Now on to do the same in the builtin-trace.c side of things.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-k8mwu04l8es29rje5loq9vg7@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      27f2992e
    • Arnaldo Carvalho de Melo's avatar
      perf bpf: Move perf_event_output() from stdio.h to bpf.h · 61d00713
      Arnaldo Carvalho de Melo authored
      So that we don't always carry that __bpf_output__ map, leaving that to
      the scripts wanting to use that facility.
      
      'perf trace' will be changed to look if that map is present and only
      setup the bpf-output events if so.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-azwys8irxqx9053vpajr0k5h@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      61d00713
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Implement syscall filtering in augmented_syscalls · b27b38ed
      Arnaldo Carvalho de Melo authored
      Just another map, this time an BPF_MAP_TYPE_ARRAY, stating with
      one bool per syscall, stating if it should be filtered or not.
      
      So, with a pre-built augmented_raw_syscalls.o file, we use:
      
        # perf trace -e open*,augmented_raw_syscalls.o
           0.000 ( 0.016 ms): DNS Res~er #37/29652 openat(dfd: CWD, filename: /etc/hosts, flags: CLOEXEC                 ) = 138
         187.039 ( 0.048 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /etc/fstab, flags: CLOEXEC                 ) = 11
         187.348 ( 0.041 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /proc/self/mountinfo, flags: CLOEXEC       ) = 11
         188.793 ( 0.036 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /proc/self/mountinfo, flags: CLOEXEC       ) = 11
         189.803 ( 0.029 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /proc/self/mountinfo, flags: CLOEXEC       ) = 11
         190.774 ( 0.027 ms): gsd-housekeepi/2436 openat(dfd: CWD, filename: /proc/self/mountinfo, flags: CLOEXEC       ) = 11
         284.620 ( 0.149 ms): DataStorage/3076 openat(dfd: CWD, filename: /home/acme/.mozilla/firefox/ina67tev.default/SiteSecurityServiceState.txt, flags: CREAT|TRUNC|WRONLY, mode: IRUGO|IWUSR|IWGRP) = 167
        ^C#
      
      What is it that this gsd-housekeeping thingy needs to open
      /proc/self/mountinfo four times periodically? :-)
      
      This map will be extended to tell per-syscall parameters, i.e. how many
      bytes to copy per arg, using the function signature to get the types and
      then the size of those types, via BTF.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-cy222g9ucvnym3raqvxp0hpg@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b27b38ed
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Avoid using raw_syscalls in duplicity with eBPF augmentation · 0df50e0b
      Arnaldo Carvalho de Melo authored
      So when we do something like:
      
         # perf trace -e open*,augmented_raw_syscalls.o
      
      We need to set trace->trace_syscalls because there is logic that use
      that when mixing strace-like output with other events, such as scheduler
      tracepoints, but with that set we ended up having multiple
      raw_syscalls:sys_{enter,exit} setup, which garbled the output, so
      check if trace->augmented_raw_syscalls is set and avoid the two extra
      tracepoints.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-kjmnbrlgu0c38co1ye8egbsb@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0df50e0b
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Rename set_ev_qualifier_filter to clarify its a tracepoint filter · 246fbe03
      Arnaldo Carvalho de Melo authored
      Rename it to trace__set_ev_qualifier_tp_filter(), as this just sets up
      tracepoint filters on the raw_syscalls:sys_{enter,exit} tracepoints, and
      since we're going to do the same for the augmented_raw_syscalls
      codepath, when used, rename it to clarify.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Wang Nan <wangnan0@huawei.com>
      Link: https://lkml.kernel.org/n/tip-8bjsul8x7osw7nxjodnyfn14@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      246fbe03
    • Jiri Olsa's avatar
      perf tools: Link libperf-jvmti.so with LDFLAGS variable · 3f643937
      Jiri Olsa authored
      So we could propagate distro flags into libperf-jvmti.so library.
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/20181212132940.840-1-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      3f643937
    • Jiri Olsa's avatar
      tools lib traceevent: Use LDFLAGS in the build commands · 41fa483a
      Jiri Olsa authored
      So that the user can specify outside LDFLAGS values.
      
      Keeping the CFLAGS in there as well, so we don't break existing scripts.
      Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
      Acked-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Herton Krzesinski <herton@redhat.com>
      Cc: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
      Link: http://lkml.kernel.org/r/20181212091214.GC17489@kravaSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      41fa483a
    • Arnaldo Carvalho de Melo's avatar
      perf tools: Cast off_t to s64 to avoid warning on bionic libc · 866053bb
      Arnaldo Carvalho de Melo authored
      To avoid this warning:
      
          CC       /tmp/build/perf/util/s390-cpumsf.o
        util/s390-cpumsf.c: In function 's390_cpumsf_samples':
        util/s390-cpumsf.c:508:3: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 4 has type 'off_t' [-Wformat=]
           pr_err("[%#08" PRIx64 "] Invalid AUX trailer entry TOD clock base\n",
           ^
      
      Now the various Android cross toolchains used in the perf tools
      container test builds are all clean and we can remove this:
      
        export EXTRA_MAKE_ARGS="WERROR=0"
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Thomas Richter <tmricht@linux.ibm.com>
      Link: https://lkml.kernel.org/n/tip-5rav4ccyb0sjciysz2i4p3sx@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      866053bb
    • Arnaldo Carvalho de Melo's avatar
      perf tools: Add missing open_memstream() prototype for systems lacking it · d7a8c4a6
      Arnaldo Carvalho de Melo authored
      There are systems such as the Android NDK API level 24 has the
      open_memstream() function but doesn't provide a prototype, adding noise
      to the build:
      
        builtin-timechart.c: In function 'cat_backtrace':
        builtin-timechart.c:486:2: warning: implicit declaration of function 'open_memstream' [-Wimplicit-function-declaration]
          FILE *f = open_memstream(&p, &p_len);
          ^
        builtin-timechart.c:486:2: warning: nested extern declaration of 'open_memstream' [-Wnested-externs]
        builtin-timechart.c:486:12: warning: initialization makes pointer from integer without a cast
          FILE *f = open_memstream(&p, &p_len);
                    ^
      
      Define a LACKS_OPEN_MEMSTREAM_PROTOTYPE define so that code needing that
      can get a prototype.
      
      Checked in the bionic git repo to be available since level 23:
      
      https://android.googlesource.com/platform/bionic/+/master/libc/include/stdio.h#241
      
        FILE* open_memstream(char** __ptr, size_t* __size_ptr) __INTRODUCED_IN(23);
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-343ashae97e5bq6vizusyfno@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      d7a8c4a6
    • Arnaldo Carvalho de Melo's avatar
      perf header: Fix up argument to ctime() · 0afcf29b
      Arnaldo Carvalho de Melo authored
      Reducing this noise when cross building to the Android NDK:
      
        util/header.c: In function 'perf_header__fprintf_info':
        util/header.c:2710:45: warning: pointer targets in passing argument 1 of 'ctime' differ in signedness [-Wpointer-sign]
          fprintf(fp, "# captured on    : %s", ctime(&st.st_ctime));
                                                     ^
        In file included from util/../perf.h:5:0,
                         from util/evlist.h:11,
                         from util/header.c:22:
        /opt/android-ndk-r15c/platforms/android-26/arch-arm/usr/include/time.h:81:14: note: expected 'const time_t *' but argument is of type 'long unsigned int *'
         extern char* ctime(const time_t*) __LIBC_ABI_PUBLIC__;
                      ^
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-6bz74zp080yhmtiwb36enso9@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0afcf29b
    • Arnaldo Carvalho de Melo's avatar
      perf tools: Add missing sigqueue() prototype for systems lacking it · 748fe088
      Arnaldo Carvalho de Melo authored
      There are systems such as the Android NDK API level 24 has the
      sigqueue() function but doesn't provide a prototype, adding noise to the
      build:
      
        util/evlist.c: In function 'perf_evlist__prepare_workload':
        util/evlist.c:1494:4: warning: implicit declaration of function 'sigqueue' [-Wimplicit-function-declaration]
            if (sigqueue(getppid(), SIGUSR1, val))
            ^
        util/evlist.c:1494:4: warning: nested extern declaration of 'sigqueue' [-Wnested-externs]
      
      Define a LACKS_SIGQUEUE_PROTOTYPE define so that code needing that can
      get a prototype.
      
      Checked in the bionic git repo to be available since level 23:
      
      https://android.googlesource.com/platform/bionic/+/master/libc/include/signal.h#123
      
        int sigqueue(pid_t __pid, int __signal, const union sigval __value) __INTRODUCED_IN(23);
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-lmhpev1uni9kdrv7j29glyov@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      748fe088
    • Arnaldo Carvalho de Melo's avatar
      tools lib subcmd: Don't add the kernel sources to the include path · ece98049
      Arnaldo Carvalho de Melo authored
      At some point we decided not to directly include kernel sources files
      when building tools/perf/, but when tools/lib/subcmd/ was forked from
      tools/perf it somehow ended up adding it via these two lines in its
      Makefile:
      
        CFLAGS += -I$(srctree)/include/uapi
        CFLAGS += -I$(srctree)/include
      
      As $(srctree) points to the kernel sources.
      
      Removing those lines and keeping just:
      
        CFLAGS += -I$(srctree)/tools/include/
      
      Is enough to build tools/perf and tools/objtool.
      
      This fixes the build when building from the sources in environments such
      as the Android NDK crossbuilding from a fedora:26 system:
      
        subcmd-util.h:11:15: error: expected ',' or ';' before 'void'
         static inline void report(const char *prefix, const char *err, va_list params)
                       ^
        In file included from /git/perf/include/uapi/linux/stddef.h:2:0,
                         from /git/perf/include/uapi/linux/posix_types.h:5,
                         from /opt/android-ndk-r12b/platforms/android-24/arch-arm/usr/include/sys/types.h:36,
                         from /opt/android-ndk-r12b/platforms/android-24/arch-arm/usr/include/unistd.h:33,
                         from run-command.c:2:
        subcmd-util.h:18:17: error: '__no_instrument_function__' attribute applies only to functions
      
      The /opt/android-ndk-r12b/platforms/android-24/arch-arm/usr/include/sys/types.h
      file that includes linux/posix_types.h ends up getting the one in the kernel
      sources causing the breakage. Fix it.
      
      Test built tools/objtool/ too.
      Reported-by: default avatarJiri Olsa <jolsa@kernel.org>
      Tested-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Josh Poimboeuf <jpoimboe@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Fixes: 4b6ab94e ("perf subcmd: Create subcmd library")
      Link: https://lkml.kernel.org/n/tip-5lhaoecrj12t0bqwvpiu14sm@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ece98049
    • Arnaldo Carvalho de Melo's avatar
      perf trace beauty: renameat's newdirfd may also be AT_FDCWD · 436651ca
      Arnaldo Carvalho de Melo authored
      Noticed while working on renameat2.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-8omchrcjcvlwoxxv6wrjehfh@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      436651ca
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Beautify renameat2's flags argument · ca7ff2c8
      Arnaldo Carvalho de Melo authored
        # strace -e renameat2 -f perf trace -e rename* mv c /tmp
        strace: Process 10824 attached
        [pid 10824] renameat2(AT_FDCWD, "c", AT_FDCWD, "/tmp", RENAME_NOREPLACE) = -1 EXDEV (Invalid cross-device link)
        [pid 10824] renameat2(AT_FDCWD, "c", AT_FDCWD, "/tmp/c", RENAME_NOREPLACE) = -1 EEXIST (File exists)
             1.857 ( 0.008 ms): mv/10824 renameat2(olddfd: CWD, oldname: 0x7ffc72ff3d81, newdfd: CWD, newname: 0x7ffc72ff3d83, flags: NOREPLACE) = -1 EXDEV Invalid cross-device link
             2.002 ( 0.006 ms): mv/10824 renameat2(olddfd: CWD, oldname: 0x7ffc72ff3d81, newdfd: CWD, newname: 0x55ad609efcc0, flags: NOREPLACE) = -1 EEXIST File exists
        mv: 'c' and '/tmp/c' are the same file
        [pid 10824] +++ exited with 1 +++
        --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=10824, si_uid=0, si_status=1, si_utime=0, si_stime=0} ---
        +++ exited with 0 +++
        #
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-glyt6nzlt1yx56m5bshy6g83@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ca7ff2c8
    • Arnaldo Carvalho de Melo's avatar
      perf beauty: Wire up the renameat flags table generator to the Makefile · 5a1cb7ed
      Arnaldo Carvalho de Melo authored
      Now when we run 'make -C tools/perf O=/tmp/build/perf' we end up with:
      
        $ cat /tmp/build/perf/trace/beauty/generated/rename_flags_array.c
        static const char *rename_flags[] = {
      	[0 + 1] = "NOREPLACE",
      	[1 + 1] = "EXCHANGE",
      	[2 + 1] = "WHITEOUT",
        };
        $
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-4fad4xahrn04y06o0lc49clm@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      5a1cb7ed
    • Arnaldo Carvalho de Melo's avatar
      perf beauty: Add a string table generator for renameat2's flags constants · bdc2a9d6
      Arnaldo Carvalho de Melo authored
      Using the already copied tools/include/uapi/linux/fs.h file:
      
        $ tools/perf/trace/beauty/rename_flags.sh
        static const char *rename_flags[] = {
      	[0 + 1] = "NOREPLACE",
      	[1 + 1] = "EXCHANGE",
      	[2 + 1] = "WHITEOUT",
        };
        $
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-ta2jbh03spkymp4sbdh489g8@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      bdc2a9d6
    • Arnaldo Carvalho de Melo's avatar
      perf trace beauty: Beautify renameat2's fd arg wrt AT_FDCWD · 84a83541
      Arnaldo Carvalho de Melo authored
      Just like is done with the 'renameat' syscall.
      
        # strace -e renameat2 -f perf trace -e rename* mv c /tmp
        [pid 12334] renameat2(AT_FDCWD, "c", AT_FDCWD, "/tmp", RENAME_NOREPLACE) = -1 EXDEV (Invalid cross-device link)
        [pid 12334] renameat2(AT_FDCWD, "c", AT_FDCWD, "/tmp/c", RENAME_NOREPLACE) = -1 EEXIST (File exists)
           1.947 ( 0.007 ms): mv/12334 renameat2(olddfd: CWD, oldname: 0x7ffce8b7fd81, newdfd: CWD, newname: 0x7ffce8b7fd83, flags: 1) = -1 EXDEV Invalid cross-device link
           2.073 ( 0.009 ms): mv/12334 renameat2(olddfd: CWD, oldname: 0x7ffce8b7fd81, newdfd: CWD, newname: 0x55ce7f0a1cc0, flags: 1mv: ) = -1 EEXIST File exists'c' and '/tmp/c' are the same file
        #
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-8q9l92eh9eee3y2bwyqku3tc@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      84a83541
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Allow selecting use the use of the ordered_events code · a761a8d1
      Arnaldo Carvalho de Melo authored
      I was trigger happy on this one, as using ordered_events as implemented
      by Jiri for use with the --block code under discussion on lkml incurs
      in delaying processing to form batches that then get ordered and then
      printed.
      
      With 'perf trace' we want to process the events as they go, without that
      delay, and doing it that way works well for the common case which is to
      trace a thread or a workload started by 'perf trace'.
      
      So revert back to not using ordered_events but add an option to select
      that mode so that users can experiment with their particular use case to
      see if works better, i.e. if the added delay is not a problem and the
      ordering helps.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-8ki7sld6rusnjhhtaly26i5o@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a761a8d1
    • Arnaldo Carvalho de Melo's avatar
      perf trace: Rename delivery functions to ease making ordered_events selectable · 7ba61524
      Arnaldo Carvalho de Melo authored
      Just hide a bit more how events gets delivered, hiding ordered_events
      details from the main loop.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-lxwwf3238ta4neq2zh1y1h45@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7ba61524
    • Steven Rostedt (VMware)'s avatar
      tools lib traceevent: Fix processing of dereferenced args in bprintk events · f024cf08
      Steven Rostedt (VMware) authored
      In the case that a bprintk event has a dereferenced pointer that is
      stored as a string, and there's more values to process (more args), the
      arg was not updated to point to the next arg after processing the
      dereferenced pointer, and it screwed up what was to be displayed.
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: linux-trace-devel@vger.kernel.org
      Cc: stable@vger.kernel.org
      Fixes: 37db96bb ("tools lib traceevent: Handle new pointer processing of bprint strings")
      Link: http://lkml.kernel.org/r/20181210134522.3f71e2ca@gandalf.local.homeSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      f024cf08
    • Michael Petlan's avatar
      perf stat: Avoid segfaults caused by negated options · 51433ead
      Michael Petlan authored
      Some 'perf stat' options do not make sense to be negated (event,
      cgroup), some do not have negated path implemented (metrics). Due to
      that, it is better to disable the "no-" prefix for them, since
      otherwise, the later opt-parsing segfaults.
      
      Before:
      
        $ perf stat --no-metrics -- ls
        Segmentation fault (core dumped)
      
      After:
      
        $ perf stat --no-metrics -- ls
         Error: option `no-metrics' isn't available
         Usage: perf stat [<options>] [<command>]
      Signed-off-by: default avatarMichael Petlan <mpetlan@redhat.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      LPU-Reference: 1485912065.62416880.1544457604340.JavaMail.zimbra@redhat.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      51433ead
    • Michael Petlan's avatar
      perf tests: Use shebangs in the shell scripts · 4eaf97e8
      Michael Petlan authored
      Since the first line was used as a test identification, it needs to be
      skipped by shell_test__description() function now.
      
      Further notes from Hendrik:
      
      It might be worth to note that adding the shebang is necessary to spot
      them as scripts.
      
      Using /bin/sh looks fine to.  Just briefly checked whether the scripts
      contains some bash-specifics, which is not the case.
      Signed-off-by: default avatarMichael Petlan <mpetlan@redhat.com>
      Reviewed-by: default avatarHendrik Brueckner <brueckner@linux.ibm.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      LPU-Reference: 2127419430.57657104.1542836358464.JavaMail.zimbra@redhat.com
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4eaf97e8
    • Adrian Hunter's avatar
      perf auxtrace: Alter addr_filter__entire_dso() to work if there are no symbols · 57176601
      Adrian Hunter authored
      addr_filter__entire_dso() uses the first and last symbols from a dso,
      and so does not work when there are no symbols.  Alter it to filter the
      whole file instead.
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
      Fixes: 1b36c03e ("perf record: Add support for using symbols in address filters")
      Link: http://lkml.kernel.org/r/20181127084634.12469-1-adrian.hunter@intel.com
      [ split from a larger patch ]
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      57176601
    • Adrian Hunter's avatar
      perf dso: Export data_file_size() method there are no symbols · b5c2161c
      Adrian Hunter authored
      Will be used outside dso.c in a followup patch, so rename it and make it
      non-static.
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Link: http://lkml.kernel.org/r/20181127084634.12469-1-adrian.hunter@intel.com
      [ split from a larger patch ]
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b5c2161c
    • Ingo Molnar's avatar
      Merge tag 'perf-core-for-mingo-4.21-20181217' of... · ca46afdb
      Ingo Molnar authored
      Merge tag 'perf-core-for-mingo-4.21-20181217' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
      
      Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
      
      - Introduce 'perf record --aio' to use asynchronous IO trace writing, disabled
        by default (Alexey Budankov)
      
      - Add fallback routines to be used in places where we don't have the CPU mode
        (kernel/userspace/hypervisor) and thus must first fallback lookups looking
        at all map trees when trying to resolve symbols (Adrian Hunter)
      
      - Fix error with config term "pt=0", where we should just force "pt=1" and
        warn the user about the former being nonsensical (Adrian Hunter)
      
      - Fix 'perf test' entry where we expect 'sleep' to come in a PERF_RECORD_COMM
        but instead we get 'coreutils' when sleep is provided by some versions of
        the 'coreutils' package (Adrian Hunter)
      
      - Introduce 'perf top --kallsyms file' to match 'perf report --kallsyms', useful
        when dealing with BPF, where symbol resolution happens via kallsyms, not via
        the default vmlinux ELF symtabs (Arnaldo Carvalho de Melo)
      
      - Support 'srccode' output field in 'perf script' (Andi Kleen)
      
      - Introduce basic 'perf annotation' support for the ARC architecture (Eugeniy Paltsev)
      
      - Compute and display average IPC and IPC coverage per symbol in 'perf annotate' and
        'perf report' (Jin Yao)
      
      - Make 'perf top' use ordered_events and process histograms in a separate thread (Jiri Olsa)
      
      - Make 'perf trace' use ordered_events (Jiri Olsa)
      
      - Add support for ETMv3 and PTMv1.1 decoding in cs-etm (Mathieu Poirier)
      
      - Support for ARM A32/T32 instruction sets in CoreSight trace (cs-etm) (Robert Walker)
      
      - Fix 'perf stat' shadow stats for clock events. (Ravi Bangoria)
      
      - Remove needless rb_tree extra indirection from map__find() (Eric Saint-Etienne)
      
      - Fix CSV mode column output for non-cgroup events in 'perf stat' (Stephane Eranian)
      
      - Add sanity check to libtraceevent's is_timestamp_in_us() (Tzvetomir Stoyanov)
      
      - Use ERR_CAST instead of ERR_PTR(PTR_ERR()) (Wen Yang)
      
      - Fix Load_Miss_Real_Latency on SKL/SKX intel vendor event files (Andi Kleen)
      
      - strncpy() fixes triggered by new warnings on gcc 8.2.0 (Arnaldo Carvalho de Melo)
      
      - Handle tracefs syscall tracepoint older 'nr' field in 'perf trace', that got
        renamed to '__syscall_nr' to work in older kernels (Arnaldo Carvalho de Melo)
      
      - Give better hint about devel package for libssl (Arnaldo Carvalho de Melo)
      
      - Fix the 'perf trace' build in architectures lacking explicit mmap.h file (Arnaldo Carvalho de Melo)
      
      - Remove extra rb_tree traversal indirection from map__find() (Eric Saint-Etienne)
      
      - Disable breakpoint tests for 32-bit ARM (Florian Fainelli)
      
      - Fix typos all over the place, mostly in comments, but also in some debug
        messages and JSON files (Ingo Molnar)
      
      - Allow specifying proc-map-timeout in config file (Mark Drayton)
      
      - Fix mmap_flags table generation script (Sihyeon Jang)
      
      - Fix 'size' parameter to snprintf in the 'perf config' code (Sihyeon Jang)
      
      - More libtraceevent renames to make it a proper library (Tzvetomir Stoyanov)
      
      - Implement new API tep_get_ref() in libtraceevent (Tzvetomir Stoyanov)
      
      - Added support for pkg-config in libtraceevent (Tzvetomir Stoyanov)
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      ca46afdb
  2. 17 Dec, 2018 6 commits