1*634c2406SJuri Lelli#!/usr/bin/env drgn 2*634c2406SJuri Lelli# SPDX-License-Identifier: GPL-2.0 3*634c2406SJuri Lelli# Copyright (C) 2025 Juri Lelli <juri.lelli@redhat.com> 4*634c2406SJuri Lelli# Copyright (C) 2025 Red Hat, Inc. 5*634c2406SJuri Lelli 6*634c2406SJuri Lellidesc = """ 7*634c2406SJuri LelliThis is a drgn script to show dl_rq bandwidth accounting information. For more 8*634c2406SJuri Lelliinfo on drgn, visit https://github.com/osandov/drgn. 9*634c2406SJuri Lelli 10*634c2406SJuri LelliOnly online CPUs are reported. 11*634c2406SJuri Lelli""" 12*634c2406SJuri Lelli 13*634c2406SJuri Lelliimport os 14*634c2406SJuri Lelliimport argparse 15*634c2406SJuri Lelli 16*634c2406SJuri Lelliimport drgn 17*634c2406SJuri Lellifrom drgn import FaultError 18*634c2406SJuri Lellifrom drgn.helpers.common import * 19*634c2406SJuri Lellifrom drgn.helpers.linux import * 20*634c2406SJuri Lelli 21*634c2406SJuri Lellidef print_dl_bws_info(): 22*634c2406SJuri Lelli 23*634c2406SJuri Lelli print("Retrieving dl_rq bandwidth accounting information:") 24*634c2406SJuri Lelli 25*634c2406SJuri Lelli runqueues = prog['runqueues'] 26*634c2406SJuri Lelli 27*634c2406SJuri Lelli for cpu_id in for_each_possible_cpu(prog): 28*634c2406SJuri Lelli try: 29*634c2406SJuri Lelli rq = per_cpu(runqueues, cpu_id) 30*634c2406SJuri Lelli 31*634c2406SJuri Lelli if rq.online == 0: 32*634c2406SJuri Lelli continue 33*634c2406SJuri Lelli 34*634c2406SJuri Lelli dl_rq = rq.dl 35*634c2406SJuri Lelli 36*634c2406SJuri Lelli print(f" From CPU: {cpu_id}") 37*634c2406SJuri Lelli 38*634c2406SJuri Lelli # Access and print relevant fields from struct dl_rq 39*634c2406SJuri Lelli print(f" running_bw : {dl_rq.running_bw}") 40*634c2406SJuri Lelli print(f" this_bw : {dl_rq.this_bw}") 41*634c2406SJuri Lelli print(f" extra_bw : {dl_rq.extra_bw}") 42*634c2406SJuri Lelli print(f" max_bw : {dl_rq.max_bw}") 43*634c2406SJuri Lelli print(f" bw_ratio : {dl_rq.bw_ratio}") 44*634c2406SJuri Lelli 45*634c2406SJuri Lelli except drgn.FaultError as fe: 46*634c2406SJuri Lelli print(f" (CPU {cpu_id}: Fault accessing kernel memory: {fe})") 47*634c2406SJuri Lelli except AttributeError as ae: 48*634c2406SJuri Lelli print(f" (CPU {cpu_id}: Missing attribute for root_domain (kernel struct change?): {ae})") 49*634c2406SJuri Lelli except Exception as e: 50*634c2406SJuri Lelli print(f" (CPU {cpu_id}: An unexpected error occurred: {e})") 51*634c2406SJuri Lelli 52*634c2406SJuri Lelliif __name__ == "__main__": 53*634c2406SJuri Lelli parser = argparse.ArgumentParser(description=desc, 54*634c2406SJuri Lelli formatter_class=argparse.RawTextHelpFormatter) 55*634c2406SJuri Lelli args = parser.parse_args() 56*634c2406SJuri Lelli 57*634c2406SJuri Lelli print_dl_bws_info() 58