• Namhyung Kim's avatar
    perf tools: Add dynamic sort key for tracepoint events · c7c2a5e4
    Namhyung Kim authored
    The existing sort keys are less useful for tracepoint events in that
    they are always sampled at the same place, the function where the
    tracepoint is located.
    
    For example, a 'perf report' on sched:sched_switch event looks like the
    following:
    
      # Overhead  Command          Shared Object     Symbol
      # ........  ...............  ................  ..............
      #
          47.22%  swapper          [kernel.vmlinux]  [k] __schedule
          21.67%  transmission-gt  [kernel.vmlinux]  [k] __schedule
           8.23%  netctl-auto      [kernel.vmlinux]  [k] __schedule
           5.53%  kworker/0:1H     [kernel.vmlinux]  [k] __schedule
           1.98%  Xephyr           [kernel.vmlinux]  [k] __schedule
           1.33%  irq/33-iwlwifi   [kernel.vmlinux]  [k] __schedule
           1.17%  wpa_cli          [kernel.vmlinux]  [k] __schedule
           1.13%  rcu_preempt      [kernel.vmlinux]  [k] __schedule
           0.85%  ksoftirqd/0      [kernel.vmlinux]  [k] __schedule
           0.77%  Timer            [kernel.vmlinux]  [k] __schedule
    
    In fact, tracepoints have meaningful information in their fields but
    there's no way to use in 'perf report' currently.  The dynamic sort keys
    are introduced in this patc to overcome this limitation.
    
    The sched:sched_switch events have following fields:
    
      # sudo cat /sys/kernel/debug/tracing/events/sched/sched_switch/format
      name: sched_switch
      ID: 268
      format:
    	field:unsigned short common_type;         offset:0; size:2; signed:0;
    	field:unsigned char common_flags;         offset:2; size:1; signed:0;
    	field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
    	field:int common_pid;                     offset:4; size:4; signed:1;
    
    	field:char prev_comm[16]; offset:8;  size:16; signed:1;
    	field:pid_t prev_pid;     offset:24; size:4;  signed:1;
    	field:int prev_prio;      offset:28; size:4;  signed:1;
    	field:long prev_state;    offset:32; size:8;  signed:1;
    	field:char next_comm[16]; offset:40; size:16; signed:1;
    	field:pid_t next_pid;     offset:56; size:4;  signed:1;
    	field:int next_prio;      offset:60; size:4;  signed:1;
    
      print fmt: "prev_comm=%s prev_pid=%d prev_prio=%d prev_state=%s%s ==>
                  next_comm=%s next_pid=%d next_prio=%d",
        REC->prev_comm, REC->prev_pid, REC->prev_prio,
        REC->prev_state & (2048-1) ? __print_flags(REC->prev_state & (2048-1),
        "|", { 1, "S"} , { 2, "D" }, { 4, "T" }, { 8, "t" }, { 16, "Z" }, { 32, "X" },
        { 64, "x" }, { 128, "K"}, { 256, "W" }, { 512, "P" }, { 1024, "N" }) : "R",
        REC->prev_state & 2048 ? "+" : "", REC->next_comm, REC->next_pid, REC->next_prio
    
    With dynamic sort keys, you can use <event.field> as a sort key.  Those
    dynamic keys are checked and created on demand.  For instance, below is
    to sort by next_pid field output on the same data file:
    
      $ perf report -s comm,sched:sched_switch.next_pid --stdio
      ...
      # Overhead  Command            next_pid
      # ........  ...............  ..........
      #
          21.23%  transmission-gt           0
          20.86%  swapper               17773
           6.62%  netctl-auto               0
           5.25%  swapper                 109
           5.21%  kworker/0:1H              0
           1.98%  Xephyr                    0
           1.98%  swapper                6524
           1.98%  swapper               27478
           1.37%  swapper               27476
           1.17%  swapper                 233
    
    Multiple dynamic sort keys are also supported:
    
      $ perf report -s comm,sched:sched_switch.next_pid,sched:sched_switch.next_comm --stdio
      ...
      # Overhead  Command            next_pid         next_comm
      # ........  ...............  ..........  ................
      #
          20.86%  swapper               17773   transmission-gt
           9.64%  transmission-gt           0         swapper/0
           9.16%  transmission-gt           0         swapper/2
           5.25%  swapper                 109      kworker/0:1H
           5.21%  kworker/0:1H              0         swapper/0
           2.14%  netctl-auto               0         swapper/2
           1.98%  netctl-auto               0         swapper/0
           1.98%  swapper                6524            Xephyr
           1.98%  swapper               27478       netctl-auto
           1.78%  transmission-gt           0         swapper/3
           1.53%  Xephyr                    0         swapper/0
           1.29%  netctl-auto               0         swapper/1
           1.29%  swapper               27476       netctl-auto
           1.21%  netctl-auto               0         swapper/3
           1.17%  swapper                 233    irq/33-iwlwifi
    
    Note that pid 0 exists for each cpu so have comm of 'swapper/N'.
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Andi Kleen <andi@firstfloor.org>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: http://lkml.kernel.org/r/1450804030-29193-6-git-send-email-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    c7c2a5e4
sort.c 51.3 KB