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