mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

The enhancements made to timerlat_load.py are intended to improve the script's exception handling. Summary of the changes: - Specific exceptions are now caught for CPU affinity and priority settings, with clearer error messages provided. - The timerlat file descriptor opening now includes handling for PermissionError and OSError, with informative messages. - In the infinite loop, generic exceptions have been replaced with specific types like KeyboardInterrupt and IOError, improving feedback. Before: $ sudo python timerlat_load.py 122 Error setting affinity After: $ sudo python timerlat_load.py 122 Error setting affinity: [Errno 22] Invalid argument Before: $ sudo python timerlat_load.py 1 -p 950 Error setting priority After: $ sudo python timerlat_load.py 1 -p 950 Error setting priority: [Errno 22] Invalid argument Before: $ python timerlat_load.py 1 Error opening timerlat fd, did you run timerlat -U? After: $ python timerlat_load.py 1 Permission denied. Please check your access rights. Cc: "lgoncalv@redhat.com" <lgoncalv@redhat.com> Cc: "jkacur@redhat.com" <jkacur@redhat.com> Link: https://lore.kernel.org/Q_k1s4hBtUy2px8ou0QKenjEK2_T_LoV8IxAE79aBakBogb-7uHp2fpET3oWtI1t3dy8uKjWeRzQOdKNzIzOOpyM4OjutJOriZ9TrGY6b-g=@protonmail.com Signed-off-by: Furkan Onder <furkanonder@protonmail.com> Reviewed-by: Tomas Glozar <tglozar@redhat.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
# Copyright (C) 2024 Red Hat, Inc. Daniel Bristot de Oliveira <bristot@kernel.org>
|
|
#
|
|
# This is a sample code about how to use timerlat's timer by any workload
|
|
# so rtla can measure and provide auto-analysis for the overall latency (IOW
|
|
# the response time) for a task.
|
|
#
|
|
# Before running it, you need to dispatch timerlat with -U option in a terminal.
|
|
# Then # run this script pinned to a CPU on another terminal. For example:
|
|
#
|
|
# timerlat_load.py 1 -p 95
|
|
#
|
|
# The "Timerlat IRQ" is the IRQ latency, The thread latency is the latency
|
|
# for the python process to get the CPU. The Ret from user Timer Latency is
|
|
# the overall latency. In other words, it is the response time for that
|
|
# activation.
|
|
#
|
|
# This is just an example, the load is reading 20MB of data from /dev/full
|
|
# It is in python because it is easy to read :-)
|
|
|
|
import argparse
|
|
import sys
|
|
import os
|
|
|
|
parser = argparse.ArgumentParser(description='user-space timerlat thread in Python')
|
|
parser.add_argument("cpu", type=int, help='CPU to run timerlat thread')
|
|
parser.add_argument("-p", "--prio", type=int, help='FIFO priority')
|
|
args = parser.parse_args()
|
|
|
|
try:
|
|
affinity_mask = {args.cpu}
|
|
os.sched_setaffinity(0, affinity_mask)
|
|
except Exception as e:
|
|
print(f"Error setting affinity: {e}")
|
|
sys.exit(1)
|
|
|
|
if args.prio:
|
|
try:
|
|
param = os.sched_param(args.prio)
|
|
os.sched_setscheduler(0, os.SCHED_FIFO, param)
|
|
except Exception as e:
|
|
print(f"Error setting priority: {e}")
|
|
sys.exit(1)
|
|
|
|
try:
|
|
timerlat_path = f"/sys/kernel/tracing/osnoise/per_cpu/cpu{args.cpu}/timerlat_fd"
|
|
timerlat_fd = open(timerlat_path, 'r')
|
|
except PermissionError:
|
|
print("Permission denied. Please check your access rights.")
|
|
sys.exit(1)
|
|
except OSError:
|
|
print("Error opening timerlat fd, did you run timerlat -U?")
|
|
sys.exit(1)
|
|
|
|
try:
|
|
data_fd = open("/dev/full", 'r')
|
|
except Exception as e:
|
|
print(f"Error opening data fd: {e}")
|
|
sys.exit(1)
|
|
|
|
while True:
|
|
try:
|
|
timerlat_fd.read(1)
|
|
data_fd.read(20 * 1024 * 1024)
|
|
except KeyboardInterrupt:
|
|
print("Leaving")
|
|
break
|
|
except IOError as e:
|
|
print(f"I/O error occurred: {e}")
|
|
break
|
|
except Exception as e:
|
|
print(f"Unexpected error: {e}")
|
|
break
|
|
|
|
timerlat_fd.close()
|
|
data_fd.close()
|