• Al Grant's avatar
    perf inject: Fix file corruption due to event deletion · 1c756cd4
    Al Grant authored
    "perf inject" can create corrupt files when synthesizing sample events from AUX
    data. This happens when in the input file, the first event (for the AUX data)
    has a different sample_type from the second event (generally dummy).
    
    Specifically, they differ in the bits that indicate the standard fields
    appended to perf records in the mmap buffer. "perf inject" deletes the first
    event and moves up the second event to first position.
    
    The problem is with the synthetic PERF_RECORD_MMAP (etc.) events created
    by "perf record".
    
    Since these are synthetic versions of events which are normally produced
    by the kernel, they have to have the standard fields appended as
    described by sample_type.
    
    "perf record" fills these in with zeroes, including the IDENTIFIER
    field; perf readers interpret records with zero IDENTIFIER using the
    descriptor for the first event in the file.
    
    Since "perf inject" changes the first event, these synthetic records are
    then processed with the wrong value of sample_type, and the perf reader
    reads bad data, reports on incorrect length records etc.
    
    Mismatching sample_types are seen with "perf record -e cs_etm//", where the AUX
    event has TID|TIME|CPU|IDENTIFIER and the dummy event has TID|TIME|IDENTIFIER.
    
    Perhaps they could be the same, but it isn't normally a problem if they aren't
    - perf has no problems reading the file.
    
    The sample_types have to agree on the position of IDENTIFIER, because
    that's how perf finds the right event descriptor in the first place, but
    they don't normally have to agree on other fields, and perf doesn't
    check that they do.
    
    The problem is specific to the way "perf inject" reorganizes the events
    and the way synthetic MMAP events are recorded with a zero identifier. A
    simple solution is to stop "perf inject" deleting the tracing event.
    
    Committer testing
    
    Removed the now unused 'evsel' variable, update the comment about the
    evsel removal not being performed anymore, and apply the patch manually
    as it failed with this warning:
    
      warning: Patch sent with format=flowed; space at the end of lines might be lost.
    
    Testing it with:
    
      $ perf bench internals inject-build-id
      # Running 'internals/inject-build-id' benchmark:
        Average build-id injection took: 8.543 msec (+- 0.130 msec)
        Average time per event: 0.838 usec (+- 0.013 usec)
        Average memory usage: 12717 KB (+- 9 KB)
        Average build-id-all injection took: 5.710 msec (+- 0.058 msec)
        Average time per event: 0.560 usec (+- 0.006 usec)
        Average memory usage: 12079 KB (+- 7 KB)
      $
    Signed-off-by: default avatarAl Grant <al.grant@arm.com>
    Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    LPU-Reference: b9cf5611-daae-2390-3439-6617f8f0a34b@foss.arm.com
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    1c756cd4
builtin-inject.c 25.1 KB