mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Add Python type stubs for the perf module to improve IDE support and static analysis. Includes docstrings for classes, methods, and constants derived from C source and JSON definitions. Assisted-by: Gemini:gemini-3.1-pro-preview Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alice Rogers <alice.mei.rogers@gmail.com> Cc: Dapeng Mi <dapeng1.mi@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@linaro.org> Cc: Leo Yan <leo.yan@linux.dev> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Richter <tmricht@linux.ibm.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
673 lines
16 KiB
Python
673 lines
16 KiB
Python
"""Type stubs for the perf Python module."""
|
|
from typing import Callable, Dict, List, Optional, Any, Iterator
|
|
|
|
def config_get(name: str) -> Optional[str]:
|
|
"""Get a configuration value from perf config.
|
|
|
|
Args:
|
|
name: The configuration variable name (e.g., 'colors.top').
|
|
|
|
Returns:
|
|
The configuration value as a string, or None if not set.
|
|
"""
|
|
...
|
|
|
|
def metrics() -> List[Dict[str, str]]:
|
|
"""Get a list of available metrics.
|
|
|
|
Returns:
|
|
A list of dictionaries, each describing a metric.
|
|
"""
|
|
...
|
|
|
|
def syscall_name(id: int, *, elf_machine: Optional[int] = None) -> str:
|
|
"""Convert a syscall number to its name.
|
|
|
|
Args:
|
|
sc_id: The syscall number.
|
|
elf_machine: Optional ELF machine type.
|
|
|
|
Returns:
|
|
The name of the syscall.
|
|
"""
|
|
...
|
|
|
|
def syscall_id(name: str, *, elf_machine: Optional[int] = None) -> int:
|
|
"""Convert a syscall name to its number.
|
|
|
|
Args:
|
|
name: The syscall name.
|
|
elf_machine: Optional ELF machine type.
|
|
|
|
Returns:
|
|
The number of the syscall.
|
|
"""
|
|
...
|
|
|
|
def parse_events(
|
|
event_string: str,
|
|
cpus: Optional[cpu_map] = None,
|
|
threads: Optional['thread_map'] = None
|
|
) -> 'evlist':
|
|
"""Parse an event string and return an evlist.
|
|
|
|
Args:
|
|
event_string: The event string (e.g., 'cycles,instructions').
|
|
cpus: Optional CPU map to bind events to.
|
|
threads: Optional thread map to bind events to.
|
|
|
|
Returns:
|
|
An evlist containing the parsed events.
|
|
"""
|
|
...
|
|
|
|
def parse_metrics(
|
|
metrics_string: str,
|
|
pmu: Optional[str] = None,
|
|
cpus: Optional[cpu_map] = None,
|
|
threads: Optional['thread_map'] = None
|
|
) -> 'evlist':
|
|
"""Parse a string of metrics or metric groups and return an evlist."""
|
|
...
|
|
|
|
def tracepoint(sys: str, name: str) -> int:
|
|
"""Returns the tracepoint ID for a given system and name."""
|
|
...
|
|
|
|
def pmus() -> Iterator[Any]:
|
|
"""Returns a sequence of pmus."""
|
|
...
|
|
|
|
class data:
|
|
"""Represents a perf data file."""
|
|
def __init__(self, path: str = ..., fd: int = ...) -> None: ...
|
|
|
|
class thread:
|
|
"""Represents a thread in the system."""
|
|
def comm(self) -> str:
|
|
"""Get the command name of the thread."""
|
|
...
|
|
pid: int
|
|
tid: int
|
|
ppid: int
|
|
cpu: int
|
|
|
|
class counts_values:
|
|
"""Raw counter values."""
|
|
id: int
|
|
val: int
|
|
ena: int
|
|
run: int
|
|
lost: int
|
|
values: List[int]
|
|
|
|
class thread_map:
|
|
"""Map of threads being monitored."""
|
|
def __init__(self, pid: int = -1, tid: int = -1) -> None:
|
|
"""Initialize a thread map.
|
|
|
|
Args:
|
|
pid: Process ID to monitor (-1 for all).
|
|
tid: Thread ID to monitor (-1 for all).
|
|
"""
|
|
...
|
|
def __len__(self) -> int: ...
|
|
def __getitem__(self, index: int) -> int: ...
|
|
def __iter__(self) -> Iterator[int]: ...
|
|
|
|
class evsel:
|
|
"""Event selector, represents a single event being monitored."""
|
|
def __init__(
|
|
self,
|
|
type: int = ...,
|
|
config: int = ...,
|
|
sample_freq: int = ...,
|
|
sample_period: int = ...,
|
|
sample_type: int = ...,
|
|
read_format: int = ...,
|
|
disabled: bool = ...,
|
|
inherit: bool = ...,
|
|
pinned: bool = ...,
|
|
exclusive: bool = ...,
|
|
exclude_user: bool = ...,
|
|
exclude_kernel: bool = ...,
|
|
exclude_hv: bool = ...,
|
|
exclude_idle: bool = ...,
|
|
mmap: bool = ...,
|
|
context_switch: bool = ...,
|
|
comm: bool = ...,
|
|
freq: bool = ...,
|
|
inherit_stat: bool = ...,
|
|
enable_on_exec: bool = ...,
|
|
task: bool = ...,
|
|
watermark: int = ...,
|
|
precise_ip: int = ...,
|
|
mmap_data: bool = ...,
|
|
sample_id_all: bool = ...,
|
|
wakeup_events: int = ...,
|
|
bp_type: int = ...,
|
|
bp_addr: int = ...,
|
|
bp_len: int = ...,
|
|
idx: int = ...,
|
|
) -> None: ...
|
|
def __str__(self) -> str:
|
|
"""Return string representation of the event."""
|
|
...
|
|
def open(self) -> None:
|
|
"""Open the event selector file descriptor table."""
|
|
...
|
|
def read(self, cpu: int, thread: int) -> counts_values:
|
|
"""Read counter values for a specific CPU and thread."""
|
|
...
|
|
ids: List[int]
|
|
def cpus(self) -> cpu_map:
|
|
"""Get CPU map for this event."""
|
|
...
|
|
def threads(self) -> thread_map:
|
|
"""Get thread map for this event."""
|
|
...
|
|
tracking: bool
|
|
config: int
|
|
read_format: int
|
|
sample_period: int
|
|
sample_type: int
|
|
size: int
|
|
type: int
|
|
wakeup_events: int
|
|
|
|
|
|
class _sample_members:
|
|
sample_pid: int
|
|
sample_tid: int
|
|
sample_time: int
|
|
sample_id: int
|
|
sample_stream_id: int
|
|
sample_period: int
|
|
sample_cpu: int
|
|
|
|
class sample_event(_sample_members):
|
|
"""Represents a sample event from perf."""
|
|
evsel: evsel
|
|
sample_ip: int
|
|
sample_addr: int
|
|
sample_phys_addr: int
|
|
sample_weight: int
|
|
sample_data_src: int
|
|
sample_insn_count: int
|
|
sample_cyc_count: int
|
|
type: int
|
|
raw_buf: bytes
|
|
dso: str
|
|
dso_long_name: str
|
|
dso_bid: Optional[bytes]
|
|
map_start: int
|
|
map_end: int
|
|
map_pgoff: int
|
|
symbol: str
|
|
sym_start: int
|
|
sym_end: int
|
|
brstack: Optional['branch_stack']
|
|
callchain: Optional['callchain']
|
|
def srccode(self) -> str: ...
|
|
def insn(self) -> str: ...
|
|
def __getattr__(self, name: str) -> Any: ...
|
|
|
|
class mmap_event(_sample_members):
|
|
"""Represents a mmap event from perf."""
|
|
type: int
|
|
misc: int
|
|
pid: int
|
|
tid: int
|
|
start: int
|
|
len: int
|
|
pgoff: int
|
|
filename: str
|
|
evsel: Optional['evsel']
|
|
|
|
class mmap2_event(_sample_members):
|
|
"""Represents a mmap2 event from perf."""
|
|
type: int
|
|
misc: int
|
|
pid: int
|
|
tid: int
|
|
start: int
|
|
len: int
|
|
pgoff: int
|
|
prot: int
|
|
flags: int
|
|
filename: str
|
|
maj: Optional[int]
|
|
min: Optional[int]
|
|
ino: Optional[int]
|
|
ino_generation: Optional[int]
|
|
build_id: Optional[bytes]
|
|
evsel: Optional['evsel']
|
|
|
|
class lost_event(_sample_members):
|
|
"""Represents a lost events record."""
|
|
type: int
|
|
id: int
|
|
lost: int
|
|
evsel: Optional['evsel']
|
|
|
|
class comm_event(_sample_members):
|
|
"""Represents a COMM record."""
|
|
type: int
|
|
pid: int
|
|
tid: int
|
|
comm: str
|
|
evsel: Optional['evsel']
|
|
|
|
class task_event(_sample_members):
|
|
"""Represents an EXIT or FORK record."""
|
|
type: int
|
|
pid: int
|
|
ppid: int
|
|
tid: int
|
|
ptid: int
|
|
time: int
|
|
evsel: Optional['evsel']
|
|
|
|
class throttle_event(_sample_members):
|
|
"""Represents a THROTTLE or UNTHROTTLE record."""
|
|
type: int
|
|
time: int
|
|
id: int
|
|
stream_id: int
|
|
evsel: Optional['evsel']
|
|
|
|
class read_event(_sample_members):
|
|
"""Represents a READ record."""
|
|
type: int
|
|
pid: int
|
|
tid: int
|
|
evsel: Optional['evsel']
|
|
|
|
class switch_event(_sample_members):
|
|
"""Represents a SWITCH or SWITCH_CPU_WIDE record."""
|
|
type: int
|
|
next_prev_pid: int
|
|
next_prev_tid: int
|
|
evsel: Optional['evsel']
|
|
|
|
class branch_entry:
|
|
"""Represents a branch entry in the branch stack.
|
|
|
|
Attributes:
|
|
from_ip: Source address of the branch (corresponds to 'from' keyword in C).
|
|
to_ip: Destination address of the branch.
|
|
mispred: True if the branch was mispredicted.
|
|
predicted: True if the branch was predicted.
|
|
in_tx: True if the branch was in a transaction.
|
|
abort: True if the branch was an abort.
|
|
cycles: Number of cycles since the last branch.
|
|
type: Type of branch.
|
|
"""
|
|
from_ip: int
|
|
to_ip: int
|
|
mispred: bool
|
|
predicted: bool
|
|
in_tx: bool
|
|
abort: bool
|
|
cycles: int
|
|
type: int
|
|
|
|
class branch_stack:
|
|
"""Sequence of branch entries in the branch stack."""
|
|
def __len__(self) -> int: ...
|
|
def __getitem__(self, index: int) -> branch_entry: ...
|
|
|
|
class callchain_node:
|
|
"""Represents a frame in the callchain."""
|
|
ip: int
|
|
symbol: Optional[str]
|
|
dso: Optional[str]
|
|
|
|
class callchain:
|
|
"""Sequence of callchain frames."""
|
|
def __len__(self) -> int: ...
|
|
def __getitem__(self, index: int) -> callchain_node: ...
|
|
|
|
class stat_event(_sample_members):
|
|
"""Represents a stat event from perf."""
|
|
type: int
|
|
id: int
|
|
cpu: int
|
|
thread: int
|
|
val: int
|
|
ena: int
|
|
run: int
|
|
evsel: Optional['evsel']
|
|
|
|
class stat_round_event(_sample_members):
|
|
"""Represents a stat round event from perf."""
|
|
type: int
|
|
time: int
|
|
stat_round_type: int
|
|
evsel: Optional['evsel']
|
|
|
|
class cpu_map:
|
|
"""Map of CPUs being monitored."""
|
|
def __init__(self, cpustr: Optional[str] = None) -> None: ...
|
|
def __len__(self) -> int: ...
|
|
def __getitem__(self, index: int) -> int: ...
|
|
def __iter__(self) -> Iterator[int]: ...
|
|
|
|
|
|
class evlist:
|
|
def __init__(self, cpus: cpu_map, threads: thread_map) -> None: ...
|
|
def open(self) -> None:
|
|
"""Open the events in the list."""
|
|
...
|
|
def close(self) -> None:
|
|
"""Close the events in the list."""
|
|
...
|
|
def mmap(self) -> None:
|
|
"""Memory map the event buffers."""
|
|
...
|
|
def poll(self, timeout: int) -> int:
|
|
"""Poll for events.
|
|
|
|
Args:
|
|
timeout: Timeout in milliseconds.
|
|
|
|
Returns:
|
|
Number of events ready.
|
|
"""
|
|
...
|
|
def read_on_cpu(self, cpu: int) -> Optional[Any]:
|
|
"""Read a sample event from a specific CPU.
|
|
|
|
Args:
|
|
cpu: The CPU number.
|
|
|
|
Returns:
|
|
A sample_event or other event type if available, or None.
|
|
"""
|
|
...
|
|
def all_cpus(self) -> cpu_map:
|
|
"""Get a cpu_map of all CPUs in the system."""
|
|
...
|
|
def metrics(self) -> List[str]:
|
|
"""Get a list of metric names within the evlist."""
|
|
...
|
|
def compute_metric(self, metric: str, cpu: int, thread: int) -> float:
|
|
"""Compute metric for given name, cpu and thread.
|
|
|
|
Args:
|
|
metric: The metric name.
|
|
cpu: The CPU number.
|
|
thread: The thread ID.
|
|
|
|
Returns:
|
|
The computed metric value.
|
|
"""
|
|
...
|
|
def config(self) -> None:
|
|
"""Configure the events in the list."""
|
|
...
|
|
def disable(self) -> None:
|
|
"""Disable all events in the list."""
|
|
...
|
|
def enable(self) -> None:
|
|
"""Enable all events in the list."""
|
|
...
|
|
def get_pollfd(self) -> List[int]:
|
|
"""Get a list of file descriptors for polling."""
|
|
...
|
|
def add(self, evsel: evsel) -> int:
|
|
"""Add an event to the list."""
|
|
...
|
|
def __iter__(self) -> Iterator[evsel]:
|
|
"""Iterate over the events (evsel) in the list."""
|
|
...
|
|
|
|
|
|
class session:
|
|
def __init__(
|
|
self,
|
|
data: data,
|
|
sample: Optional[Callable[[sample_event], None]] = None,
|
|
stat: Optional[Callable[[Any, Optional[str]], None]] = None
|
|
) -> None:
|
|
"""Initialize a perf session.
|
|
|
|
Args:
|
|
data: The perf data file to read.
|
|
sample: Callback for sample events.
|
|
stat: Callback for stat events.
|
|
"""
|
|
...
|
|
def process_events(self) -> None:
|
|
"""Process all events in the session."""
|
|
...
|
|
def find_thread(self, pid: int) -> thread:
|
|
"""Returns the thread associated with a pid."""
|
|
...
|
|
|
|
# Event Types
|
|
TYPE_HARDWARE: int
|
|
"""Hardware event."""
|
|
|
|
TYPE_SOFTWARE: int
|
|
"""Software event."""
|
|
|
|
TYPE_TRACEPOINT: int
|
|
"""Tracepoint event."""
|
|
|
|
TYPE_HW_CACHE: int
|
|
"""Hardware cache event."""
|
|
|
|
TYPE_RAW: int
|
|
"""Raw hardware event."""
|
|
|
|
TYPE_BREAKPOINT: int
|
|
"""Breakpoint event."""
|
|
|
|
|
|
# Hardware Counters
|
|
COUNT_HW_CPU_CYCLES: int
|
|
"""Total cycles. Be wary of what happens during CPU frequency scaling."""
|
|
|
|
COUNT_HW_INSTRUCTIONS: int
|
|
"""Retired instructions. Be careful, these can be affected by various issues,
|
|
most notably hardware interrupt counts."""
|
|
|
|
COUNT_HW_CACHE_REFERENCES: int
|
|
"""Cache accesses. Usually this indicates Last Level Cache accesses but this
|
|
may vary depending on your CPU."""
|
|
|
|
COUNT_HW_CACHE_MISSES: int
|
|
"""Cache misses. Usually this indicates Last Level Cache misses."""
|
|
|
|
COUNT_HW_BRANCH_INSTRUCTIONS: int
|
|
"""Retired branch instructions."""
|
|
|
|
COUNT_HW_BRANCH_MISSES: int
|
|
"""Mispredicted branch instructions."""
|
|
|
|
COUNT_HW_BUS_CYCLES: int
|
|
"""Bus cycles, which can be different from total cycles."""
|
|
|
|
COUNT_HW_STALLED_CYCLES_FRONTEND: int
|
|
"""Stalled cycles during issue [This event is an alias of idle-cycles-frontend]."""
|
|
|
|
COUNT_HW_STALLED_CYCLES_BACKEND: int
|
|
"""Stalled cycles during retirement [This event is an alias of idle-cycles-backend]."""
|
|
|
|
COUNT_HW_REF_CPU_CYCLES: int
|
|
"""Total cycles; not affected by CPU frequency scaling."""
|
|
|
|
|
|
# Cache Counters
|
|
COUNT_HW_CACHE_L1D: int
|
|
"""Level 1 data cache."""
|
|
|
|
COUNT_HW_CACHE_L1I: int
|
|
"""Level 1 instruction cache."""
|
|
|
|
COUNT_HW_CACHE_LL: int
|
|
"""Last Level Cache."""
|
|
|
|
COUNT_HW_CACHE_DTLB: int
|
|
"""Data TLB."""
|
|
|
|
COUNT_HW_CACHE_ITLB: int
|
|
"""Instruction TLB."""
|
|
|
|
COUNT_HW_CACHE_BPU: int
|
|
"""Branch Processing Unit."""
|
|
|
|
COUNT_HW_CACHE_OP_READ: int
|
|
"""Read accesses."""
|
|
|
|
COUNT_HW_CACHE_OP_WRITE: int
|
|
"""Write accesses."""
|
|
|
|
COUNT_HW_CACHE_OP_PREFETCH: int
|
|
"""Prefetch accesses."""
|
|
|
|
COUNT_HW_CACHE_RESULT_ACCESS: int
|
|
"""Accesses."""
|
|
|
|
COUNT_HW_CACHE_RESULT_MISS: int
|
|
"""Misses."""
|
|
|
|
|
|
# Software Counters
|
|
COUNT_SW_CPU_CLOCK: int
|
|
"""CPU clock event."""
|
|
|
|
COUNT_SW_TASK_CLOCK: int
|
|
"""Task clock event."""
|
|
|
|
COUNT_SW_PAGE_FAULTS: int
|
|
"""Page faults."""
|
|
|
|
COUNT_SW_CONTEXT_SWITCHES: int
|
|
"""Context switches."""
|
|
|
|
COUNT_SW_CPU_MIGRATIONS: int
|
|
"""CPU migrations."""
|
|
|
|
COUNT_SW_PAGE_FAULTS_MIN: int
|
|
"""Minor page faults."""
|
|
|
|
COUNT_SW_PAGE_FAULTS_MAJ: int
|
|
"""Major page faults."""
|
|
|
|
COUNT_SW_ALIGNMENT_FAULTS: int
|
|
"""Alignment faults."""
|
|
|
|
COUNT_SW_EMULATION_FAULTS: int
|
|
"""Emulation faults."""
|
|
|
|
COUNT_SW_DUMMY: int
|
|
"""Dummy event."""
|
|
|
|
|
|
# Sample Fields
|
|
SAMPLE_IP: int
|
|
"""Instruction pointer."""
|
|
|
|
SAMPLE_TID: int
|
|
"""Process and thread ID."""
|
|
|
|
SAMPLE_TIME: int
|
|
"""Timestamp."""
|
|
|
|
SAMPLE_ADDR: int
|
|
"""Sampled address."""
|
|
|
|
SAMPLE_READ: int
|
|
"""Read barcode."""
|
|
|
|
SAMPLE_CALLCHAIN: int
|
|
"""Call chain."""
|
|
|
|
SAMPLE_ID: int
|
|
"""Unique ID."""
|
|
|
|
SAMPLE_CPU: int
|
|
"""CPU number."""
|
|
|
|
SAMPLE_PERIOD: int
|
|
"""Sample period."""
|
|
|
|
SAMPLE_STREAM_ID: int
|
|
"""Stream ID."""
|
|
|
|
SAMPLE_RAW: int
|
|
"""Raw sample."""
|
|
|
|
|
|
# Format Fields
|
|
FORMAT_TOTAL_TIME_ENABLED: int
|
|
"""Total time enabled."""
|
|
|
|
FORMAT_TOTAL_TIME_RUNNING: int
|
|
"""Total time running."""
|
|
|
|
FORMAT_ID: int
|
|
"""Event ID."""
|
|
|
|
FORMAT_GROUP: int
|
|
"""Event group."""
|
|
|
|
|
|
# Record Types
|
|
RECORD_MMAP: int
|
|
"""MMAP record. Contains header, pid, tid, addr, len, pgoff, filename, and sample_id."""
|
|
|
|
RECORD_LOST: int
|
|
"""Lost events record. Contains header, id, lost count, and sample_id."""
|
|
|
|
RECORD_COMM: int
|
|
"""COMM record. Contains header, pid, tid, comm, and sample_id."""
|
|
|
|
RECORD_EXIT: int
|
|
"""EXIT record. Contains header, pid, ppid, tid, ptid, time, and sample_id."""
|
|
|
|
RECORD_THROTTLE: int
|
|
"""THROTTLE record. Contains header, time, id, stream_id, and sample_id."""
|
|
|
|
RECORD_UNTHROTTLE: int
|
|
"""UNTHROTTLE record. Contains header, time, id, stream_id, and sample_id."""
|
|
|
|
RECORD_FORK: int
|
|
"""FORK record. Contains header, pid, ppid, tid, ptid, time, and sample_id."""
|
|
|
|
RECORD_READ: int
|
|
"""READ record. Contains header, and read values."""
|
|
|
|
RECORD_SAMPLE: int
|
|
"""SAMPLE record. Contains header, and sample data requested by sample_type."""
|
|
|
|
RECORD_MMAP2: int
|
|
"""MMAP2 record. Contains header, pid, tid, addr, len, pgoff, maj, min, ino,
|
|
ino_generation, prot, flags, filename, and sample_id."""
|
|
|
|
RECORD_AUX: int
|
|
"""AUX record. Contains header, aux_offset, aux_size, flags, and sample_id."""
|
|
|
|
RECORD_ITRACE_START: int
|
|
"""ITRACE_START record. Contains header, pid, tid, and sample_id."""
|
|
|
|
RECORD_LOST_SAMPLES: int
|
|
"""LOST_SAMPLES record. Contains header, lost count, and sample_id."""
|
|
|
|
RECORD_SWITCH: int
|
|
"""SWITCH record. Contains header, and sample_id."""
|
|
|
|
RECORD_SWITCH_CPU_WIDE: int
|
|
"""SWITCH_CPU_WIDE record. Contains header, and sample_id."""
|
|
|
|
RECORD_STAT: int
|
|
"""STAT record."""
|
|
|
|
RECORD_STAT_ROUND: int
|
|
"""STAT_ROUND record."""
|
|
|
|
RECORD_MISC_SWITCH_OUT: int
|
|
"""MISC_SWITCH_OUT record."""
|