75 lines · python
1#!/usr/bin/env python32# SPDX-License-Identifier: GPL-2.0-only3#4# Copyright (C) 2024 Red Hat, Inc. Daniel Bristot de Oliveira <bristot@kernel.org>5#6# This is a sample code about how to use timerlat's timer by any workload7# so rtla can measure and provide auto-analysis for the overall latency (IOW8# the response time) for a task.9#10# Before running it, you need to dispatch timerlat with -U option in a terminal.11# Then # run this script pinned to a CPU on another terminal. For example:12#13# timerlat_load.py 1 -p 9514#15# The "Timerlat IRQ" is the IRQ latency, The thread latency is the latency16# for the python process to get the CPU. The Ret from user Timer Latency is17# the overall latency. In other words, it is the response time for that18# activation.19#20# This is just an example, the load is reading 20MB of data from /dev/full21# It is in python because it is easy to read :-)22 23import argparse24import sys25import os26 27parser = argparse.ArgumentParser(description='user-space timerlat thread in Python')28parser.add_argument("cpu", help='CPU to run timerlat thread')29parser.add_argument("-p", "--prio", help='FIFO priority')30 31args = parser.parse_args()32 33try:34 affinity_mask = { int(args.cpu) }35except:36 print("Invalid cpu: " + args.cpu)37 exit(1)38 39try:40 os.sched_setaffinity(0, affinity_mask);41except:42 print("Error setting affinity")43 exit(1)44 45if (args.prio):46 try:47 param = os.sched_param(int(args.prio))48 os.sched_setscheduler(0, os.SCHED_FIFO, param)49 except:50 print("Error setting priority")51 exit(1)52 53try:54 timerlat_path = "/sys/kernel/tracing/osnoise/per_cpu/cpu" + args.cpu + "/timerlat_fd"55 timerlat_fd = open(timerlat_path, 'r')56except:57 print("Error opening timerlat fd, did you run timerlat -U?")58 exit(1)59 60try:61 data_fd = open("/dev/full", 'r');62except:63 print("Error opening data fd")64 65while True:66 try:67 timerlat_fd.read(1)68 data_fd.read(20*1024*1024)69 except:70 print("Leaving")71 break72 73timerlat_fd.close()74data_fd.close()75