mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: James Clark <james.clark@linaro.org>
To: Ian Rogers <irogers@google.com>
Cc: adrian.hunter@intel.com, dapeng1.mi@linux.intel.com,
	leo.yan@linux.dev, linux-kernel@vger.kernel.org,
	mingo@redhat.com, peterz@infradead.org, tmricht@linux.ibm.com,
	acme@kernel.org, alice.mei.rogers@gmail.com,
	linux-perf-users@vger.kernel.org, namhyung@kernel.org
Subject: Re: [PATCH v2 38/49] perf python: Port arm-cs-trace-disasm to perf module
Date: Wed, 23 Sep 2026 09:16:17 +0100	[thread overview]
Message-ID: <c7d189ad-8cd9-45b3-9cdd-72923aa5d5d9@linaro.org> (raw)
In-Reply-To: <CAP-5=fXz5S-Va1BdvQjvDqcKovToyoODC-T1gVV46pLPEbiVvQ@mail.gmail.com>



On 23/09/2026 06:23, Ian Rogers wrote:
> On Tue, Sep 22, 2026 at 6:12 AM James Clark <james.clark@linaro.org> wrote:
>>
>>
>>
>> On 21/09/2026 06:06, Ian Rogers wrote:
>>> Port arm-cs-trace-disasm.py to a standalone script in tools/perf/python/
>>> using the perf module directly.
>>>
>>> Improvements compared to the legacy script:
>>> - Encapsulate trace disassembly state in a TraceDisasm class
>>> - Automatically search standard kernel debug paths (find_vmlinux())
>>>     when -k/--vmlinux is not specified, and query
>>>     perf.config_get("annotate.objdump") for the default objdump binary.
>>> - Bound DISASM_CACHE memory consumption by evicting the cache at 1024
>>>     entries and skipping caching of oversized (> 512 lines) objdump
>>>     outputs.
>>> - Use sample.srccode() from the perf extension module to annotate
>>>     disassembly output with source filenames, line numbers, and source
>>>     lines.
>>>
>>> Update the ARM CoreSight disassembly shell test
>>> (test_arm_coresight_disasm.sh) to invoke the standalone script.
>>>
>>> Assisted-by: Antigravity:gemini-3.1-pro
>>> Signed-off-by: Ian Rogers <irogers@google.com>
>>> ---
>>>    tools/perf/python/arm-cs-trace-disasm.py      | 356 ++++++++++++++++++
>>>    .../coresight/test_arm_coresight_disasm.sh    |  24 +-
>>>    tools/perf/tests/shell/lib/setup_python.sh    |   4 +
>>>    3 files changed, 378 insertions(+), 6 deletions(-)
>>>    create mode 100755 tools/perf/python/arm-cs-trace-disasm.py
>>>
>>> diff --git a/tools/perf/python/arm-cs-trace-disasm.py b/tools/perf/python/arm-cs-trace-disasm.py
>>> new file mode 100755
>>> index 000000000000..1a9d9a01d1e4
>>> --- /dev/null
>>> +++ b/tools/perf/python/arm-cs-trace-disasm.py
>>> @@ -0,0 +1,356 @@
>>> +#!/usr/bin/env python3
>>> +# SPDX-License-Identifier: GPL-2.0
>>> +"""
>>> +arm-cs-trace-disasm.py: ARM CoreSight Trace Dump With Disassember using perf python module
>>> +"""
>>> +from __future__ import annotations
>>> +
>>> +import os
>>> +from os import path
>>> +import re
>>> +from subprocess import CalledProcessError, check_output
>>> +import argparse
>>> +import platform
>>> +import sys
>>> +from typing import Dict, List, Optional
>>> +
>>> +import perf
>>> +
>>> +# Initialize global dicts and regular expression
>>> +DISASM_CACHE: Dict[str, List[str]] = {}
>>> +CPU_DATA: Dict[str, int] = {}
>>> +DISASM_RE = re.compile(r"^\s*([0-9a-fA-F]+):")
>>> +DISASM_FUNC_RE = re.compile(r"^\s*([0-9a-fA-F]+)\s.*:")
>>> +CACHE_SIZE = 1024
>>> +class _State:
>>> +    sample_idx: int = -1
>>> +    source_file_name: Optional[str] = None
>>> +    line_number: Optional[int] = None
>>> +    dso: Optional[str] = None
>>> +
>>> +_STATE = _State()
>>> +
>>> +KVER = platform.release()
>>> +VMLINUX_PATHS = [
>>> +    f"/usr/lib/debug/boot/vmlinux-{KVER}.debug",
>>> +    f"/usr/lib/debug/lib/modules/{KVER}/vmlinux",
>>> +    f"/lib/modules/{KVER}/build/vmlinux",
>>> +    f"/usr/lib/debug/boot/vmlinux-{KVER}",
>>> +    f"/boot/vmlinux-{KVER}",
>>> +    "/boot/vmlinux",
>>> +    "vmlinux"
>>> +]
>>> +
>>> +def default_objdump() -> str:
>>> +    """Return the default objdump path from perf config or 'objdump'."""
>>> +    try:
>>> +        config = perf.config_get("annotate.objdump")
>>> +        return str(config) if config else "objdump"
>>> +    except (AttributeError, TypeError):
>>> +        return "objdump"
>>> +
>>> +def find_vmlinux() -> Optional[str]:
>>> +    """Find the vmlinux file in standard paths."""
>>> +    if hasattr(find_vmlinux, "path"):
>>> +        return getattr(find_vmlinux, "path")
>>> +
>>> +    for v in VMLINUX_PATHS:
>>> +        if os.access(v, os.R_OK):
>>> +            setattr(find_vmlinux, "path", v)
>>> +            return v
>>> +    setattr(find_vmlinux, "path", None)
>>> +    return None
>>> +
>>> +def get_dso_file_path(dso_name: str, dso_build_id: str, vmlinux: Optional[str]) -> str:
>>> +    """Return the path to the DSO file."""
>>> +    buildid_dir = os.environ.get('PERF_BUILDID_DIR')
>>> +    if not buildid_dir:
>>> +        buildid_dir = os.path.join(os.environ.get('HOME', ''), '.debug')
>>> +
>>> +    if dso_name in ("[kernel.kallsyms]", "vmlinux"):
>>> +        if vmlinux:
>>> +            return vmlinux
>>> +        if dso_build_id:
>>> +            for kname in (dso_name, "vmlinux", "[kernel.kallsyms]"):
>>> +                candidate = os.path.join(buildid_dir, kname, dso_build_id, "elf")
>>> +                if os.access(candidate, os.R_OK):
>>> +                    return candidate
>>> +        return find_vmlinux() or dso_name
>>> +
>>> +    if dso_name == "[vdso]":
>>> +        append = "/vdso"
>>> +    else:
>>> +        append = "/elf"
>>> +
>>> +    dso_path = buildid_dir + "/" + dso_name + "/" + dso_build_id + append
>>> +    # Replace duplicate slash chars to single slash char
>>> +    dso_path = dso_path.replace('//', '/', 1)
>>> +    return dso_path
>>> +
>>> +def read_disam(dso_fname: str, dso_start: int, start_addr: int,
>>> +               stop_addr: int, objdump: str) -> List[str]:
>>> +    """Read disassembly from a DSO file using objdump."""
>>> +    addr_range = f"{start_addr}:{stop_addr}:{dso_start}:{dso_fname}"
>>> +
>>> +    # Don't let the cache get too big, clear it when it hits max size
>>> +    if len(DISASM_CACHE) > CACHE_SIZE:
>>> +        DISASM_CACHE.clear()
>>> +
>>> +    if addr_range in DISASM_CACHE:
>>> +        disasm_output = DISASM_CACHE[addr_range]
>>> +    else:
>>> +        start_addr = start_addr - dso_start
>>> +        stop_addr = stop_addr - dso_start
>>> +        disasm = [objdump, "-d", "-z",
>>> +                  f"--start-address={start_addr:#x}",
>>> +                  f"--stop-address={stop_addr:#x}"]
>>> +        disasm += [dso_fname]
>>> +        try:
>>> +            disasm_output = check_output(disasm).decode('utf-8', errors='replace').split('\n')
>>> +        except (CalledProcessError, OSError):
>>> +            return []
>>> +        if len(disasm_output) <= 512:
>>> +            DISASM_CACHE[addr_range] = disasm_output
>>> +
>>> +    return disasm_output
>>> +
>>> +def print_disam(dso_fname: str, dso_start: int, start_addr: int,
>>> +                stop_addr: int, objdump: str) -> None:
>>> +    """Print disassembly for a given address range."""
>>> +    for line in read_disam(dso_fname, dso_start, start_addr, stop_addr, objdump):
>>> +        m = DISASM_FUNC_RE.search(line)
>>> +        if m is None:
>>> +            m = DISASM_RE.search(line)
>>> +            if m is None:
>>> +                continue
>>> +        print(f"\t{line}")
>>> +
>>> +def print_sample(sample: perf.sample_event) -> None:
>>> +    """Print sample details."""
>>> +    print(f"Sample = {{ cpu: {sample.sample_cpu:04d} addr: {sample.sample_addr:016x} "
>>> +          f"phys_addr: {sample.sample_phys_addr:016x} ip: {sample.sample_ip:016x} "
>>> +          f"pid: {sample.sample_pid} tid: {sample.sample_tid} period: {sample.sample_period} "
>>> +          f"time: {sample.sample_time} index: {_STATE.sample_idx}}}")
>>> +
>>> +def common_start_str(comm: str, sample: perf.sample_event) -> str:
>>> +    """Return common start string for sample output."""
>>> +    sec = int(sample.sample_time / 1000000000)
>>> +    ns = sample.sample_time % 1000000000
>>> +    cpu = sample.sample_cpu
>>> +    pid = sample.sample_pid
>>> +    tid = sample.sample_tid
>>> +    return f"{comm:>16s} {pid:5d}/{tid:<5d} [{cpu:04d}] {sec:9d}.{ns:09d}  "
>>> +
>>> +def print_srccode(comm: str, sample: perf.sample_event, symbol: str, dso: str) -> None:
>>> +    """Print source code and symbols for a sample."""
>>> +    ip = sample.sample_ip
>>> +    if symbol == "[unknown]":
>>> +        start_str = common_start_str(comm, sample) + f"{ip:x}".rjust(16).ljust(40)
>>> +    else:
>>> +        symoff = 0
>>> +        symoff = getattr(sample, 'sym_offset', 0) or 0
>>> +        offs = f"+{symoff:#x}" if symoff != 0 else ""
>>> +        start_str = common_start_str(comm, sample) + (symbol + offs).ljust(40)
>>> +
>>> +    source_file_name, line_number, source_line = sample.srccode() or (None, 0, None)
>>> +    if source_file_name:
>>> +        if _STATE.line_number == line_number and _STATE.source_file_name == source_file_name:
>>> +            src_str = ""
>>> +        else:
>>> +            if len(source_file_name) > 40:
>>> +                src_file = f"...{source_file_name[-37:]} "
>>> +            else:
>>> +                src_file = source_file_name.ljust(41)
>>> +
>>> +            if source_line is None:
>>> +                src_str = f"{src_file}{line_number:>4d} <source not found>"
>>> +            else:
>>> +                src_str = f"{src_file}{line_number:>4d} {source_line}"
>>> +        _STATE.dso = None
>>> +    elif dso == _STATE.dso:
>>> +        src_str = ""
>>> +    else:
>>> +        src_str = dso
>>> +        _STATE.dso = dso
>>> +
>>> +    _STATE.line_number = line_number
>>> +    _STATE.source_file_name = source_file_name
>>> +
>>> +    print(start_str, src_str)
>>> +
>>> +class TraceDisasm:
>>> +    """Class to handle trace disassembly."""
>>> +    def __init__(self, cli_options: argparse.Namespace):
>>> +        self.options = cli_options
>>> +        self.sample_idx = -1
>>> +        self.session: Optional[perf.session] = None
>>> +
>>> +    def process_event(self, sample: perf.sample_event) -> None:
>>> +        """Process a single perf event."""
>>> +        self.sample_idx += 1
>>> +        _STATE.sample_idx = self.sample_idx
>>> +
>>> +        if self.options.start_time is not None and sample.sample_time < self.options.start_time:
>>> +            return
>>> +        if self.options.stop_time is not None and sample.sample_time > self.options.stop_time:
>>> +            sys.exit(0)
>>> +        if self.options.start_sample is not None and self.sample_idx < self.options.start_sample:
>>> +            return
>>> +        if self.options.stop_sample is not None and self.sample_idx > self.options.stop_sample:
>>> +            sys.exit(0)
>>> +
>>> +        ev_name = str(sample.evsel)
>>> +        if self.options.verbose:
>>> +            print(f"Event type: {ev_name}")
>>> +            print_sample(sample)
>>> +
>>> +        dso = sample.dso or '[unknown]'
>>> +        symbol = sample.symbol or '[unknown]'
>>> +        dso_bid = (sample.dso_bid.decode('utf-8')
>>> +                   if isinstance(sample.dso_bid, bytes)
>>> +                   else str(sample.dso_bid or '[unknown]'))
>>> +        dso_start = sample.map_start
>>> +        dso_end = sample.map_end
>>> +        map_pgoff = sample.map_pgoff or 0
>>> +
>>> +        comm = "[unknown]"
>>> +        try:
>>> +            if self.session:
>>> +                thread_info = self.session.find_thread(sample.sample_tid)
>>> +                if thread_info:
>>> +                    comm = thread_info.comm() or "[unknown]"
>>> +        except (TypeError, AttributeError):
>>> +            pass
>>> +
>>> +        if dso == '[unknown]':
>>> +            return
>>> +
>>> +        if dso_start is None or dso_end is None:
>>> +            print(f"Failed to find valid dso map for dso {dso}")
>>> +            return
>>> +
>>> +        if "instructions" in ev_name:
>>> +            print_srccode(comm, sample, symbol, dso)
>>> +            return
>>> +
>>> +        if "branches" not in ev_name:
>>> +            return
>>> +
>>> +        self._process_branch(sample, comm, symbol, dso, dso_bid, dso_start, dso_end, map_pgoff)
>>> +
>>> +    def _process_branch(self, sample: perf.sample_event, comm: str, symbol: str, dso: str,
>>> +                        dso_bid: str, dso_start: int, dso_end: int, map_pgoff: int) -> None:
>>> +        """Helper to process branch events."""
>>> +        cpu = sample.sample_cpu
>>> +        ip = sample.sample_ip
>>> +        addr = sample.sample_addr
>>> +
>>> +        if CPU_DATA.get(str(cpu) + 'addr') is None:
>>> +            CPU_DATA[str(cpu) + 'addr'] = addr
>>> +            return
>>> +
>>> +        start_addr = CPU_DATA[str(cpu) + 'addr']
>>> +        stop_addr  = ip + 4
>>> +
>>> +        # Record for previous sample packet
>>> +        CPU_DATA[str(cpu) + 'addr'] = addr
>>> +
>>> +        # Filter out zero start_address. Optionally identify CS_ETM_TRACE_ON packet
>>> +        if start_addr == 0:
>>> +            if stop_addr == 4 and self.options.verbose:
>>> +                print(f"CPU{cpu}: CS_ETM_TRACE_ON packet is inserted")
>>> +            return
>>> +
>>> +        if start_addr < dso_start or start_addr > dso_end:
>>> +            print(f"Start address {start_addr:#x} is out of range [ {dso_start:#x} .. "
>>> +                  f"{dso_end:#x} ] for dso {dso}")
>>> +            return
>>> +
>>> +        if stop_addr < dso_start or stop_addr > dso_end:
>>> +            print(f"Stop address {stop_addr:#x} is out of range [ {dso_start:#x} .. "
>>> +                  f"{dso_end:#x} ] for dso {dso}")
>>> +            return
>>> +
>>> +        if self.options.objdump is not None:
>>> +            if dso == "[kernel.kallsyms]":
>>> +                dso_vm_start = 0
>>> +                map_pgoff_local = 0
>>> +            elif dso_start == 0x400000:
>>> +                dso_vm_start = 0
>>> +                map_pgoff_local = 0
>>> +            else:
>>> +                dso_vm_start = dso_start
>>> +                map_pgoff_local = map_pgoff
>>> +
>>> +            dso_fname = get_dso_file_path(dso, dso_bid, self.options.vmlinux)
>>> +            if path.exists(dso_fname):
>>> +                print_disam(dso_fname, dso_vm_start, start_addr + map_pgoff_local,
>>> +                            stop_addr + map_pgoff_local, self.options.objdump)
>>> +            else:
>>> +                print(f"Failed to find dso {dso} for address range [ "
>>> +                      f"{start_addr + map_pgoff_local:#x} .. {stop_addr + map_pgoff_local:#x} ]")
>>> +
>>> +        print_srccode(comm, sample, symbol, dso)
>>> +
>>> +    def run(self) -> None:
>>> +        """Run the trace disassembly session."""
>>> +        input_file = self.options.input or "perf.data"
>>> +        if input_file != "-" and not os.path.exists(input_file):
>>> +            print(f"Error: {input_file} not found.", file=sys.stderr)
>>> +            sys.exit(1)
>>> +
>>> +        print('ARM CoreSight Trace Data Assembler Dump')
>>> +        try:
>>> +            self.session = perf.session(
>>> +                perf.data(input_file),
>>> +                sample=self.process_event,
>>> +                itrace=self.options.itrace
>>> +            )
>>> +        except (OSError, ValueError, KeyError, RuntimeError, TypeError, AttributeError) as e:
>>> +            print(f"Error opening session: {e}", file=sys.stderr)
>>> +            sys.exit(1)
>>> +
>>> +        try:
>>> +            self.session.process_events()
>>> +        finally:
>>> +            self.session = None
>>> +        print('End')
>>> +
>>> +if __name__ == "__main__":
>>> +    def int_arg(v: str) -> int:
>>> +        """Helper for integer command line arguments."""
>>> +        val = int(v)
>>> +        if val < 0:
>>> +            raise argparse.ArgumentTypeError("Argument must be a positive integer")
>>> +        return val
>>> +
>>> +    arg_parser = argparse.ArgumentParser(description="ARM CoreSight Trace Dump With Disassembler")
>>> +    arg_parser.add_argument("-i", "--input", help="input perf.data file")
>>> +    arg_parser.add_argument("-k", "--vmlinux",
>>> +                            help="Set path to vmlinux file. Omit to autodetect")
>>> +    arg_parser.add_argument("-d", "--objdump", nargs="?", const=default_objdump(),
>>> +                            help="Show disassembly. Can also be used to change the objdump path")
>>> +    arg_parser.add_argument("-v", "--verbose", action="store_true", help="Enable debugging log")
>>> +    arg_parser.add_argument("--start-time", type=int_arg,
>>> +                            help="Monotonic clock time of sample to start from.")
>>> +    arg_parser.add_argument("--stop-time", type=int_arg,
>>> +                            help="Monotonic clock time of sample to stop at.")
>>> +    arg_parser.add_argument("--itrace", default="b",
>>> +                            help="Instruction tracing options.")
>>> +    arg_parser.add_argument("--start-sample", type=int_arg,
>>> +                            help="Index of sample to start from.")
>>> +    arg_parser.add_argument("--stop-sample", type=int_arg,
>>> +                            help="Index of sample to stop at.")
>>> +
>>> +    parsed_options = arg_parser.parse_args()
>>> +    if (parsed_options.start_time is not None and parsed_options.stop_time is not None and
>>> +            parsed_options.start_time >= parsed_options.stop_time):
>>> +        print("--start-time must less than --stop-time")
>>> +        sys.exit(2)
>>> +    if (parsed_options.start_sample is not None and parsed_options.stop_sample is not None and
>>> +            parsed_options.start_sample >= parsed_options.stop_sample):
>>> +        print("--start-sample must less than --stop-sample")
>>> +        sys.exit(2)
>>> +
>>> +    td = TraceDisasm(parsed_options)
>>> +    td.run()
>>> diff --git a/tools/perf/tests/shell/coresight/test_arm_coresight_disasm.sh b/tools/perf/tests/shell/coresight/test_arm_coresight_disasm.sh
>>> index f3ebad596378..51bcbd78f460 100755
>>> --- a/tools/perf/tests/shell/coresight/test_arm_coresight_disasm.sh
>>> +++ b/tools/perf/tests/shell/coresight/test_arm_coresight_disasm.sh
>>> @@ -1,6 +1,6 @@
>>>    #!/bin/bash
>>> -# Check Arm CoreSight disassembly script completes without errors (exclusive)
>>>    # SPDX-License-Identifier: GPL-2.0
>>> +# Check Arm CoreSight disassembly script completes without errors (exclusive)
>>>
>>>    # The disassembly script reconstructs ranges of instructions and gives these to objdump to
>>>    # decode. objdump doesn't like ranges that go backwards, but these are a good indication
>>> @@ -22,9 +22,21 @@ glb_err=1
>>>
>>>    perfdata_dir=$(mktemp -d /tmp/__perf_test.perf.data.XXXXX)
>>>    perfdata=${perfdata_dir}/perf.data
>>> +perfdata2=${perfdata_dir}/perf2.data
>>>    file=$(mktemp /tmp/temporary_file.XXXXX)
>>>    # Relative path works whether it's installed or running from repo
>>> -script_path=$(dirname "$0")/../../../scripts/python/arm-cs-trace-disasm.py
>>> +if [ -n "$PERF_EXEC_PATH" ] && [ -e "$PERF_EXEC_PATH/python/arm-cs-trace-disasm.py" ]; then
>>> +     script_path="$PERF_EXEC_PATH/python/arm-cs-trace-disasm.py"
>>> +else
>>> +     script_path=$(dirname "$0")/../../../python/arm-cs-trace-disasm.py
>>> +fi
>>> +
>>> +# shellcheck source=lib/setup_python.sh
>>> +. "$(dirname "$0")"/../lib/setup_python.sh
>>> +$PYTHON -c "import perf" 2>/dev/null || {
>>> +     echo "Skipping test, perf python module not found"
>>> +     exit 2
>>> +}
>>>
>>>    cleanup_files()
>>>    {
>>> @@ -44,8 +56,8 @@ branch_search='[[:space:]](bl|b(\.(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al)
>>>    if [ "$(id -u)" == 0 ] && [ -e /proc/kcore ]; then
>>>        echo "Testing kernel disassembly"
>>>        perf record -o ${perfdata} -e cs_etm//k --kcore -Se -m,64K -- touch $file > /dev/null 2>&1
>>> -     perf script -i ${perfdata} --itrace=b -s python:${script_path} -- \
>>> -             -d --stop-sample=2 -k ${perfdata}/kcore_dir/kcore 2> /dev/null > ${file}
>>> +     $PYTHON ${script_path} -i ${perfdata} --itrace=b -d --stop-sample=2 \
>>> +             -k ${perfdata}/kcore_dir/kcore 2> /dev/null > ${file}
>>>        grep -q -E ${branch_search} ${file}
>>>        echo "Found kernel branches"
>>>    else
>>> @@ -56,8 +68,8 @@ fi
>>>    ## Test user ##
>>>    echo "Testing userspace disassembly"
>>>    perf record -o ${perfdata} -e cs_etm//u -Se -m,64K -- touch $file > /dev/null 2>&1
>>> -perf script -i ${perfdata} --itrace=b -s python:${script_path} -- \
>>> -     -d --stop-sample=2 2> /dev/null > ${file}
>>> +perf inject --itrace=b -i ${perfdata} -o ${perfdata2}
>>> +$PYTHON ${script_path} -i ${perfdata2} -d --stop-sample=2 2> /dev/null > ${file}
>>>    grep -q -E ${branch_search} ${file}
>>>    echo "Found userspace branches"
>>>
>>> diff --git a/tools/perf/tests/shell/lib/setup_python.sh b/tools/perf/tests/shell/lib/setup_python.sh
>>> index 2173215a0517..220d9663f81a 100644
>>> --- a/tools/perf/tests/shell/lib/setup_python.sh
>>> +++ b/tools/perf/tests/shell/lib/setup_python.sh
>>> @@ -18,6 +18,10 @@ fi
>>>    # Set PYTHONPATH to find the in-tree built perf.so first, avoiding system-wide perf.so
>>>    if [ -n "$PERF_EXEC_PATH" ] && [ -d "$PERF_EXEC_PATH/python" ]; then
>>>      PYTHONPATH_DIR="$PERF_EXEC_PATH/python"
>>> +elif [ -n "${BASH_SOURCE[0]}" ] && [ -d "$(dirname "${BASH_SOURCE[0]}")/../../../python" ]; then
>>> +  PYTHONPATH_DIR="$(dirname "${BASH_SOURCE[0]}")/../../../python"
>>> +elif [ -d "$(dirname "$0")/../../../python" ]; then
>>> +  PYTHONPATH_DIR="$(dirname "$0")/../../../python"
>>>    elif [ -d "$(dirname "$0")/../../python" ]; then
>>>      PYTHONPATH_DIR="$(dirname "$0")/../../python"
>>>    elif [ -d "$(dirname "$0")/../python" ]; then
>>
>> Reviewed-by: James Clark <james.clark@linaro.org>
> 
> Thanks! v3 has some Sashiko related nits cleaned up in this code, but
> I'll keep the reviewed-by tag. I hope that's okay.
> 
> Thanks,
> Ian

Yep sure.

  reply	other threads:[~2026-09-23  8:16 UTC|newest]

Thread overview: 219+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-20  5:20 [PATCH v1 00/49] perf: Complete transition to standalone Python scripts Ian Rogers
2026-09-20  5:20 ` [PATCH v1 01/49] perf python: Update syscall format string to optional positional Ian Rogers
2026-09-20  5:20 ` [PATCH v1 02/49] perf python: Update callchain stubs and session thread lookup Ian Rogers
2026-09-20  5:20 ` [PATCH v1 03/49] perf python: Clean up pylint warnings in ilist.py Ian Rogers
2026-09-20  5:20 ` [PATCH v1 04/49] perf python: Clean up pylint warnings in treport.py Ian Rogers
2026-09-20  5:20 ` [PATCH v1 05/49] perf python: Clean up pylint warnings in tracepoint.py Ian Rogers
2026-09-20  5:20 ` [PATCH v1 06/49] perf python: Clean up pylint warnings in twatch.py Ian Rogers
2026-09-20  5:20 ` [PATCH v1 07/49] perf python: Improve perf script -l descriptions Ian Rogers
2026-09-20  5:21 ` [PATCH v1 08/49] perf python: Expose addr location, transaction, and context_switch Ian Rogers
2026-09-20  5:21 ` [PATCH v1 09/49] perf python: Add Intel PT call_return and itrace capability Ian Rogers
2026-09-20  5:21 ` [PATCH v1 10/49] perf python: Allow KeyboardInterrupt to propagate in LiveSession Ian Rogers
2026-09-20  5:21 ` [PATCH v1 11/49] perf pmu-events: Clean up mypy and pylint issues Ian Rogers
2026-09-20  5:21 ` [PATCH v1 12/49] perf test: Clean up mypy and pylint issues in shell test libraries Ian Rogers
2026-09-20  5:21 ` [PATCH v1 13/49] perf build: Make mypy build test opt-out (NO_MYPY=1) Ian Rogers
2026-09-20  5:21 ` [PATCH v1 14/49] perf build: Make pylint build test opt-out (NO_PYLINT=1) Ian Rogers
2026-09-20  5:21 ` [PATCH v1 15/49] perf Makefile: Install standalone Python scripts during transition Ian Rogers
2026-09-20  5:21 ` [PATCH v1 16/49] perf python: Port stat-cpi to perf module Ian Rogers
2026-09-20  5:21 ` [PATCH v1 17/49] perf python: Port mem-phys-addr " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 18/49] perf python: Port stackcollapse " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 19/49] perf python: Port flamegraph " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 20/49] perf python: Port gecko " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 21/49] perf python: Port event_analyzing_sample " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 22/49] perf python: Port syscall-counts " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 23/49] perf python: Port syscall-counts-by-pid " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 24/49] perf python: Port failed-syscalls-by-pid " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 25/49] perf python: Port failed-syscalls from Perl " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 26/49] perf python: Port sctop " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 27/49] perf python: Port rw-by-file from Perl " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 28/49] perf python: Port rw-by-pid " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 29/49] perf python: Port rwtop " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 30/49] perf python: Port futex-contention " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 31/49] perf python: Port task-analyzer " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 32/49] perf python: Port sched-migration and SchedGui " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 33/49] perf python: Port wakeup-latency from Perl " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 34/49] perf python: Port compaction-times " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 35/49] perf python: Port net_dropmonitor " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 36/49] perf python: Port netdev-times " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 37/49] perf python: Port check-perf-trace " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 38/49] perf python: Port arm-cs-trace-disasm " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 39/49] perf python: Port powerpc-hcalls " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 40/49] perf python: Port intel-pt-events and libxed " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 41/49] perf test: Migrate Intel PT virtual LBR test to Python API Ian Rogers
2026-09-20  5:21 ` [PATCH v1 42/49] perf python: Port export-to-sqlite to perf module Ian Rogers
2026-09-20  5:21 ` [PATCH v1 43/49] perf python: Port export-to-postgresql " Ian Rogers
2026-09-20  5:21 ` [PATCH v1 44/49] perf python: Move and clean up exported-sql-viewer.py Ian Rogers
2026-09-20  5:21 ` [PATCH v1 45/49] perf python: Move and clean up parallel-perf.py Ian Rogers
2026-09-20  5:21 ` [PATCH v1 46/49] perf: Remove libpython support and legacy Python scripts Ian Rogers
2026-09-20  5:21 ` [PATCH v1 47/49] perf Makefile: Update Python script installation path Ian Rogers
2026-09-20  5:21 ` [PATCH v1 48/49] perf script: Support standalone scripts and remove embedded scripting Ian Rogers
2026-09-20  5:21 ` [PATCH v1 49/49] perf Documentation: Update for standalone Python scripts Ian Rogers
2026-09-21  5:06 ` [PATCH v2 00/49] perf: Complete transition to " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 01/49] perf python: Update syscall format string to optional positional Ian Rogers
2026-09-21  5:06   ` [PATCH v2 02/49] perf python: Update callchain stubs and session thread lookup Ian Rogers
2026-09-21  5:06   ` [PATCH v2 03/49] perf python: Clean up pylint warnings in ilist.py Ian Rogers
2026-09-21  5:06   ` [PATCH v2 04/49] perf python: Clean up pylint warnings in treport.py Ian Rogers
2026-09-21  5:06   ` [PATCH v2 05/49] perf python: Clean up pylint warnings in tracepoint.py Ian Rogers
2026-09-21  5:06   ` [PATCH v2 06/49] perf python: Clean up pylint warnings in twatch.py Ian Rogers
2026-09-21  5:06   ` [PATCH v2 07/49] perf python: Improve perf script -l descriptions Ian Rogers
2026-09-21  5:06   ` [PATCH v2 08/49] perf python: Expose addr location, transaction, and context_switch Ian Rogers
2026-09-21  5:06   ` [PATCH v2 09/49] perf python: Add Intel PT call_return and itrace capability Ian Rogers
2026-09-22 13:11     ` James Clark
2026-09-22 17:00       ` Ian Rogers
2026-09-21  5:06   ` [PATCH v2 10/49] perf python: Allow KeyboardInterrupt to propagate in LiveSession Ian Rogers
2026-09-21  5:06   ` [PATCH v2 11/49] perf pmu-events: Clean up mypy and pylint issues Ian Rogers
2026-09-21  5:06   ` [PATCH v2 12/49] perf test: Clean up mypy and pylint issues in shell test libraries Ian Rogers
2026-09-21  5:06   ` [PATCH v2 13/49] perf build: Make mypy build test opt-out (NO_MYPY=1) Ian Rogers
2026-09-22 13:11     ` James Clark
2026-09-22 16:59       ` Ian Rogers
2026-09-21  5:06   ` [PATCH v2 14/49] perf build: Make pylint build test opt-out (NO_PYLINT=1) Ian Rogers
2026-09-21  5:06   ` [PATCH v2 15/49] perf Makefile: Install standalone Python scripts during transition Ian Rogers
2026-09-21  5:06   ` [PATCH v2 16/49] perf python: Port stat-cpi to perf module Ian Rogers
2026-09-21  5:06   ` [PATCH v2 17/49] perf python: Port mem-phys-addr " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 18/49] perf python: Port stackcollapse " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 19/49] perf python: Port flamegraph " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 20/49] perf python: Port gecko " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 21/49] perf python: Port event_analyzing_sample " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 22/49] perf python: Port syscall-counts " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 23/49] perf python: Port syscall-counts-by-pid " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 24/49] perf python: Port failed-syscalls-by-pid " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 25/49] perf python: Port failed-syscalls from Perl " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 26/49] perf python: Port sctop " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 27/49] perf python: Port rw-by-file from Perl " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 28/49] perf python: Port rw-by-pid " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 29/49] perf python: Port rwtop " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 30/49] perf python: Port futex-contention " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 31/49] perf python: Port task-analyzer " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 32/49] perf python: Port sched-migration and SchedGui " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 33/49] perf python: Port wakeup-latency from Perl " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 34/49] perf python: Port compaction-times " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 35/49] perf python: Port net_dropmonitor " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 36/49] perf python: Port netdev-times " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 37/49] perf python: Port check-perf-trace " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 38/49] perf python: Port arm-cs-trace-disasm " Ian Rogers
2026-09-22 13:12     ` James Clark
2026-09-23  5:23       ` Ian Rogers
2026-09-23  8:16         ` James Clark [this message]
2026-09-23  9:00     ` Leo Yan
2026-09-23  9:08       ` Leo Yan
2026-09-23 13:16         ` Ian Rogers
2026-09-23 13:40       ` Ian Rogers
2026-09-24 15:41         ` Leo Yan
2026-09-25 21:45           ` Ian Rogers
2026-09-21  5:06   ` [PATCH v2 39/49] perf python: Port powerpc-hcalls " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 40/49] perf python: Port intel-pt-events and libxed " Ian Rogers
2026-09-21  5:06   ` [PATCH v2 41/49] perf test: Migrate Intel PT virtual LBR test to Python API Ian Rogers
2026-09-21  5:07   ` [PATCH v2 42/49] perf python: Port export-to-sqlite to perf module Ian Rogers
2026-09-21  5:07   ` [PATCH v2 43/49] perf python: Port export-to-postgresql " Ian Rogers
2026-09-21  5:07   ` [PATCH v2 44/49] perf python: Move and clean up exported-sql-viewer.py Ian Rogers
2026-09-21  5:07   ` [PATCH v2 45/49] perf python: Move and clean up parallel-perf.py Ian Rogers
2026-09-21  5:07   ` [PATCH v2 46/49] perf: Remove libpython support and legacy Python scripts Ian Rogers
2026-09-21  5:07   ` [PATCH v2 47/49] perf Makefile: Update Python script installation path Ian Rogers
2026-09-21  5:07   ` [PATCH v2 48/49] perf script: Support standalone scripts and remove embedded scripting Ian Rogers
2026-09-21  5:07   ` [PATCH v2 49/49] perf Documentation: Update for standalone Python scripts Ian Rogers
2026-09-23 18:11   ` [PATCH v3 00/49] perf: Complete transition to " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 01/49] perf python: Update syscall helpers and expose arch_strerrno Ian Rogers
2026-09-23 18:11     ` [PATCH v3 02/49] perf python: Update callchain stubs and session thread lookup Ian Rogers
2026-09-23 18:11     ` [PATCH v3 03/49] perf python: Clean up pylint warnings in ilist.py Ian Rogers
2026-09-23 18:11     ` [PATCH v3 04/49] perf python: Clean up pylint warnings in treport.py Ian Rogers
2026-09-23 18:11     ` [PATCH v3 05/49] perf python: Clean up pylint warnings in tracepoint.py Ian Rogers
2026-09-23 18:11     ` [PATCH v3 06/49] perf python: Clean up pylint warnings in twatch.py Ian Rogers
2026-09-23 18:11     ` [PATCH v3 07/49] perf python: Improve perf script -l descriptions Ian Rogers
2026-09-23 18:11     ` [PATCH v3 08/49] perf python: Expose addr location, transaction, and context_switch Ian Rogers
2026-09-23 18:11     ` [PATCH v3 09/49] perf python: Add Intel PT call_return and itrace capability Ian Rogers
2026-09-23 18:11     ` [PATCH v3 10/49] perf python: Allow KeyboardInterrupt to propagate in LiveSession Ian Rogers
2026-09-23 18:11     ` [PATCH v3 11/49] perf pmu-events: Clean up mypy and pylint issues Ian Rogers
2026-09-23 18:11     ` [PATCH v3 12/49] perf test: Clean up mypy and pylint issues in shell test libraries Ian Rogers
2026-09-23 18:11     ` [PATCH v3 13/49] perf build: Make mypy build test opt-out (NO_MYPY=1) Ian Rogers
2026-09-23 18:11     ` [PATCH v3 14/49] perf build: Make pylint build test opt-out (NO_PYLINT=1) Ian Rogers
2026-09-23 18:11     ` [PATCH v3 15/49] perf Makefile: Install standalone Python scripts during transition Ian Rogers
2026-09-23 18:11     ` [PATCH v3 16/49] perf python: Port stat-cpi to perf module Ian Rogers
2026-09-23 18:11     ` [PATCH v3 17/49] perf python: Port mem-phys-addr " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 18/49] perf python: Port stackcollapse " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 19/49] perf python: Port flamegraph " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 20/49] perf python: Port gecko " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 21/49] perf python: Port event_analyzing_sample " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 22/49] perf python: Port syscall-counts " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 23/49] perf python: Port syscall-counts-by-pid " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 24/49] perf python: Port failed-syscalls-by-pid " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 25/49] perf python: Port failed-syscalls from Perl " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 26/49] perf python: Port sctop " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 27/49] perf python: Port rw-by-file from Perl " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 28/49] perf python: Port rw-by-pid " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 29/49] perf python: Port rwtop " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 30/49] perf python: Port futex-contention " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 31/49] perf python: Port task-analyzer " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 32/49] perf python: Port sched-migration and SchedGui " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 33/49] perf python: Port wakeup-latency from Perl " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 34/49] perf python: Port compaction-times " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 35/49] perf python: Port net_dropmonitor " Ian Rogers
2026-09-23 18:11     ` [PATCH v3 36/49] perf python: Port netdev-times " Ian Rogers
2026-09-23 18:12     ` [PATCH v3 37/49] perf python: Port check-perf-trace " Ian Rogers
2026-09-23 18:12     ` [PATCH v3 38/49] perf python: Port arm-cs-trace-disasm " Ian Rogers
2026-09-23 18:12     ` [PATCH v3 39/49] perf python: Port powerpc-hcalls " Ian Rogers
2026-09-23 18:12     ` [PATCH v3 40/49] perf python: Port intel-pt-events and libxed " Ian Rogers
2026-09-23 18:12     ` [PATCH v3 41/49] perf test: Migrate Intel PT virtual LBR test to Python API Ian Rogers
2026-09-23 18:12     ` [PATCH v3 42/49] perf python: Port export-to-sqlite to perf module Ian Rogers
2026-09-23 18:12     ` [PATCH v3 43/49] perf python: Port export-to-postgresql " Ian Rogers
2026-09-23 18:12     ` [PATCH v3 44/49] perf python: Move and clean up exported-sql-viewer.py Ian Rogers
2026-09-23 18:12     ` [PATCH v3 45/49] perf python: Move and clean up parallel-perf.py Ian Rogers
2026-09-23 18:12     ` [PATCH v3 46/49] perf: Remove libpython support and legacy Python scripts Ian Rogers
2026-09-23 18:12     ` [PATCH v3 47/49] perf Makefile: Update Python script installation path Ian Rogers
2026-09-23 18:12     ` [PATCH v3 48/49] perf script: Support standalone scripts and remove embedded scripting Ian Rogers
2026-09-23 18:12     ` [PATCH v3 49/49] perf Documentation: Update for standalone Python scripts Ian Rogers
2026-09-26  6:19     ` [PATCH v4 00/49] perf: Complete transition to " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 01/49] perf python: Update syscall helpers and expose arch_strerrno Ian Rogers
2026-09-26  6:19       ` [PATCH v4 02/49] perf python: Update callchain stubs and session thread lookup Ian Rogers
2026-09-26  6:19       ` [PATCH v4 03/49] perf python: Clean up pylint warnings in ilist.py Ian Rogers
2026-09-26  6:19       ` [PATCH v4 04/49] perf python: Clean up pylint warnings in treport.py Ian Rogers
2026-09-26  6:19       ` [PATCH v4 05/49] perf python: Clean up pylint warnings in tracepoint.py Ian Rogers
2026-09-26  6:19       ` [PATCH v4 06/49] perf python: Clean up pylint warnings in twatch.py Ian Rogers
2026-09-26  6:19       ` [PATCH v4 07/49] perf python: Improve perf script -l descriptions Ian Rogers
2026-09-26  6:19       ` [PATCH v4 08/49] perf python: Expose addr location, transaction, and context_switch Ian Rogers
2026-09-26  6:19       ` [PATCH v4 09/49] perf python: Add Intel PT call_return and itrace capability Ian Rogers
2026-09-26  6:19       ` [PATCH v4 10/49] perf python: Allow KeyboardInterrupt to propagate in LiveSession Ian Rogers
2026-09-26  6:19       ` [PATCH v4 11/49] perf pmu-events: Clean up mypy and pylint issues Ian Rogers
2026-09-26  6:19       ` [PATCH v4 12/49] perf test: Clean up mypy and pylint issues in shell test libraries Ian Rogers
2026-09-26  6:19       ` [PATCH v4 13/49] perf build: Make mypy build test opt-out (NO_MYPY=1) Ian Rogers
2026-09-26  6:19       ` [PATCH v4 14/49] perf build: Make pylint build test opt-out (NO_PYLINT=1) Ian Rogers
2026-09-26  6:19       ` [PATCH v4 15/49] perf Makefile: Install standalone Python scripts during transition Ian Rogers
2026-09-26  6:19       ` [PATCH v4 16/49] perf python: Port stat-cpi to perf module Ian Rogers
2026-09-26  6:19       ` [PATCH v4 17/49] perf python: Port mem-phys-addr " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 18/49] perf python: Port stackcollapse " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 19/49] perf python: Port flamegraph " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 20/49] perf python: Port gecko " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 21/49] perf python: Port event_analyzing_sample " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 22/49] perf python: Port syscall-counts " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 23/49] perf python: Port syscall-counts-by-pid " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 24/49] perf python: Port failed-syscalls-by-pid " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 25/49] perf python: Port failed-syscalls from Perl " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 26/49] perf python: Port sctop " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 27/49] perf python: Port rw-by-file from Perl " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 28/49] perf python: Port rw-by-pid " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 29/49] perf python: Port rwtop " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 30/49] perf python: Port futex-contention " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 31/49] perf python: Port task-analyzer " Ian Rogers
2026-09-26  6:19       ` [PATCH v4 32/49] perf python: Port sched-migration and SchedGui " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 33/49] perf python: Port wakeup-latency from Perl " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 34/49] perf python: Port compaction-times " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 35/49] perf python: Port net_dropmonitor " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 36/49] perf python: Port netdev-times " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 37/49] perf python: Port check-perf-trace " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 38/49] perf python: Port arm-cs-trace-disasm " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 39/49] perf python: Port powerpc-hcalls " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 40/49] perf python: Port intel-pt-events and libxed " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 41/49] perf test: Migrate Intel PT virtual LBR test to Python API Ian Rogers
2026-09-26  6:20       ` [PATCH v4 42/49] perf python: Port export-to-sqlite to perf module Ian Rogers
2026-09-26  6:20       ` [PATCH v4 43/49] perf python: Port export-to-postgresql " Ian Rogers
2026-09-26  6:20       ` [PATCH v4 44/49] perf python: Move and clean up exported-sql-viewer.py Ian Rogers
2026-09-26  6:20       ` [PATCH v4 45/49] perf python: Move and clean up parallel-perf.py Ian Rogers
2026-09-26  6:20       ` [PATCH v4 46/49] perf: Remove libpython support and legacy Python scripts Ian Rogers
2026-09-26 18:56         ` Arnaldo Carvalho de Melo
2026-09-26  6:20       ` [PATCH v4 47/49] perf Makefile: Update Python script installation path Ian Rogers
2026-09-26 19:05         ` Arnaldo Carvalho de Melo
2026-09-26  6:20       ` [PATCH v4 48/49] perf script: Support standalone scripts and remove embedded scripting Ian Rogers
2026-09-26 19:17         ` Arnaldo Carvalho de Melo
2026-09-26  6:20       ` [PATCH v4 49/49] perf Documentation: Update for standalone Python scripts Ian Rogers
2026-09-26 20:41       ` [PATCH v4 00/49] perf: Complete transition to " Arnaldo Carvalho de Melo
2026-09-26 22:46         ` Ian Rogers
2026-09-26 23:11           ` Ian Rogers

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=c7d189ad-8cd9-45b3-9cdd-72923aa5d5d9@linaro.org \
    --to=james.clark@linaro.org \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=alice.mei.rogers@gmail.com \
    --cc=dapeng1.mi@linux.intel.com \
    --cc=irogers@google.com \
    --cc=leo.yan@linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tmricht@linux.ibm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®