tools/sched/root_domains_dump.py
Source file repositories/reference/linux-study-clean/tools/sched/root_domains_dump.py
File Facts
- System
- Linux kernel
- Corpus path
tools/sched/root_domains_dump.py- Extension
.py- Size
- 2378 bytes
- Lines
- 69
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: tools
- Status
- atlas-only
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
- No C-style include directives detected by the generator.
Detected Declarations
- No top-level syscall, struct, function, initcall, or export declaration detected by the generator.
Annotated Snippet
#!/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()
Annotation
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: atlas-only.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.