| #!/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() |