• Ian Rogers's avatar
    perf inject: Overhaul handling of pipe files · 89d64e72
    Ian Rogers authored
    Previously inject->is_pipe was set if the input or output were a
    pipe. Determining the input was a pipe had to be done prior to
    starting the session and opening the file. This was done by comparing
    the input file name with '-' but it fails if the pipe file is written
    to disk.
    
    Opening a pipe file from disk will correctly set perf_data.is_pipe, but
    this is too late for 'perf inject' and results in a broken file. A
    workaround is 'cat pipe_perf|perf inject -i - ...'.
    
    This change removes inject->is_pipe and changes the dependent
    conditions to use the is_pipe flag on the input
    (inject->session->data) and output files (inject->output). This
    ensures the is_pipe condition reflects things like the header being
    read.
    
    The change removes the use of perf file header repiping, that is
    writing the file header out while reading it in. The case of input
    pipe and output file cannot repipe as the attributes for the file are
    unknown. To resolve this, write the file header when writing to disk
    and as the attributes may be unknown, write them after the data.
    
    Update sessions repipe variable to be trace_event_repipe as those are
    the only events now impacted by it. Update __perf_session__new as the
    repipe_fd no longer needs passing. Fully removing repipe from session
    header reading will be done in a later change.
    
    Committer testing:
    
      root@number:~# perf record -e syscalls:sys_enter_*sleep/max-stack=4/ -o - sleep 0.01 | perf report -i -
      # To display the perf.data header info, please use --header/--header-only options.
      #
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.050 MB - ]
      #
      # Total Lost Samples: 0
      #
      # Samples: 1  of event 'syscalls:sys_enter_clock_nanosleep'
      # Event count (approx.): 1
      #
      # Overhead  Command  Shared Object  Symbol
      # ........  .......  .............  ...............................
      #
         100.00%  sleep    libc.so.6      [.] clock_nanosleep@GLIBC_2.2.5
                  |
                  ---__libc_start_main@@GLIBC_2.34
                     __libc_start_call_main
                     0x562fc2560a9f
                     clock_nanosleep@GLIBC_2.2.5
    
      #
      # (Tip: Create an archive with symtabs to analyse on other machine: perf archive)
      #
      root@number:~# perf record -e syscalls:sys_enter_*sleep/max-stack=4/ -o - sleep 0.01 > pipe.data
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.050 MB - ]
      root@number:~# perf report --stdio -i pipe.data
      # To display the perf.data header info, please use --header/--header-only options.
      #
      #
      # Total Lost Samples: 0
      #
      # Samples: 1  of event 'syscalls:sys_enter_clock_nanosleep'
      # Event count (approx.): 1
      #
      # Overhead  Command  Shared Object  Symbol
      # ........  .......  .............  ...............................
      #
         100.00%  sleep    libc.so.6      [.] clock_nanosleep@GLIBC_2.2.5
                  |
                  ---__libc_start_main@@GLIBC_2.34
                     __libc_start_call_main
                     0x55f775975a9f
                     clock_nanosleep@GLIBC_2.2.5
    
      #
      # (Tip: To set sampling period of individual events use perf record -e cpu/cpu-cycles,period=100001/,cpu/branches,period=10001/ ...)
      #
      root@number:~#
    Signed-off-by: default avatarIan Rogers <irogers@google.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: James Clark <james.clark@linaro.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Nick Terrell <terrelln@fb.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Yanteng Si <siyanteng@loongson.cn>
    Cc: Yicong Yang <yangyicong@hisilicon.com>
    Link: https://lore.kernel.org/r/20240829150154.37929-7-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    89d64e72
header.h 5.36 KB