All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tanushree Shah <tshah@linux.ibm.com>
To: Ian Rogers <irogers@google.com>
Cc: acme@kernel.org, jolsa@kernel.org, adrian.hunter@intel.com,
	vmolnaro@redhat.com, mpetlan@redhat.com, tmricht@linux.ibm.com,
	maddy@linux.ibm.com, namhyung@kernel.org,
	linux-perf-users@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	atrajeev@linux.ibm.com, hbathini@linux.ibm.com,
	Tejas.Manhas1@ibm.com, Tanushree.Shah@ibm.com,
	rostedt@goodmis.org
Subject: Re: [RFC PATCH v2 0/5] Add perf.data tracepoint events to trace.dat conversion
Date: Wed, 5 Aug 2026 11:45:36 +0530	[thread overview]
Message-ID: <28c7f42a-30ee-4bb0-a0f3-cc808d36ed1f@linux.ibm.com> (raw)
In-Reply-To: <CAP-5=fXGaMPzt8BUZKQB4QeuxrfiERAF8Kdut+uBPnXWvL82-g@mail.gmail.com>

Hello Ian, Thank you very much for the feedback.

yes, v2 needed a rebase. I had already sent V3 patches on Monday.
Below is the link:
https://lore.kernel.org/all/20260803145958.299956-1-tshah@linux.ibm.com/.

Thanks.
Tanushree Shah


On 05/08/26 07:37, Ian Rogers wrote:
> On Sun, Aug 2, 2026 at 11:08 AM Tanushree Shah <tshah@linux.ibm.com> wrote:
>>
>> This RFC patch series introduces support for converting perf.data files
>> containing tracepoint events into trace.dat format, enabling seamless
>> visualization and analysis using KernelShark.
>>
>> ======================
>> Background and Motivation
>> ======================
>>
>> Currently, perf and trace-cmd operate as separate tracing ecosystems with
>> incompatible data formats. Users who collect tracepoint data with
>> 'perf record' cannot easily visualize it in KernelShark's graphical
>> timeline view or leverage trace-cmd's analysis capabilities.
>>
>> This creates workflow friction when users need to:
>>
>> - Visualize perf tracepoint data in KernelShark's interactive graphical
>>    timeline
>> - Share trace data between perf and trace-cmd workflows and toolchains
>> - Perform architecture-independent conversion and analysis of traces
>>
>> This conversion bridge eliminates these barriers by enabling seamless
>> data exchange between perf and trace-cmd ecosystems, allowing users to
>> choose the best tool for each analysis phase.
>>
>> ======================
>> Implementation Overview
>> ======================
>>
>> The series implements the trace.dat file format specification (version 7)
>> within perf's data conversion framework.
>>
>> **Patch 1/5: Core trace.dat Export Infrastructure**
>> Introduces util/trace-dat.c and util/trace-dat.h implementing:
>> - Per-CPU raw event buffer management (init, collect, free)
>> - Ftrace ring buffer page construction
>> - trace.dat section writers (strings, options, flyrecord sections)
>>
>> **Patch 2/5: Metadata Integration**
>> Extends util/trace-event-read.c to write trace.dat metadata during
>> perf.data
>> parsing:
>> - Initial format header (magic, version, endian, page size, compression)
>> - Section 16: HEADER INFO (header_page + header_event)
>> - Section 17: FTRACE EVENT FORMATS
>> - Section 18: EVENT FORMATS (per system/event format files)
>> - Section 19: KALLSYMS
>> - Section 21: CMDLINES
>> - Section 15: STRINGS (written last after all sections)
>>
>> **Patch 3/5: Conversion Backend**
>> Implements util/data-convert-trace.c with trace_convert__perf2dat()
>> function:
>> - Processes PERF_TYPE_TRACEPOINT samples via process_sample_event()
>> - Collects raw event data per-CPU using trace_dat__collect_cpu_event()
>> - Writes OPTIONS sections (CPUCOUNT, TRACECLOCK, metadata offsets)
>> - Writes FLYRECORD section with per-CPU ring buffer pages
>>
>> **Patch 4/5: User Interface**
>> Extends tools/perf/builtin-data.c with --to-trace-dat option:
>> - Adds command-line option for trace.dat output
>> - Mutually exclusive with --to-ctf and --to-json
>> - Calls trace_convert__perf2dat() to perform conversion
>>
>> **Patch 5/5: Shell Test**
>> Adds a shell test (tools/perf/tests/shell/) covering normal tracepoint
>> recordings, pipe mode and mixed tracepoint/non-tracepoint recording
>> conversions and --force flag behaviour.
>>
>> ======================
>> Current Implementation Details
>> ======================
>>
>> **trace.dat Format Version:**
>> The implementation currently targets trace.dat format version 7, which
>> is the stable version supported by current trace-cmd releases (v3.x).
>> This version is hardcoded to ensure compatibility with existing
>> trace-cmd and KernelShark installations. Future enhancements could add
>> version negotiation or support for newer format versions as they become
>> standardized.
>>
>> **Compression Strategy:**
>> Compression is explicitly disabled (set to NONE) in the generated
>> trace.dat files.
>> This design choice:
>> - Simplifies the initial implementation and testing
>> - Ensures maximum compatibility across trace-cmd versions
>> - Avoids external compression library dependencies
>>
>> Future work could add support for various compression algorithms (zlib,
>> zstd, lz4) with runtime selection via command-line options, significantly
>> reducing file sizes for large traces.
>>
>> ======================
>> Usage Example
>> ======================
>>
>> ```bash
>> *Record tracepoint events with perf*
>> perf record -e sched:sched_switch -e sched:sched_wakeup -a sleep 10
>>
>> *Convert to trace.dat format*
>> perf data convert --to-trace-dat=output.dat
>>
>> *Verify trace.dat structure*
>> trace-cmd dump --summary output.dat
>>
>> *Analyze with trace-cmd*
>> trace-cmd report output.dat
>>
>> *Visualize in KernelShark*
>> kernelshark output.dat
>> ```
>>
>> **Conversion Output:**
>> ```
>> [ perf data convert: Converted 'perf.data' into trace.dat format
>> 'output.dat' ]
>> [ perf data convert: Converted 2684 events ]
>> ```
>> **trace-cmd dump --summary Output:**
>> ```
>>   Tracing meta data in file output.dat:
>>          [Initial format]
>>                  7       [Version]
>>                  0       [Little endian]
>>                  8       [Bytes in a long]
>>                  65536   [Page size, bytes]
>>                  none    [Compression algorithm]
>>                          [Compression version]
>>          [buffer "", "local" clock, 65536 page size, 16 cpus, 1048576 bytes
>>      flyrecord data]
>>          [10 options]
>>          [Saved command lines, 0 bytes]
>>          [Kallsyms, 0 bytes]
>>          [Ftrace format, 0 events]
>>          [Header page, 206 bytes]
>>          [Header event, 205 bytes]
>>          [Events format, 1 systems]
>>          [9 sections]
>> ```
>> ======================
>> Testing and Verification
>> ======================
>>
>> The series has been extensively tested with:
>> - Various tracepoint events (sched, irq, syscalls, block I/O)
>> - Mixed recordings containing both tracepoint and non-tracepoint events
>>    only tracepoints converted)
>> - Verification with trace-cmd report and KernelShark visualization
>> - Memory leak testing with Valgrind (0 bytes leaked).
>> - Cross-architecture testing: v1 tested x86_64 and ppc64le. v2 adds
>>    s390 (big-endian) perf.data converted on both ppc64le
>>    (little-endian) and x86_64 (little-endian) hosts, in addition to
>>    same-arch x86_64 (LE->LE) and ppc64le (BE->BE) conversion.
>> - Pipe mode support has been tested end-to-end. (in v2)
>>
>> All generated trace.dat files successfully open in:
>> - trace-cmd report (v3.1+)
>> - KernelShark (v2.0+)
>>
>>
>> ======================
>> Next Steps
>> ======================
>>
>> We would highly appreciate reviews, comments, and feedback on:
>> - The overall architectural approach and integration points
>> - Compatibility considerations with trace-cmd ecosystem
>> - Performance characteristics for large-scale traces
>> - Additional use cases or workflow scenarios
>> - Future enhancement priorities
>>
>> ---
>> Changes in v2
>>
>> Addressing the Sashiko AI review findings on v1:
>>
>> Cross-arch correctness:
>>    - Introduce to_file_u16/u32/u64 helpers (wrapping tep_read_number())
>>      to write all multi-byte fields in the recorded machine's byte order;
>>      apply throughout metadata sections and flyrecord page/record headers
>>      (ts, commit, TIME_EXTEND, large-event data_len).
>>    - Fix flyrecord record header bit layout for big-endian files.
>>      The record header word bit layout differs by file endianness,
>>      matching kbuffer-parse.c type_len4host()/ts4host():
>>        LE: type_len in bits [4:0],   time_delta in bits [31:5]
>>        BE: type_len in bits [31:27], time_delta in bits [26:0]
>>
>> Pipe mode:
>>    - Add process_attr(), process_feature(), and process_tracing_data()
>>      callbacks required for pipe mode operation.
>>    - Defer CPU buffer initialisation until the first tracepoint sample,
>>      after process_feature()/process_tracing_data() have populated the
>>      session header. This ensures the recorded machine's CPU count is
>>      used rather than the host's - critical for cross-platform analysis.
>>
>> Format compliance:
>>    - Implement TIME_EXTEND records for timestamp deltas >27 bits to
>>      prevent silent truncation and maintain chronological ordering.
>>    - Fix large event encoding (>=29 words): use type_len=0 with a
>>      separate 32-bit length word, avoiding collision with reserved types
>>      (PADDING=29, TIME_EXTEND=30, TIME_STAMP=31).
>>    - Add bounds check rejecting records larger than a page payload before
>>      batching, preventing heap overflow in trace_dat__write_page().
>>    - Fix flyrecord section_size to exclude the 16-byte section header,
>>      matching trace.dat specification and trace-cmd behaviour.
>>
>> CLI behavior:
>>    - Fix --force flag: open with O_CREAT|O_EXCL when force is not set,
>>      failing with -EEXIST instead of silently overwriting existing files.
>>
>> Memory safety:
>>    - Fix realloc overwrite of cpu_events->events and page_records on
>>      failure: use temporary pointers, only commit on success.
>>    - Fix use-after-free/double-free in sequential page_records realloc
>>      failure: replace with malloc+memcpy+free pattern.
>>    - Fix section_size computed from before section header position.
>>    - Add NULL checks for get_tracing_file(), calloc() padding, and
>>      trace_dat_options_offset assignment on write failure.
>>    - Use goto out_free on record allocation failure to avoid leaking
>>      accumulated page_records entries.
>>    - Replace direct read() with do_read() in read_proc_kallsyms() to
>>      handle short reads correctly.
>>    - On fwrite failure, set trace_dat_write_failed and continue parsing
>>      so that perf.data processing completes normally.
>>
>> Testing (new in v2):
>>    - Add shell test covering conversion, trace-cmd dump validation,
>>      sched_switch event verification, and --force flag behaviour.
>>
>> Documentation (new in v2):
>>    - Add documentation for 'perf data convert --to-trace-dat', covering
>>      usage and supported options.
>>
>> v1: https://lore.kernel.org/linux-perf-users/20260608125951.90425-2-tshah@linux.ibm.com/
> 
> Thanks again Tanushree for pursuing this. I see on sashiko.dev that
> sashiko couldn't review the v2 patches because they failed to apply:
> https://sashiko.dev/#/log/baseline/53604/2
> The SHA of perf-tools-next that sashiko.dev was trying was
> d04ef71492fad7230d474efe33d05f4c0563d409, which corresponds to "perf
> machine: Check snprintf truncation for guest kallsyms path," added 4
> days ago:
> https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/commit/?h=perf-tools-next&id=d04ef71492fad7230d474efe33d05f4c0563d409
> Could you rebase the patches so that we can benefit from the Sashiko review?
> 
> Thanks,
> Ian
> 
>> Tanushree Shah (5):
>>    perf/trace-dat: Add trace.dat export infrastructure
>>    perf/trace-event: Write trace.dat metadata sections during parsing
>>    perf data-convert: Add perf.data to trace.dat conversion backend
>>    perf data: Add --to-trace-dat option for converting perf.data
>>      tracepoint events into trace.dat format
>>    perf test: Add test validating trace.dat generated by 'perf data
>>      convert --to-trace-dat'
>>
>>
>>   tools/perf/Documentation/perf-data.txt        |   7 +
>>   tools/perf/builtin-data.c                     |  40 +-
>>   ...rf_data_converter_tracepoints_trace_dat.sh | 169 ++++
>>   tools/perf/util/Build                         |   2 +
>>   tools/perf/util/data-convert-trace.c          | 240 +++++
>>   tools/perf/util/data-convert.h                |   4 +
>>   tools/perf/util/trace-dat.c                   | 876 ++++++++++++++++++
>>   tools/perf/util/trace-dat.h                   | 113 +++
>>   tools/perf/util/trace-event-read.c            | 307 +++++-
>>   9 files changed, 1749 insertions(+), 9 deletions(-)
>>   create mode 100755 tools/perf/tests/shell/test_perf_data_converter_tracepoints_trace_dat.sh
>>   create mode 100644 tools/perf/util/data-convert-trace.c
>>   create mode 100644 tools/perf/util/trace-dat.c
>>   create mode 100644 tools/perf/util/trace-dat.h
>>
>> --
>> 2.47.3
>>


      parent reply	other threads:[~2026-08-05  6:16 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-02 18:07 [RFC PATCH v2 0/5] Add perf.data tracepoint events to trace.dat conversion Tanushree Shah
2026-08-02 18:07 ` [RFC PATCH v2 1/5] perf/trace-dat: Add trace.dat export infrastructure Tanushree Shah
2026-08-02 18:07 ` [RFC PATCH v2 2/5] perf/trace-event: Write trace.dat metadata sections during parsing Tanushree Shah
2026-08-02 18:07 ` [RFC PATCH v2 3/5] perf data-convert: Add perf.data to trace.dat conversion backend Tanushree Shah
2026-08-02 18:07 ` [RFC PATCH v2 4/5] perf data: Add --to-trace-dat option for converting perf.data tracepoint events into trace.dat format Tanushree Shah
2026-08-02 18:08 ` [RFC PATCH v2 5/5] perf test: Add test validating trace.dat generated by 'perf data convert --to-trace-dat' Tanushree Shah
2026-08-05  2:07 ` [RFC PATCH v2 0/5] Add perf.data tracepoint events to trace.dat conversion Ian Rogers
2026-08-05  2:27   ` Ian Rogers
2026-08-05 10:40     ` Tanushree Shah
2026-08-05  6:15   ` Tanushree Shah [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=28c7f42a-30ee-4bb0-a0f3-cc808d36ed1f@linux.ibm.com \
    --to=tshah@linux.ibm.com \
    --cc=Tanushree.Shah@ibm.com \
    --cc=Tejas.Manhas1@ibm.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=atrajeev@linux.ibm.com \
    --cc=hbathini@linux.ibm.com \
    --cc=irogers@google.com \
    --cc=jolsa@kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=maddy@linux.ibm.com \
    --cc=mpetlan@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=tmricht@linux.ibm.com \
    --cc=vmolnaro@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.