| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #!/usr/bin/env drgn
- # SPDX-License-Identifier: GPL-2.0
- # Copyright (C) 2025 Juri Lelli <juri.lelli@redhat.com>
- # Copyright (C) 2025 Red Hat, Inc.
- 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():
- # To store unique root domains found
- 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
- # Check if we've already processed this root domain to avoid duplicates
- # Use the memory address of the root_domain as a unique identifier
- 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}") # This CPU belongs to this root domain
- # Access and print relevant fields from struct root_domain
- 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()
|