Re: [PATCH 8/8] perf test: Add file offset diagnostic test for corrupted perf.data
From: Ian Rogers
Date: Wed Jun 03 2026 - 11:30:27 EST
On Tue, Jun 2, 2026 at 4:58 PM Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> wrote:
>
> From: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
>
> Add a shell test that verifies the file_offset diagnostic messages
> work correctly when perf encounters corrupted events.
>
> The test corrupts a MMAP2 event's size field in a recorded perf.data
> file, then checks that perf report produces warning messages that
> include both the file offset (e.g. "at offset 0x2738:") and the
> event type name with numeric id (e.g. "MMAP2 (10)").
>
> This exercises the diagnostic improvements from the file_offset
> series, which retrofitted all skip/stop/error messages to include
> the position and type of the problematic event.
>
> Assisted-by: Claude Opus 4.6 <noreply@xxxxxxxxxxxxx>
> Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
Reviewed-by: Ian Rogers <irogers@xxxxxxxxxx>
Thanks,
Ian
> ---
> .../shell/data_file_offset_diagnostics.sh | 82 +++++++++++++++++++
> 1 file changed, 82 insertions(+)
> create mode 100755 tools/perf/tests/shell/data_file_offset_diagnostics.sh
>
> diff --git a/tools/perf/tests/shell/data_file_offset_diagnostics.sh b/tools/perf/tests/shell/data_file_offset_diagnostics.sh
> new file mode 100755
> index 0000000000000000..031f49480d999d8c
> --- /dev/null
> +++ b/tools/perf/tests/shell/data_file_offset_diagnostics.sh
> @@ -0,0 +1,82 @@
> +#!/bin/bash
> +# Test that perf report includes file offsets and event type names in diagnostic messages.
> +# SPDX-License-Identifier: GPL-2.0
> +#
> +# The file_offset diagnostic series adds "at offset 0x...: TYPE (N)"
> +# to all skip/stop/error messages. This test corrupts an event's size
> +# field in a perf.data file, then verifies the resulting warning
> +# includes the file offset and event type.
> +
> +err=0
> +
> +cleanup() {
> + [ -n "${perfdata}" ] && rm -f "${perfdata}" "${perfdata}.old"
> + rm -f "${corrupted}" "${stderrfile}"
> + trap - EXIT TERM INT
> +}
> +trap 'cleanup; exit 1' TERM INT
> +trap cleanup EXIT
> +
> +perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX) || exit 2
> +corrupted=$(mktemp /tmp/__perf_test.perf.data.XXXXX) || exit 2
> +stderrfile=$(mktemp /tmp/__perf_test.perf.data.XXXXX) || exit 2
> +
> +if ! perf record -o "${perfdata}" -- perf test -w noploop 2>/dev/null; then
> + echo "Skip: perf record failed"
> + cleanup
> + exit 2
> +fi
> +
> +# Find the file offset of the first MMAP2 event via perf report -D.
> +# Format: "timestamp 0xOFFSET [0xSIZE]: PERF_RECORD_MMAP2 ..."
> +mmap2_line=$(perf report -D -i "${perfdata}" 2>/dev/null | grep "PERF_RECORD_MMAP2" | head -1)
> +if [ -z "${mmap2_line}" ]; then
> + echo "Skip: no MMAP2 events found in perf.data"
> + cleanup
> + exit 2
> +fi
> +
> +mmap2_offset=$(echo "${mmap2_line}" | awk '{print $2}')
> +mmap2_offset_dec=$((mmap2_offset))
> +
> +# Copy the file and corrupt the MMAP2 event's size field.
> +# perf_event_header layout: type(u32) misc(u16) size(u16)
> +# Set size to 16 (0x10 0x00 little-endian) — below the MMAP2
> +# minimum, which triggers the "event size too small" warning.
> +cp "${perfdata}" "${corrupted}"
> +printf '\x10\x00' | dd of="${corrupted}" bs=1 seek=$((mmap2_offset_dec + 6)) conv=notrunc 2>/dev/null
> +
> +perf report -i "${corrupted}" --stdio > /dev/null 2> "${stderrfile}"
> +
> +# Check that warnings include "at offset 0x..."
> +if grep -q "at offset 0x" "${stderrfile}"; then
> + echo "File offset in diagnostics [Success]"
> +else
> + echo "File offset in diagnostics [Failed: no 'at offset 0x...' found]"
> + echo " stderr was:"
> + head -5 "${stderrfile}"
> + err=1
> +fi
> +
> +# Check that the event type name and numeric id appear: "MMAP2 (10)"
> +if grep -q "MMAP2 (10)" "${stderrfile}"; then
> + echo "Event type name in diagnostics [Success]"
> +else
> + echo "Event type name in diagnostics [Failed: no 'MMAP2 (10)' found]"
> + echo " stderr was:"
> + head -5 "${stderrfile}"
> + err=1
> +fi
> +
> +# Check that the reported offset matches the actual corruption point
> +if grep -q "at offset ${mmap2_offset}:" "${stderrfile}"; then
> + echo "Correct offset reported [Success]"
> +else
> + echo "Correct offset reported [Failed: expected offset ${mmap2_offset}]"
> + echo " stderr was:"
> + head -5 "${stderrfile}"
> + err=1
> +fi
> +
> +cleanup
> +exit ${err}
> --
> 2.54.0
>