]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf record: skip synthesize event when open evsel failed
authorShuai Xue <xueshuai@linux.alibaba.com>
Thu, 23 Oct 2025 01:50:43 +0000 (09:50 +0800)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 31 Oct 2025 19:01:02 +0000 (12:01 -0700)
When using perf record with the `--overwrite` option, a segmentation fault
occurs if an event fails to open. For example:

  perf record -e cycles-ct -F 1000 -a --overwrite
  Error:
  cycles-ct:H: PMU Hardware doesn't support sampling/overflow-interrupts. Try 'perf stat'
  perf: Segmentation fault
      #0 0x6466b6 in dump_stack debug.c:366
      #1 0x646729 in sighandler_dump_stack debug.c:378
      #2 0x453fd1 in sigsegv_handler builtin-record.c:722
      #3 0x7f8454e65090 in __restore_rt libc-2.32.so[54090]
      #4 0x6c5671 in __perf_event__synthesize_id_index synthetic-events.c:1862
      #5 0x6c5ac0 in perf_event__synthesize_id_index synthetic-events.c:1943
      #6 0x458090 in record__synthesize builtin-record.c:2075
      #7 0x45a85a in __cmd_record builtin-record.c:2888
      #8 0x45deb6 in cmd_record builtin-record.c:4374
      #9 0x4e5e33 in run_builtin perf.c:349
      #10 0x4e60bf in handle_internal_command perf.c:401
      #11 0x4e6215 in run_argv perf.c:448
      #12 0x4e653a in main perf.c:555
      #13 0x7f8454e4fa72 in __libc_start_main libc-2.32.so[3ea72]
      #14 0x43a3ee in _start ??:0

The --overwrite option implies --tail-synthesize, which collects non-sample
events reflecting the system status when recording finishes. However, when
evsel opening fails (e.g., unsupported event 'cycles-ct'), session->evlist
is not initialized and remains NULL. The code unconditionally calls
record__synthesize() in the error path, which iterates through the NULL
evlist pointer and causes a segfault.

To fix it, move the record__synthesize() call inside the error check block, so
it's only called when there was no error during recording, ensuring that evlist
is properly initialized.

Fixes: 4ea648aec019 ("perf record: Add --tail-synthesize option")
Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/builtin-record.c

index cb52aea9607d4612545590e0af918dacf727c616..ffb94a8339b03ec2edf31aa9b61bcec193dd4e07 100644 (file)
@@ -2958,11 +2958,11 @@ out_free_threads:
                rec->bytes_written += off_cpu_write(rec->session);
 
        record__read_lost_samples(rec);
-       record__synthesize(rec, true);
        /* this will be recalculated during process_buildids() */
        rec->samples = 0;
 
        if (!err) {
+               record__synthesize(rec, true);
                if (!rec->timestamp_filename) {
                        record__finish_output(rec);
                } else {