• Yang Jihong's avatar
    perf record: Move setting tracking events before record__init_thread_masks() · 1285ab30
    Yang Jihong authored
    User space tasks can migrate between CPUs, so when tracing selected CPUs,
    sideband for all CPUs is needed. In this case set the cpu map of the evsel
    to all online CPUs. This may modify the original cpu map of the evlist.
    
    Therefore, need to check whether the preceding scenario exists before
    record__init_thread_masks().
    
    Dummy tracking has been set in record__open(), move it before
    record__init_thread_masks() and add a helper for unified processing.
    
    The sys_perf_event_open invoked is as follows:
    
      # perf --debug verbose=3 record -e cpu-clock -D 100 true
      <SNIP>
      Opening: cpu-clock
      ------------------------------------------------------------
      perf_event_attr:
        type                             1 (PERF_TYPE_SOFTWARE)
        size                             136
        config                           0 (PERF_COUNT_SW_CPU_CLOCK)
        { sample_period, sample_freq }   4000
        sample_type                      IP|TID|TIME|PERIOD|IDENTIFIER
        read_format                      ID|LOST
        disabled                         1
        inherit                          1
        freq                             1
        sample_id_all                    1
        exclude_guest                    1
      ------------------------------------------------------------
      sys_perf_event_open: pid 10318  cpu 0  group_fd -1  flags 0x8 = 5
      sys_perf_event_open: pid 10318  cpu 1  group_fd -1  flags 0x8 = 6
      sys_perf_event_open: pid 10318  cpu 2  group_fd -1  flags 0x8 = 7
      sys_perf_event_open: pid 10318  cpu 3  group_fd -1  flags 0x8 = 9
      sys_perf_event_open: pid 10318  cpu 4  group_fd -1  flags 0x8 = 10
      sys_perf_event_open: pid 10318  cpu 5  group_fd -1  flags 0x8 = 11
      sys_perf_event_open: pid 10318  cpu 6  group_fd -1  flags 0x8 = 12
      sys_perf_event_open: pid 10318  cpu 7  group_fd -1  flags 0x8 = 13
      Opening: dummy:u
      ------------------------------------------------------------
      perf_event_attr:
        type                             1 (PERF_TYPE_SOFTWARE)
        size                             136
        config                           0x9 (PERF_COUNT_SW_DUMMY)
        { sample_period, sample_freq }   1
        sample_type                      IP|TID|TIME|IDENTIFIER
        read_format                      ID|LOST
        disabled                         1
        inherit                          1
        exclude_kernel                   1
        exclude_hv                       1
        mmap                             1
        comm                             1
        enable_on_exec                   1
        task                             1
        sample_id_all                    1
        exclude_guest                    1
        mmap2                            1
        comm_exec                        1
        ksymbol                          1
        bpf_event                        1
      ------------------------------------------------------------
      sys_perf_event_open: pid 10318  cpu 0  group_fd -1  flags 0x8 = 14
      sys_perf_event_open: pid 10318  cpu 1  group_fd -1  flags 0x8 = 15
      sys_perf_event_open: pid 10318  cpu 2  group_fd -1  flags 0x8 = 16
      sys_perf_event_open: pid 10318  cpu 3  group_fd -1  flags 0x8 = 17
      sys_perf_event_open: pid 10318  cpu 4  group_fd -1  flags 0x8 = 18
      sys_perf_event_open: pid 10318  cpu 5  group_fd -1  flags 0x8 = 19
      sys_perf_event_open: pid 10318  cpu 6  group_fd -1  flags 0x8 = 20
      sys_perf_event_open: pid 10318  cpu 7  group_fd -1  flags 0x8 = 21
      <SNIP>
    
    'perf test' needs to update base-record & system-wide-dummy attr expected values
    for test-record-C0:
    
    1. Because a dummy sideband event is added to the sampling of specified
       CPUs. When evlist contains evsel of different sample_type,
       evlist__config() will change the default PERF_SAMPLE_ID bit to
       PERF_SAMPLE_IDENTIFICATION bit.
       The attr sample_type expected value of base-record and system-wide-dummy
       in test-record-C0 needs to be updated.
    
    2. The perf record uses evlist__add_aux_dummy() instead of
       evlist__add_dummy() to add a dummy event.
       The expected value of system-wide-dummy attr needs to be updated.
    
    The 'perf test' result is as follows:
    
      # ./perf test list  2>&1 | grep 'Setup struct perf_event_attr'
       17: Setup struct perf_event_attr
      # ./perf test 17
       17: Setup struct perf_event_attr                                    : Ok
    Signed-off-by: default avatarYang Jihong <yangjihong1@huawei.com>
    Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Tested-by: default avatarRavi Bangoria <ravi.bangoria@amd.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: James Clark <james.clark@arm.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Richter <tmricht@linux.ibm.com>
    Link: https://lore.kernel.org/r/20230904023340.12707-4-yangjihong1@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    1285ab30
builtin-record.c 111 KB