When running trace-cmd record, I encounter multiple "No such device"
errors due to the splice syscall failing with ENODEV for
/sys/kernel/tracing/per_cpu/cpuX/trace_pipe_raw files corresponding to
CPUs that are possible but not present.

Environment:
- Operating System: Red Hat Enterprise Linux 9.5 (Plow)
- Kernel: Linux 6.12.0-55.9.1.el10_0.ppc64le
- Architecture: ppc64le
- Command Executed: trace-cmd record -o /dev/null -v -e sched_switch -- sleep 1
- System CPU Configuration:
  - /sys/devices/system/cpu/possible: 0-223
  - /sys/devices/system/cpu/present: 0-63
  - /sys/kernel/tracing/per_cpu/: Contains directories cpu0 to cpu223

Steps to Reproduce: 
1. On a system with a mismatch between possible and present CPUs (e.g.,
   possible: 0-223, present: 0-63). 
2. Ensure /sys/kernel/tracing/per_cpu/ contains directories for all possible 
   CPUs (e.g., cpu0 to cpu223). 
3. Run the command:
strace --decode-fds -kk -o strace/trace-cmd -ff -- trace-cmd record -o 
/dev/null -v -e sched_switch -- sleep 1
4. Observe the output and strace logs.

Expected Behavior: trace-cmd should only attempt to access
trace_pipe_raw files for CPUs that are present (e.g., cpu0 to cpu63),
completing the recording without errors.

Actual Behavior:
trace-cmd fails with multiple errors:
trace-cmd: No such device
recorder error in splice input

The strace output shows splice syscalls failing with ENODEV for
trace_pipe_raw files of non-present CPUs 
(e.g., /sys/kernel/tracing/per_cpu/cpu223/trace_pipe_raw). 

Example:
trace-cmd.47140:splice(5</sys/kernel/tracing/per_cpu/cpu223/trace_pipe_raw>, 
NULL, 7<pipe:[96498]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)


Analysis:
- trace-cmd iterates over all directories in
  /sys/kernel/tracing/per_cpu/ (which includes cpu0 to cpu223 for all 
  possible CPUs).
- It attempts to invoke splice on trace_pipe_raw for each CPU, including
  those not present (e.g., cpu64 to cpu223).
- The splice syscall fails with ENODEV for non-present CPUs.
- Stack trace (from strace -kk):
splice(5</sys/kernel/tracing/per_cpu/cpu223/trace_pipe_raw>, ...)
  > /usr/lib64/glibc-hwcaps/power10/libc.so.6(splice+0x74)
  > /usr/bin/trace-cmd(splice_data+0x3b)
  > /usr/bin/trace-cmd(tracecmd_start_recording+0x93)
  > /usr/bin/trace-cmd(create_recorder+0x14f)
  > /usr/bin/trace-cmd(start_threads+0x81b)
  > /usr/bin/trace-cmd(record_trace.isra.0+0xf5f)
  > /usr/bin/trace-cmd(trace_record+0x47)
  > /usr/bin/trace-cmd(main+0xff)

# strace --decode-fds -kk -o strace/trace-cmd -ff -- trace-cmd record -o 
/dev/null -v -e sched_switch -- sleep 1
trace-cmd: No such device
    trace-cmd: No such device
recorder error in splice input  recorder error in splice input
recorder error in splice inputtrace-cmd: No such device
recorder error in splice input

trace-cmd: No such device
<snipped>
recorder error in splice input
trace-cmd: No such device
recorder error in splice input
recorder error in splice inputtrace-cmd: No such device

  recorder error in splice inputtrace-cmd: No such device

  recorder error in splice input
trace-cmd: No such device
  trace-cmd: No such device
recorder error in splice input
  recorder error in splice inputtrace-cmd: No such device

  recorder error in splice input
trace-cmd: No such device
  recorder error in splice inputtrace-cmd: No such device

recorder error in splice inputtrace-cmd: No such device
<snipped>
recorder error in splice input
recorder error in splice inputtrace-cmd: No such device

  recorder error in splice inputtrace-cmd: No such device

  recorder error in splice inputtrace-cmd: No such device

  recorder error in splice input
CPU0 data recorded at offset=0x10000
    0 bytes in size
CPU1 data recorded at offset=0x10000
    0 bytes in size
<snipped>
CPU10 data recorded at offset=0x10000
    0 bytes in size
CPU11 data recorded at offset=0x10000
<snipped>
    0 bytes in size
CPU63 data recorded at offset=0x10000
    0 bytes in size
CPU64 data recorded at offset=0x10000
    0 bytes in size
<snipped?
CPU213 data recorded at offset=0x10000
    0 bytes in size
<snipped>
CPU222 data recorded at offset=0x10000
    0 bytes in size
CPU223 data recorded at offset=0x10000
    0 bytes in size

# grep -i "such device" * | grep splice
trace-cmd.46981:splice(5</sys/kernel/tracing/per_cpu/cpu64/trace_pipe_raw>, 
NULL, 7<pipe:[86367]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
trace-cmd.46982:splice(5</sys/kernel/tracing/per_cpu/cpu65/trace_pipe_raw>, 
NULL, 7<pipe:[82351]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
trace-cmd.46983:splice(5</sys/kernel/tracing/per_cpu/cpu66/trace_pipe_raw>, 
NULL, 7<pipe:[81717]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
trace-cmd.46984:splice(5</sys/kernel/tracing/per_cpu/cpu67/trace_pipe_raw>, 
NULL, 7<pipe:[1932]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
trace-cmd.46985:splice(5</sys/kernel/tracing/per_cpu/cpu68/trace_pipe_raw>, 
NULL, 7<pipe:[92520]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
trace-cmd.46986:splice(5</sys/kernel/tracing/per_cpu/cpu69/trace_pipe_raw>, 
NULL, 7<pipe:[93494]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
<snipped>
trace-cmd.47136:splice(5</sys/kernel/tracing/per_cpu/cpu219/trace_pipe_raw>, 
NULL, 7<pipe:[19742]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
trace-cmd.47137:splice(5</sys/kernel/tracing/per_cpu/cpu220/trace_pipe_raw>, 
NULL, 7<pipe:[29868]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
trace-cmd.47138:splice(5</sys/kernel/tracing/per_cpu/cpu221/trace_pipe_raw>, 
NULL, 7<pipe:[42069]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
trace-cmd.47139:splice(5</sys/kernel/tracing/per_cpu/cpu222/trace_pipe_raw>, 
NULL, 7<pipe:[81737]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)
trace-cmd.47140:splice(5</sys/kernel/tracing/per_cpu/cpu223/trace_pipe_raw>, 
NULL, 7<pipe:[96498]>, NULL, 65536, SPLICE_F_MOVE) = -1 ENODEV (No such device)


Reply via email to