desc = """
This is a drgn script to show the current root domains configuration. For more
info on drgn, visit https://github.com/osandov/drgn.
Root domains are only printed once, as multiple CPUs might be attached to the
same root domain.
"""
import os
import argparse
import drgn
from drgn import FaultError
from drgn.helpers.common import *
from drgn.helpers.linux import *
def print_root_domains_info():
seen_root_domains = set()
print("Retrieving (unique) Root Domain Information:")
runqueues = prog['runqueues']
def_root_domain = prog['def_root_domain']
for cpu_id in for_each_possible_cpu(prog):
try:
rq = per_cpu(runqueues, cpu_id)
root_domain = rq.rd
root_domain_cast = int(root_domain)
if root_domain_cast in seen_root_domains:
continue
seen_root_domains.add(root_domain_cast)
if root_domain_cast == int(def_root_domain.address_):
print(f"\n--- Root Domain @ def_root_domain ---")
else:
print(f"\n--- Root Domain @ 0x{root_domain_cast:x} ---")
print(f" From CPU: {cpu_id}")
print(f" Span : {cpumask_to_cpulist(root_domain.span[0])}")
print(f" Online : {cpumask_to_cpulist(root_domain.span[0])}")
except drgn.FaultError as fe:
print(f" (CPU {cpu_id}: Fault accessing kernel memory: {fe})")
except AttributeError as ae:
print(f" (CPU {cpu_id}: Missing attribute for root_domain (kernel struct change?): {ae})")
except Exception as e:
print(f" (CPU {cpu_id}: An unexpected error occurred: {e})")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description=desc,
formatter_class=argparse.RawTextHelpFormatter)
args = parser.parse_args()
print_root_domains_info()