[PATCH 3/3] rteval: Add AGENTS.md guide for AI coding assistants

John Kacur <[email protected]> Tue, 16 Jun 2026 12:30:15 -0400
Newsgroups org.kernel.vger.linux-rt-users
Message-ID <[email protected]>
Add comprehensive documentation for AI coding assistants working with
the rteval codebase. This file provides essential context including:

- Project overview and architecture
- Detailed directory structure with file descriptions
- Core components and their relationships
- Development guidelines and coding conventions
- Module structure for loads and measurements
- Build commands and installation methods
- Four types of tests (unit, e2e, manual, legacy)
- Common gotchas and potential pitfalls
- Git workflow and patch submission process
- Recent development focus areas

This documentation helps AI assistants understand the codebase structure,
follow project conventions, and contribute effectively to rteval development.

Assisted-by: Claude:claude-sonnet-4-5
Signed-off-by: John Kacur <[email protected]>
---
 AGENTS.md | 466 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 466 insertions(+)
 create mode 100644 AGENTS.md

diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 000000000000..9661987787b4
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,466 @@
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright 2026 John Kacur <[email protected]>
+
+# AGENTS.md - AI Coding Assistant Guide for rteval
+
+This document provides guidance for AI coding assistants working with the rteval codebase.
+
+## Project Overview
+
+**rteval** is a Python program for evaluating the performance of realtime Linux kernels on hardware platforms. It measures scheduling and timer latency under system load to assess platform suitability for real-time workloads.
+
+- **License**: GPL-2.0-or-later
+- **Language**: Python 3.8+
+- **Primary Maintainer**: John Kacur <[email protected]>
+- **Original Authors**: Clark Williams, David Sommerseth
+- **Repository**: https://git.kernel.org/pub/scm/utils/rteval/rteval.git
+
+## Architecture
+
+### Directory Structure
+
+```
+rteval/
+├── rteval-cmd                     # Main entry point (executable)
+├── rteval/                        # Core Python package
+│   ├── __init__.py               # Main RtEval class and orchestration
+│   ├── version.py                # Version information
+│   ├── rtevalConfig.py           # Configuration handling
+│   ├── rtevalReport.py           # Report generation
+│   ├── xmlout.py                 # XML output formatting
+│   ├── Log.py                    # Logging utilities
+│   ├── systopology.py            # System topology and CPU management
+│   ├── cpuset.py                 # CPU set management
+│   ├── cpusetmanager.py          # CPU set manager
+│   ├── cpulist_utils.py          # CPU list parsing utilities
+│   ├── cpupower.py               # CPU power state management
+│   ├── rteval_text.xsl           # XSLT template for text reports
+│   ├── rteval_dmi.xsl            # XSLT template for DMI information
+│   ├── rteval_histogram_raw.xsl  # XSLT template for raw histogram data
+│   ├── modules/                  # Plugin modules
+│   │   ├── __init__.py          # Module loading framework
+│   │   ├── loads/               # Load generators
+│   │   │   ├── kcompile.py     # Kernel compilation load
+│   │   │   ├── hackbench.py    # Hackbench scheduler stress
+│   │   │   └── stressng.py     # stress-ng workload
+│   │   └── measurement/         # Measurement tools
+│   │       ├── cyclictest.py   # cyclictest latency measurement
+│   │       ├── timerlat.py     # timerlat latency measurement
+│   │       └── sysstat.py      # System statistics collection
+│   └── sysinfo/                 # System information collection
+│       ├── __init__.py          # Main system info collector
+│       ├── cmdline.py           # Command line parsing
+│       ├── cputopology.py       # CPU topology detection
+│       ├── coresiblings.py      # CPU core sibling relationships
+│       ├── containercheck.py    # Container detection
+│       ├── dmi.py               # DMI/SMBIOS information
+│       ├── kernel.py            # Kernel information
+│       ├── memory.py            # Memory information
+│       ├── osinfo.py            # OS information
+│       ├── newnet.py            # Network information
+│       ├── services.py          # System services information
+│       ├── tools.py             # System tools utilities
+│       └── tuned.py             # Tuned profile information
+├── doc/                         # Documentation
+│   ├── rteval.8                 # Man page
+│   └── rteval-legacy.txt        # Legacy documentation
+├── loadsource/                  # Source tarballs for loads
+│   ├── linux-6.17.7.tar.xz     # Kernel source for kcompile
+│   └── dbench-4.0.tar.gz        # dbench source
+├── tests/                       # Test suite
+│   ├── e2e/                     # End-to-end tests (bash/TAP)
+│   └── unittest-legacy.py       # Legacy unit test runner
+├── setup.py                     # Legacy setuptools configuration
+├── pyproject.toml               # Modern Python project metadata
+├── Makefile                     # Build and test targets
+├── rteval.conf                  # Default configuration
+├── README                       # Main documentation
+├── README-tests                 # Testing documentation
+├── README-Dockerfile            # Docker container documentation
+├── Dockerfile                   # Container build definition
+├── COPYING                      # License file (GPL-2.0-or-later)
+└── MANIFEST.in                  # Python packaging manifest
+```
+
+### Core Components
+
+1. **Main Program** (`rteval-cmd`)
+   - Command-line interface and orchestration
+   - Configuration parsing and validation
+   - Report generation coordinator
+
+2. **Measurement Modules** (`rteval/modules/measurement/`)
+   - `cyclictest.py` - Legacy latency measurement using rt-tests
+   - `timerlat.py` - Modern latency measurement using rtla (recommended)
+   - `sysstat.py` - System statistics collection (sar, iostat, mpstat)
+
+3. **Load Modules** (`rteval/modules/loads/`)
+   - `kcompile.py` - Kernel compilation load
+   - `hackbench.py` - Scheduler stress test
+   - `stressng.py` - CPU/memory stress testing
+
+4. **System Information** (`rteval/sysinfo/`)
+   - DMI table reading
+   - CPU topology detection
+   - Kernel configuration
+   - Network interface enumeration
+   - Service status
+   - Container detection (`containercheck.py`)
+
+5. **Configuration** (`rteval/rtevalConfig.py`)
+   - INI-based configuration file parsing
+   - Command-line option integration
+
+6. **Reporting** (`rteval/rtevalReport.py`, `rteval/xmlout.py`)
+   - XML report generation with raw data
+   - XSLT transformation for text/HTML output
+   - Statistical analysis (min/max, stddev, histograms)
+
+7. **CPU Management**
+   - `rteval/cpulist_utils.py` - CPU list parsing and manipulation
+   - `rteval/systopology.py` - NUMA and CPU topology
+   - `rteval/cpuset.py` - Cpuset manipulation
+   - `rteval/cpupower.py` - CPU frequency management
+
+## Development Guidelines
+
+### Code Style
+
+- Follow PEP 8 Python style guidelines
+- Use 4-space indentation (no tabs)
+- Maximum line length: 100 characters (flexible for readability)
+- Use docstrings for modules, classes, and public methods
+- SPDX license identifier at top of each file: `# SPDX-License-Identifier: GPL-2.0-or-later`
+
+### Module Structure
+
+Measurement and load modules follow a plugin architecture:
+
+```python
+class ModuleName(rtevalModulePrototype):
+    def __init__(self, config, logger):
+        rtevalModulePrototype.__init__(self, 'modulename', config, logger)
+        # ... initialization
+
+    def _WorkloadSetup(self):
+        # Setup before execution
+
+    def _WorkloadBuild(self):
+        # Build/prepare workload
+
+    def _WorkloadPrepare(self):
+        # Final preparation before run
+
+    def _WorkloadTask(self):
+        # Main workload execution
+
+    def WorkloadAlive(self):
+        # Check if workload is running
+
+    def _WorkloadCleanup(self):
+        # Cleanup after execution
+
+    def MakeReport(self):
+        # Generate XML report node
+```
+
+### Error Handling
+
+- Use exceptions for error conditions
+- Log errors using `self._log(Log.DEBUG|INFO|WARN|ERR, message)`
+- Provide informative error messages
+- Clean up resources in `_WorkloadCleanup()` even on failure
+
+### Testing
+
+Run tests before submitting changes:
+
+```bash
+make test          # Unit tests
+make e2e-tests     # End-to-end tests (requires root)
+```
+
+End-to-end tests are located in `tests/` and use Perl's Test::Harness.
+
+### Container Detection
+
+rteval now detects container environments and warns users. Check `rteval/sysinfo/containercheck.py`:
+
+- Detects Docker, Podman, LXC, systemd-nspawn, Kubernetes
+- Warns that latency measurements may be unreliable in containers
+- Real-time measurements should be done on bare metal or proper RT virtualization
+
+## Common Tasks
+
+### Adding a New Load Module
+
+1. Create `rteval/modules/loads/newload.py`
+2. Inherit from `rtevalModulePrototype`
+3. Implement required methods (`_WorkloadSetup`, `_WorkloadTask`, etc.)
+4. Register in `rteval/modules/loads/__init__.py`
+5. Add documentation to module docstring
+6. Update README if adding new dependencies
+
+### Adding a New Measurement Module
+
+1. Create `rteval/modules/measurement/newmeasure.py`
+2. Inherit from `rtevalModulePrototype`
+3. Implement measurement-specific methods
+4. Parse output and generate statistics
+5. Implement `MakeReport()` to create XML report node with:
+   - Raw data
+   - Statistical summary (min, max, mean, stddev)
+   - Histogram if applicable
+
+### Modifying Report Output
+
+- XML structure: `rteval/rtevalReport.py`, `rteval/xmlout.py`
+- XSLT templates: `rteval/rteval_text.xsl`, `rteval/rteval_dmi.xsl`, etc.
+- Statistical calculations happen in measurement modules
+- Report assembly happens in `RtEval.Measure()` and `rtevalReport.py`
+
+### Working with CPU Lists
+
+Use `rteval/cpulist_utils.py` for CPU list manipulation:
+
+```python
+from rteval.cpulist_utils import CpuList, collapse_cpulist
+
+cpulist = CpuList("0-3,8-11")
+cpulist.append(16)
+result = collapse_cpulist(cpulist)  # "0-3,8-11,16"
+```
+
+### Handling Truncated Output
+
+Recent changes improved handling of truncated histogram output from cyclictest and timerlat. See commits:
+- `6b38190d2d66` - timerlat truncation handling
+- `3abdf7bf7b24` - cyclictest truncation handling
+
+When parsing external tool output, always handle incomplete/truncated data gracefully.
+
+## Key Files
+
+- `rteval-cmd` - Main entry point
+- `rteval/__init__.py` - Core RtEval class
+- `rteval/rtevalConfig.py` - Configuration management
+- `rteval/version.py` - Version information
+- `rteval.conf` - Default configuration file
+- `Makefile` - Build and installation
+- `setup.py` / `pyproject.toml` - Python packaging
+
+## Dependencies
+
+**Required**:
+- Python >= 3.8
+- python3-lxml - XML processing
+- python3-libxml2 - XML processing
+- sysstat - System performance tools
+- numactl, dmidecode, procps-ng
+
+**Measurement tools** (at least one):
+- rt-tests (for cyclictest)
+- rtla (for timerlat, requires kernel 5.15+ with CONFIG_OSNOISE_TRACER)
+
+**Load generation**:
+- gcc, make, binutils - For kcompile
+- stress-ng (optional)
+- hackbench (usually in rt-tests)
+
+## Build and Installation
+
+### Build Commands
+
+```bash
+# Run a quick test (10 seconds by default)
+make runit
+
+# Run with custom duration (in seconds)
+make runit D=60
+
+# Run unit tests
+make test
+# or
+make unittest
+
+# Run end-to-end tests (requires root, needs load source tarballs)
+sudo make e2e-tests
+
+# Install locally
+sudo make install
+
+# Create source tarball
+make tarfile
+
+# Generate ctags
+make tags
+
+# Test loads only (no measurements)
+make load
+
+# Run with SOS report generation
+make sysreport
+
+# RPM packaging
+make help  # See available targets
+```
+
+### Installation
+
+```bash
+# Install with pip (development mode)
+pip install -e .
+
+# Install with setup.py
+python3 setup.py install
+
+# Install via Makefile (preferred)
+sudo make install
+```
+
+## Testing
+
+### Four Types of Tests
+
+1. **Unit Tests** (`tests/` directory)
+   - Python unittest modules
+   - Run with: `make test` or `./run_tests.sh`
+   - Do not require root
+
+2. **End-to-End Tests** (`tests/e2e/`)
+   - Bash scripts producing TAP output
+   - Run with: `sudo make e2e-tests`
+   - Requires root and load source tarballs
+
+3. **Manual Test Targets**
+   - `make runit`: Quick test run (both loads and measurements)
+   - `make load`: Test loads only
+   - `make sysreport`: Run with SOS report generation
+
+4. **Legacy Unit Tests**
+   - Embedded in source files
+   - Run with: `sudo python3 tests/unittest-legacy.py`
+
+### Important Testing Notes
+
+- **Most tests require root privileges** (rteval needs root to set RT priorities and access hardware)
+- Load source tarballs must be present in `loadsource/` for full functionality
+- Current kernel source: `linux-6.17.7.tar.xz`
+
+## Debugging
+
+Enable debug logging:
+
+```bash
+rteval -d 3600 --debug
+```
+
+Log levels defined in `rteval/Log.py`:
+- `Log.DEBUG` - Verbose debugging
+- `Log.INFO` - Informational messages
+- `Log.WARN` - Warnings
+- `Log.ERR` - Errors
+
+## Configuration
+
+Configuration hierarchy (highest priority first):
+1. Command-line arguments
+2. User config file (`~/.rteval.conf`)
+3. System config file (`/etc/rteval.conf`)
+4. Default config (`rteval/rteval.conf`)
+
+Configuration uses Python's `configparser` module with INI format.
+
+## Real-time Considerations
+
+- rteval must run as root to set RT priorities
+- Measurement threads run with SCHED_FIFO priority
+- Load modules should NOT interfere with measurement threads
+- CPU isolation can be specified via `--isolcpus` or config file
+- Housekeeping CPUs separate load from measurement
+
+## Output Files
+
+Default output directory: `/usr/share/rteval/`
+
+Generated files:
+- `summary.xml` - Full XML report with raw data
+- `summary.xml.tar.bz2` - Compressed archive of results
+- Text summary (via XSLT transformation)
+
+## Related Projects
+
+- **rt-tests**: https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
+  - Includes cyclictest, hackbench, and other RT test tools
+- **rtla** (rtla/osnoise): Part of Linux kernel tools
+  - Modern latency measurement using kernel tracing
+
+## Support and Contact
+
+- Mailing list: [email protected]
+- Maintainer: John Kacur <[email protected]>
+- Bug reports: Via mailing list or kernel.org infrastructure
+
+## Git Workflow
+
+- **Main branch**: `main`
+- **Repository**: https://git.kernel.org/pub/scm/utils/rteval/rteval.git
+- **Patch submission**: Use standard git format-patch/send-email for contributions
+- **Mailing list**: Send patches to [email protected]
+
+### Development Workflow
+
+1. Make changes to code
+2. Run unit tests: `make test`
+3. Test manually: `sudo make runit D=10` (quick 10-second run)
+4. Run full e2e tests: `sudo make e2e-tests` (when available)
+5. Update documentation if needed
+6. Submit patches to mailing list or create pull request
+
+## Common Gotchas
+
+1. **Root Required**: rteval requires root privileges to run properly (RT scheduling, hardware access)
+2. **Load Sources**: Kernel compilation requires `loadsource/linux-*.tar.xz` to be present
+3. **CPU Isolation**: The tool validates CPU isolation and warns about housekeeping/measurement CPU conflicts
+4. **Core Sharing**: Recent work added validation for hyperthreading/SMT core sharing warnings
+5. **Module Loading**: Modules are discovered dynamically; add `module` in config to enable
+6. **XML Reports**: Reports use XSLT for transformation; edit .xsl files carefully
+7. **Version Management**: Version is in `rteval/version.py` and must be updated for releases
+8. **Container Detection**: rteval detects container environments (Docker, Podman, LXC, etc.) and warns that latency measurements may be unreliable
+
+## Additional Notes for AI Assistants
+
+1. **Python Version**: Target Python 3.8+ for compatibility with RHEL 8/9
+2. **XML Generation**: Use `lxml.etree` for XML, not stdlib xml module
+3. **Subprocess Handling**: Use `subprocess.Popen()` for external commands
+4. **Platform Support**: Code should work on x86_64, aarch64, ppc64le, s390x
+5. **Error Recovery**: Measurement failures should not crash entire program
+6. **Signal Handling**: rteval handles SIGINT/SIGTERM for graceful shutdown
+7. **Thread Safety**: Measurement modules run in separate threads
+8. **Resource Cleanup**: Always clean up temp files, processes, and system state changes
+
+## Recent Changes
+
+Check `git log` for recent commits. Notable recent development focus:
+
+**Container Detection:**
+- Added container detection and warnings (commits 329dbe89, 70171b29)
+- Detects Docker, Podman, LXC, systemd-nspawn, Kubernetes
+- Warns users that latency measurements may be unreliable in containers
+
+**Core Sharing Validation:**
+- Detection and warning when isolated CPUs share cores with non-isolated CPUs
+- Enhanced CPU sibling detection and topology mapping
+- New `--warn-non-isolated-core-sharing` option
+- XML report enhancements for core sharing warnings
+
+**Measurement Improvements:**
+- Improved truncated histogram handling for timerlat (commit 6b38190d)
+- Improved truncated histogram handling for cyclictest (commit 3abdf7bf)
+- Better error handling for incomplete measurement output
+
+---
+
+**Last Updated**: 2026-06-16
+**Document Version**: 1.0
-- 
2.54.0