mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 21:02:43 +01:00
Add LiveSession class in tools/perf/python/perf_live.py to support live event collection using perf.evlist and perf.parse_events, avoiding the need to fork a separate perf record process. Signed-off-by: Ian Rogers <[email protected]> Assisted-by: Gemini:gemini-3.1-pro-preview Cc: Adrian Hunter <[email protected]> Cc: Alice Rogers <[email protected]> Cc: Dapeng Mi <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: James Clark <[email protected]> Cc: Leo Yan <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Thomas Richter <[email protected]> Signed-off-by: Arnaldo Carvalho de Melo <[email protected]> Signed-off-by: Namhyung Kim <[email protected]>
60 lines
2.0 KiB
Python
Executable File
60 lines
2.0 KiB
Python
Executable File
# SPDX-License-Identifier: GPL-2.0
|
|
"""
|
|
Live event session helper using perf.evlist.
|
|
|
|
This module provides a LiveSession class that allows running a callback
|
|
for each event collected live from the system, similar to perf.session
|
|
but without requiring a perf.data file.
|
|
"""
|
|
|
|
import perf
|
|
|
|
|
|
class LiveSession:
|
|
"""Represents a live event collection session."""
|
|
|
|
def __init__(self, event_string: str, sample_callback):
|
|
self.event_string = event_string
|
|
self.sample_callback = sample_callback
|
|
# Create a cpu map for all online CPUs
|
|
self.cpus = perf.cpu_map()
|
|
# Parse events and set maps
|
|
self.evlist = perf.parse_events(self.event_string, self.cpus)
|
|
self.evlist.config()
|
|
|
|
def run(self):
|
|
"""Run the live session."""
|
|
try:
|
|
self.evlist.open()
|
|
self.evlist.mmap()
|
|
self.evlist.enable()
|
|
|
|
while True:
|
|
# Poll for events with 100ms timeout
|
|
try:
|
|
self.evlist.poll(100)
|
|
except InterruptedError:
|
|
continue
|
|
for cpu in self.cpus:
|
|
for _ in range(1000): # Limit to 1000 events per CPU per poll to prevent starvation
|
|
try:
|
|
event = self.evlist.read_on_cpu(cpu)
|
|
except TypeError as e:
|
|
if "Unknown CPU" in str(e):
|
|
# CPU might be unmapped or offline, wait for mmap event
|
|
break
|
|
if "Unexpected header type" in str(e):
|
|
# Ignore valid but unsupported event types
|
|
continue
|
|
raise
|
|
|
|
if event is None:
|
|
break
|
|
|
|
if event.type == perf.RECORD_SAMPLE:
|
|
self.sample_callback(event)
|
|
except KeyboardInterrupt:
|
|
pass
|
|
finally:
|
|
self.evlist.close()
|