#!/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", help='CPU to run timerlat thread')
parser.add_argument("-p", "--prio", help='FIFO priority')

args = parser.parse_args()

try:
    affinity_mask = { int(args.cpu) }
except:
    print("Invalid cpu: " + args.cpu)
    exit(1)

try:
    os.sched_setaffinity(0, affinity_mask);
except:
    print("Error setting affinity")
    exit(1)

if (args.prio):
    try:
        param = os.sched_param(int(args.prio))
        os.sched_setscheduler(0, os.SCHED_FIFO, param)
    except:
        print("Error setting priority")
        exit(1)

try:
    timerlat_path = "/sys/kernel/tracing/osnoise/per_cpu/cpu" + args.cpu + "/timerlat_fd"
    timerlat_fd = open(timerlat_path, 'r')
except:
    print("Error opening timerlat fd, did you run timerlat -U?")
    exit(1)

try:
    data_fd = open("/dev/full", 'r');
except:
    print("Error opening data fd")

while True:
    try:
        timerlat_fd.read(1)
        data_fd.read(20*1024*1024)
    except:
        print("Leaving")
        break

timerlat_fd.close()
data_fd.close()
