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