linux/tools/lib/traceevent
Tom Zanussi 2160d6c8a1 tools lib traceevent: Add proper KBUFFER_TYPE_TIME_STAMP handling
Kernel commit dc4e2801d4 (ring-buffer: Redefine the unimplemented
RINGBUF_TYPE_TIME_STAMP) changed the way the ring buffer timestamps work
- after that commit the previously unimplemented RINGBUF_TYPE_TIME_STAMP
type causes the time delta to be used as a timestamp rather than a delta
to be added to the timestamp.

The trace-cmd code didn't get updated to handle this, so misinterprets
the event data for this case, which causes a cascade of errors,
including trace-report not being able to identify synthetic (or any
other) events generated by the histogram code (which uses TIME_STAMP
mode).  For example, the following triggers along with the trace-cmd
shown cause an UNKNOWN_EVENT error and trace-cmd report crash:

  # echo 'wakeup_latency  u64 lat pid_t pid char comm[16]' > /sys/kernel/debug/tracing/synthetic_events

  # echo 'hist:keys=pid:ts0=common_timestamp.usecs if comm=="ping"' > /sys/kernel/debug/tracing/events/sched/sched_wakeup/trigger
  # echo 'hist:keys=next_pid:wakeup_lat=common_timestamp.usecs-$ts0:onmatch(sched.sched_wakeup).trace(wakeup_latency,$wakeup_lat,next_pid,next_comm) if next_comm=="ping"' > /sys/kernel/debug/tracing/events/sched/sched_switch/trigger
  # echo 'hist:keys=comm,pid,lat:wakeup_lat=lat:sort=lat' > /sys/kernel/debug/tracing/events/synthetic/wakeup_latency/trigger

  # trace-cmd record -e wakeup_latency -e sched_wakeup -f comm==\"ping\" ping localhost -c 5

  # trace-cmd report
  CPU 0 is empty
  CPU 1 is empty
  CPU 2 is empty
  CPU 3 is empty
  CPU 5 is empty
  CPU 6 is empty
  CPU 7 is empty
  cpus=8
    ug! no event found for type 0
  [UNKNOWN TYPE 0]
    ug! no event found for type 11520
  Segmentation fault (core dumped)

After this patch we get the correct interpretation and the events are
shown properly:

  # trace-cmd report
  CPU 0 is empty
  CPU 1 is empty
  CPU 2 is empty
  CPU 3 is empty
  CPU 5 is empty
  CPU 6 is empty
  CPU 7 is empty
  cpus=8
          <idle>-0     [004] 23284.341392: sched_wakeup:         ping:12031 [120] success=1 CPU:004
          <idle>-0     [004] 23284.341464: wakeup_latency:       lat=58, pid=12031, comm=ping
          <idle>-0     [004] 23285.365303: sched_wakeup:         ping:12031 [120] success=1 CPU:004
          <idle>-0     [004] 23285.365382: wakeup_latency:       lat=64, pid=12031, comm=ping
          <idle>-0     [004] 23286.389290: sched_wakeup:         ping:12031 [120] success=1 CPU:004
          <idle>-0     [004] 23286.389378: wakeup_latency:       lat=72, pid=12031, comm=ping
          <idle>-0     [004] 23287.413213: sched_wakeup:         ping:12031 [120] success=1 CPU:004
          <idle>-0     [004] 23287.413291: wakeup_latency:       lat=64, pid=12031, comm=ping

Link: http://lkml.kernel.org/r/1567628224.13841.4.camel@kernel.org
Link: http://lore.kernel.org/linux-trace-devel/20200625100516.365338-3-tz.stoyanov@gmail.com

Signed-off-by: Tom Zanussi <zanussi@kernel.org>
[ Ported from trace-cmd.git ]
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lore.kernel.org/lkml/20200702185703.785094515@goodmis.org
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2020-07-03 08:45:38 -03:00
..
Documentation libtraceevent: Man pages for tep plugins APIs 2019-09-25 09:51:43 -03:00
plugins libtraceevent: Allow custom libdir path 2019-12-16 13:40:26 -03:00
.gitignore .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
Build libtraceevent: Move traceevent plugins in its own subdirectory 2019-09-25 09:51:43 -03:00
event-parse-api.c libtraceevent, perf tools: Changes in tep_print_event_* APIs 2019-08-31 22:19:28 -03:00
event-parse-local.h libtraceevent: Remove tep_register_trace_clock() 2019-08-31 22:19:28 -03:00
event-parse.c tools lib traceevent: Add handler for __builtin_expect() 2020-06-18 10:22:54 -03:00
event-parse.h libtraceevent: Add tep_get_event() in event-parse.h 2019-09-25 09:51:43 -03:00
event-plugin.c libtraceevent: Change users plugin directory 2019-08-31 22:19:28 -03:00
event-utils.h tools lib traceevent: Change to SPDX License format 2018-08-20 08:54:58 -03:00
kbuffer-parse.c tools lib traceevent: Add proper KBUFFER_TYPE_TIME_STAMP handling 2020-07-03 08:45:38 -03:00
kbuffer.h tools lib traceevent: Add API to read time information from kbuffer 2020-07-03 08:30:10 -03:00
libtraceevent.pc.template tools lib traceevent: Remove hard coded install paths from pkg-config file 2019-05-15 16:36:46 -03:00
Makefile libtraceevent: Allow custom libdir path 2019-12-16 13:40:26 -03:00
parse-filter.c tools lib traceevent: Take care of return value of asprintf 2020-04-18 09:05:00 -03:00
parse-utils.c tools lib traceevent: Change tag string for error 2019-05-02 16:00:19 -04:00
tep_strerror.c tools lib traceevent: Separate out tep_strerror() for strerror_r() issues 2018-10-08 14:30:45 -03:00
trace-seq.c tools lib traceevent: Changed return logic of trace_seq_printf() and trace_seq_vprintf() APIs 2019-01-08 13:28:13 -03:00
trace-seq.h tools lib traceevent, perf tools: Split trace-seq related APIs in a separate header file 2018-08-30 15:52:20 -03:00