1#!/usr/bin/env python3 2# SPDX-License-Identifier: GPL-2.0-only 3# 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 workload 7# so rtla can measure and provide auto-analysis for the overall latency (IOW 8# 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 95 14# 15# The "Timerlat IRQ" is the IRQ latency, The thread latency is the latency 16# for the python process to get the CPU. The Ret from user Timer Latency is 17# the overall latency. In other words, it is the response time for that 18# activation. 19# 20# This is just an example, the load is reading 20MB of data from /dev/full 21# It is in python because it is easy to read :-) 22 23import argparse 24import sys 25import os 26 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 break 72 73timerlat_fd.close() 74data_fd.close() 75