| .. SPDX-License-Identifier: GPL-2.0 |
| |
| ============================== |
| Real-Time Kernel configuration |
| ============================== |
| |
| .. contents:: Table of Contents |
| :depth: 3 |
| :local: |
| |
| Introduction |
| ============ |
| |
| This document lists the kernel configuration options that might affect a |
| real-time kernel's worst-case latency. It is intended for system integrators. |
| |
| Configuration options |
| ===================== |
| |
| .. Please keep the configuration listings alphabetically ordered |
| |
| CPU frequency governors |
| ----------------------- |
| |
| ``CONFIG_CPU_FREQ`` |
| ^^^^^^^^^^^^^^^^^^^ |
| |
| :Expectation: enabled |
| :Severity: *high* |
| |
| The CPU frequency scaling subsystem ensures that the processor can operate at |
| its maximum supported frequency. While, in general, bootloaders are tasked |
| with setting the CPU clock to the highest speed on boot, some do not. It is |
| thus desirable to keep this option enabled. |
| |
| .. caution:: |
| |
| A real-time kernel is not about being "as fast as possible", however |
| real-time requirements may demand that the CPU is clocked at a particular |
| speed. |
| |
| ``CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE`` |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| :Expectation: enabled |
| :Severity: *high* |
| |
| Real-Time workloads expect a fixed CPU frequency during execution. Using the |
| performance governor is an easy way to achieve that purely from kernel |
| configuration. |
| |
| This is not an absolute rule. Some setups might prefer to clock the CPU to |
| lower speeds due to thermal packaging or other requirements. The key is that |
| the CPU frequency remains constant once set. |
| |
| Non-performance CPU frequency governors |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| :Expectation: disabled |
| :Severity: *medium* |
| |
| To ensure reproducible system latency measurements, disable the |
| non-``PERFORMANCE`` CPU frequency governors whenever possible. This avoids |
| the risk of unknown userspace tasks implicitly or explicitly setting a |
| different CPU frequency governor, and thereby changing latency behavior while |
| the system is running. |
| |
| If disabling other frequency governors is not an option, use a governor that |
| keeps the CPU frequency fixed. For example, |
| ``CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE`` can be enabled when userspace is |
| responsible for setting a *stable* frequency during system initialization. |
| |
| If a low CPU frequency is desired, then |
| ``CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE`` can be set. |
| |
| The ``ONDEMAND`` governor should not be enabled on a real-time system. Its |
| frequency changes depend on workload behavior and can significantly harm |
| determinism. |
| |
| For more information, see Documentation/admin-guide/pm/cpufreq.rst |
| |
| ``CONFIG_CPU_IDLE`` |
| ------------------- |
| |
| :Expectation: enabled |
| :Severity: *info* |
| |
| CPU idle states (C-states) allow the processor to enter low-power modes during |
| periods of inactivity. Very-low CPU idle states may require flushing the CPU |
| caches and lowering or disabling the clocking. This can lower power |
| consumption, but it also increases the entry and exit latency from such |
| states. |
| |
| While disabling this option eliminates cpuidle-related latencies, doing so can |
| significantly impact hardware longevity, warranty, and thermal behavior. |
| Users should cap the maximum C-state to C1 instead. For ACPI platforms, this |
| can be achieved by using the boot parameter [1]_:: |
| |
| processor.max_cstate=1 |
| |
| Higher C-states can be acceptable depending on the user workload's latency |
| requirements. For ACPI-based platforms, use the ``cpupower idle-info`` |
| command to inspect the available idle states. |
| |
| For more information, please see: |
| |
| - ``linux/tools/power/cpupower`` |
| - Documentation/admin-guide/pm/cpuidle.rst |
| - Documentation/admin-guide/pm/index.rst |
| |
| ``CONFIG_DRM`` |
| -------------- |
| |
| :Expectation: disabled |
| :Severity: *info* |
| |
| GPU-accelerated workloads can share system resources with the CPU, including |
| last-level cache (LLC) and memory bandwidth. Modern integrated GPUs optimize |
| graphics performance at the expense of CPU determinism. |
| |
| Examples of affected platforms: |
| |
| - Intel processors with integrated graphics (Gen9 and later) |
| - AMD APUs with Radeon Graphics |
| - Xilinx Zynq UltraScale+ MPSoC EG/EV series |
| |
| If graphics workloads must run alongside real-time tasks, users must conduct |
| thorough stress testing using tools like ``glmark2`` while measuring the |
| overall system latency. |
| |
| For more information, please check: |
| |
| - Documentation/core-api/real-time/hardware.rst ("Regarding hardware" section) |
| - Documentation/filesystems/resctrl.rst |
| - `Real-Time and Graphics: A Contradiction? <https://web.archive.org/web/20221025085614/https://linutronix.de/PDF/Realtime_and_graphics-acontradiction2021.pdf>`_ |
| |
| ``CONFIG_EFI_DISABLE_RUNTIME`` |
| ------------------------------ |
| |
| :Expectation: enabled |
| :Severity: *medium* |
| |
| EFI is the standard boot and firmware interface for multiple architectures. |
| EFI runtime services provide callback functions to be called from the kernel; |
| e.g., as utilized by (``CONFIG_EFI_VARS*``) or (``CONFIG_RTC_DRV_EFI``). For |
| the former, the kernel calls into EFI to update the EFI variables. |
| |
| Calling into EFI means invoking firmware callbacks. During such invocations, |
| the system might not be able to react to interrupts and will thus not be able |
| to perform a context switch. This can cause significant latency spikes for |
| the real-time system. |
| |
| ``CONFIG_PREEMPT_RT`` enables this option by default. If this option is |
| manually disabled at build time, the following boot parameter [1]_ may be used |
| to disable EFI runtime at boot up:: |
| |
| efi=noruntime |
| |
| Alternatively, confine EFI runtime service calls to a housekeeping CPU by |
| restricting the ``efi_runtime`` workqueue CPU affinity. For example, set that |
| workqueue's affinity to CPU #0 and pin your RT tasks to a different CPU range. |
| See Documentation/core-api/workqueue.rst |
| |
| ``CONFIG_NO_HZ`` / ``CONFIG_NO_HZ_FULL`` |
| ---------------------------------------- |
| |
| :Expectation: disabled |
| :Severity: *medium* |
| |
| Tickless operation can increase kernel-to-userspace transition latency due to |
| the extra accounting and state book-keeping. |
| |
| *Guidance by real-time workload type:* |
| |
| - For periodic workloads; e.g., control loops executing every 100 µs, avoid |
| ``NO_HZ`` modes. Consistent kernel ticks are preferable. |
| |
| - For computation-intensive workloads; e.g. extended userspace execution, |
| ``NO_HZ_FULL`` may be beneficial. In such cases, users should offload the |
| kernel housekeeping to dedicated CPUs and isolate compute cores. |
| |
| See also Documentation/timers/no_hz.rst |
| |
| ``CONFIG_PREEMPT_RT`` |
| --------------------- |
| |
| :Expectation: enabled |
| :Severity: **fatal** |
| |
| This option must be enabled, or the resulting kernel will not be fully |
| preemptible and real-time capable. |
| |
| ``CONFIG_TRACING`` (and tracing options) |
| ---------------------------------------- |
| |
| :Expectation: enabled |
| :Severity: *info* |
| |
| Shipping kernels with tracing support enabled (but not actively running) is |
| highly recommended. This will allow the users to extract more information if |
| latency problems arise. Nonetheless, some tracers do incur latency overhead |
| just by being enabled. |
| |
| .. caution:: |
| |
| Users should *not* make use of tracers or trace events during production |
| real-time kernel operation as they can add considerable overhead and degrade |
| the system's latency. |
| |
| ``CONFIG_IRQSOFF_TRACER`` and ``CONFIG_PREEMPT_TRACER`` |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| :Expectation: disabled |
| :Severity: *high* |
| |
| These tracers do incur measurable latency overhead even when tracing is not |
| currently active. |
| |
| Kernel Debug Options |
| ==================== |
| |
| Most kernel debug options add runtime overhead that increases the worst-case |
| latency. |
| |
| .. caution:: |
| |
| During development and early testing, users are encouraged to run their |
| real-time workloads and peripherals with lockdep (:ref:`lockdep`) and other |
| kernel debug options enabled, for a considerable amount of time. Such |
| workloads might trigger kernel code paths that were not triggered during the |
| internal Linux real-time kernel development, thus helping to uncover locking |
| and other types of kernel bugs. |
| |
| ``CONFIG_DEBUG_ATOMIC_SLEEP`` |
| ----------------------------- |
| |
| :Expectation: allowed |
| |
| This sanity check catches common kernel programming errors with a tolerable |
| latency cost. It also increases overall scheduling as each ``might_sleep()`` |
| can lead to a context switch. |
| |
| ``CONFIG_DEBUG_BUGVERBOSE`` and ``CONFIG_DEBUG_INFO*`` |
| ------------------------------------------------------ |
| |
| :Expectation: allowed |
| |
| These options increase the kernel image size but have no latency impact. They |
| are also essential for meaningful BUG logs, crash dumps, and profiling. |
| |
| ``CONFIG_DEBUG_FS`` |
| ------------------- |
| |
| :Expectation: allowed |
| |
| This is safe to include in real-time kernels, *provided that debugfs is not |
| accessed during production runtime*. |
| |
| ``CONFIG_DEBUG_KERNEL`` |
| ----------------------- |
| |
| :Expectation: allowed |
| |
| Meta-option which allows debug features to be enabled. It has no runtime |
| impact, but beware of any debug features that it may have implicitly enabled. |
| |
| ``CONFIG_LOCKUP_DETECTOR`` |
| -------------------------- |
| |
| :Expectation: disabled |
| :Severity: *high* |
| |
| The lockup detector creates kernel timer callbacks that execute every few |
| seconds, in hard-IRQ context, even on real-time kernels. These periodic |
| interrupts can cause latency spikes. |
| |
| Users should use hardware watchdogs instead, which will provide a similar |
| functionality without the software-induced latency. |
| |
| .. _lockdep: |
| |
| ``CONFIG_PROVE_LOCKING`` |
| ------------------------ |
| |
| :Expectation: disabled |
| :Severity: *high* |
| |
| Proving the correctness of all kernel locking adds substantial overhead and |
| significantly increases worst-case latency. |
| |
| Summary |
| ======= |
| |
| There is no "one size fits all" solution for configuring a real-time Linux |
| system. Beginning with the system real-time requirements, integrators must |
| consider the features and functions of the system's hardware, kernel, and |
| userspace. All such components must be properly configured in order to |
| establish and constrain the system's maximum latency. |
| |
| With that in mind, any incorrect real-time kernel configuration could cause a |
| new maximum latency that shows up at the wrong time and is catastrophic for |
| the real-time system's latency. |
| |
| References |
| ========== |
| |
| .. [1] See Documentation/admin-guide/kernel-parameters.rst |