• James Clark's avatar
    coresight: Don't immediately close events that are run on invalid CPU/sink combos · 8c60acbc
    James Clark authored
    When a traced process runs on a CPU that can't reach the selected sink,
    the event will be stopped with PERF_HES_STOPPED. This means that even if
    the process migrates to a valid CPU, tracing will not resume.
    
    This can be reproduced (on N1SDP) by using taskset to start the process
    on CPU 0, and then switching it to CPU 2 (ETF 1 is only reachable from
    CPU 2):
    
      taskset --cpu-list 0 ./perf record -e cs_etm/@tmc_etf1/ --per-thread -- taskset --cpu-list 2 ls
    
    This produces a single 0 length AUX record, and then no more trace:
    
      0x3c8 [0x30]: PERF_RECORD_AUX offset: 0 size: 0 flags: 0x1 [T]
    
    After the fix, the same command produces normal AUX records. The perf
    self test "89: Check Arm CoreSight trace data recording and synthesized
    samples" no longer fails intermittently. This was because the taskset in
    the test is after the fork, so there is a period where the task is
    scheduled on a random CPU rather than forced to a valid one.
    
    Specifically selecting an invalid CPU will still result in a failure to
    open the event because it will never produce trace:
    
      ./perf record -C 2 -e cs_etm/@tmc_etf0/
      failed to mmap with 12 (Cannot allocate memory)
    
    The only scenario that has changed is if the CPU mask has a valid CPU
    sink combo in it.
    
    Testing
    =======
    
    * Coresight self test passes consistently:
      ./perf test Coresight
    
    * CPU wide mode still produces trace:
      ./perf record -e cs_etm// -a
    
    * Invalid -C options still fail to open:
      ./perf record -C 2,3 -e cs_etm/@tmc_etf0/
      failed to mmap with 12 (Cannot allocate memory)
    
    * Migrating a task to a valid sink/CPU now produces trace:
      taskset --cpu-list 0 ./perf record -e cs_etm/@tmc_etf1/ --per-thread -- taskset --cpu-list 2 ls
    
    * If the task remains on an invalid CPU, no trace is emitted:
      taskset --cpu-list 0 ./perf record -e cs_etm/@tmc_etf1/ --per-thread -- ls
    Reviewed-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
    Signed-off-by: default avatarJames Clark <james.clark@arm.com>
    Link: https://lore.kernel.org/r/20210922125144.133872-2-james.clark@arm.comSigned-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
    Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
    8c60acbc
coresight-etm-perf.c 22.2 KB