• Wang Nan's avatar
    perf tools: Enable pre-event inherit setting by config terms · 374ce938
    Wang Nan authored
    This patch allows perf record setting event's attr.inherit bit by
    config terms like:
    
      # perf record -e cycles/no-inherit/ ...
      # perf record -e cycles/inherit/ ...
    
    So user can control inherit bit for each event separately.
    
    In following example, a.out fork()s in main then do some complex
    CPU intensive computations in both of its children.
    
    Basic result with and without inherit:
    
      # perf record -e cycles -e instructions ./a.out
      [ perf record: Woken up 9 times to write data ]
      [ perf record: Captured and wrote 2.205 MB perf.data (47920 samples) ]
      # perf report --stdio
      # ...
      # Samples: 23K of event 'cycles'
      # Event count (approx.): 23641752891
      ...
      # Samples: 24K of event 'instructions'
      # Event count (approx.): 30428312415
    
      # perf record -i -e cycles -e instructions ./a.out
      [ perf record: Woken up 5 times to write data ]
      [ perf record: Captured and wrote 1.111 MB perf.data (24019 samples) ]
      ...
      # Samples: 12K of event 'cycles'
      # Event count (approx.): 11699501775
      ...
      # Samples: 12K of event 'instructions'
      # Event count (approx.): 15058023559
    
    Cancel inherit for one event when globally enable:
    
      # perf record -e cycles/no-inherit/ -e instructions ./a.out
      [ perf record: Woken up 7 times to write data ]
      [ perf record: Captured and wrote 1.660 MB perf.data (36004 samples) ]
      ...
      # Samples: 12K of event 'cycles/no-inherit/'
      # Event count (approx.): 11895759282
     ...
      # Samples: 24K of event 'instructions'
      # Event count (approx.): 30668000441
    
    Enable inherit for one event when globally disable:
    
      # perf record -i -e cycles/inherit/ -e instructions ./a.out
      [ perf record: Woken up 7 times to write data ]
      [ perf record: Captured and wrote 1.654 MB perf.data (35868 samples) ]
      ...
      # Samples: 23K of event 'cycles/inherit/'
      # Event count (approx.): 23285400229
      ...
      # Samples: 11K of event 'instructions'
      # Event count (approx.): 14969050259
    
    Committer note:
    
    One can check if the bit was set, in addition to seeing the result in
    the perf.data file size as above by doing one of:
    
      # perf record -e cycles -e instructions -a usleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.911 MB perf.data (63 samples) ]
      # perf evlist -v
      cycles: size: 112, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
      instructions: size: 112, config: 0x1, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, inherit: 1, freq: 1, sample_id_all: 1, exclude_guest: 1
      #
    
    So, the inherit bit was set in both, now, if we disable it globally using
    --no-inherit:
    
      # perf record --no-inherit -e cycles -e instructions -a usleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.910 MB perf.data (56 samples) ]
      # perf evlist -v
      cycles: size: 112, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, mmap: 1, comm: 1, freq: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
      instructions: size: 112, config: 0x1, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, freq: 1, sample_id_all: 1, exclude_guest: 1
    
    No inherit bit set, then disabling it and setting just on the cycles event:
    
      # perf record --no-inherit -e cycles/inherit/ -e instructions -a usleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.909 MB perf.data (48 samples) ]
      # perf evlist -v
      cycles/inherit/: size: 112, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
      instructions: size: 112, config: 0x1, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, freq: 1, sample_id_all: 1, exclude_guest: 1
      #
    
    We can see it as well in by using a more verbose level of debug messages in
    the tool that sets up the perf_event_attr, 'perf record' in this case:
    
      [root@zoo ~]# perf record -vv --no-inherit -e cycles/inherit/ -e instructions -a usleep 1
      ------------------------------------------------------------
      perf_event_attr:
        size                             112
        { sample_period, sample_freq }   4000
        sample_type                      IP|TID|TIME|ID|CPU|PERIOD
        read_format                      ID
        disabled                         1
        inherit                          1
        mmap                             1
        comm                             1
        freq                             1
        task                             1
        sample_id_all                    1
        exclude_guest                    1
        mmap2                            1
        comm_exec                        1
      ------------------------------------------------------------
      sys_perf_event_open: pid -1  cpu 0  group_fd -1  flags 0x8
      sys_perf_event_open: pid -1  cpu 1  group_fd -1  flags 0x8
      sys_perf_event_open: pid -1  cpu 2  group_fd -1  flags 0x8
      sys_perf_event_open: pid -1  cpu 3  group_fd -1  flags 0x8
      ------------------------------------------------------------
      perf_event_attr:
        size                             112
        config                           0x1
        { sample_period, sample_freq }   4000
        sample_type                      IP|TID|TIME|ID|CPU|PERIOD
        read_format                      ID
        disabled                         1
        freq                             1
        sample_id_all                    1
        exclude_guest                    1
      ------------------------------------------------------------
      sys_perf_event_open: pid -1  cpu 0  group_fd -1  flags 0x8
    
    <SNIP>
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexei Starovoitov <ast@plumgrid.com>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1446029705-199659-2-git-send-email-wangnan0@huawei.com
    [ s/u64/bool/ for the perf_evsel_config_term inherit field - jolsa]
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    374ce938
parse-events.h 5.06 KB