mirror of https://github.com/torvalds/linux.git
75 lines
3.2 KiB
ReStructuredText
75 lines
3.2 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0-or-later
|
|
.. _kho-concepts:
|
|
|
|
=======================
|
|
Kexec Handover Concepts
|
|
=======================
|
|
|
|
Kexec HandOver (KHO) is a mechanism that allows Linux to preserve memory
|
|
regions, which could contain serialized system states, across kexec.
|
|
|
|
It introduces multiple concepts:
|
|
|
|
KHO FDT
|
|
=======
|
|
|
|
Every KHO kexec carries a KHO specific flattened device tree (FDT) blob
|
|
that describes preserved memory regions. These regions contain either
|
|
serialized subsystem states, or in-memory data that shall not be touched
|
|
across kexec. After KHO, subsystems can retrieve and restore preserved
|
|
memory regions from KHO FDT.
|
|
|
|
KHO only uses the FDT container format and libfdt library, but does not
|
|
adhere to the same property semantics that normal device trees do: Properties
|
|
are passed in native endianness and standardized properties like ``regs`` and
|
|
``ranges`` do not exist, hence there are no ``#...-cells`` properties.
|
|
|
|
KHO is still under development. The FDT schema is unstable and would change
|
|
in the future.
|
|
|
|
Scratch Regions
|
|
===============
|
|
|
|
To boot into kexec, we need to have a physically contiguous memory range that
|
|
contains no handed over memory. Kexec then places the target kernel and initrd
|
|
into that region. The new kernel exclusively uses this region for memory
|
|
allocations before during boot up to the initialization of the page allocator.
|
|
|
|
We guarantee that we always have such regions through the scratch regions: On
|
|
first boot KHO allocates several physically contiguous memory regions. Since
|
|
after kexec these regions will be used by early memory allocations, there is a
|
|
scratch region per NUMA node plus a scratch region to satisfy allocations
|
|
requests that do not require particular NUMA node assignment.
|
|
By default, size of the scratch region is calculated based on amount of memory
|
|
allocated during boot. The ``kho_scratch`` kernel command line option may be
|
|
used to explicitly define size of the scratch regions.
|
|
The scratch regions are declared as CMA when page allocator is initialized so
|
|
that their memory can be used during system lifetime. CMA gives us the
|
|
guarantee that no handover pages land in that region, because handover pages
|
|
must be at a static physical memory location and CMA enforces that only
|
|
movable pages can be located inside.
|
|
|
|
After KHO kexec, we ignore the ``kho_scratch`` kernel command line option and
|
|
instead reuse the exact same region that was originally allocated. This allows
|
|
us to recursively execute any amount of KHO kexecs. Because we used this region
|
|
for boot memory allocations and as target memory for kexec blobs, some parts
|
|
of that memory region may be reserved. These reservations are irrelevant for
|
|
the next KHO, because kexec can overwrite even the original kernel.
|
|
|
|
.. _kho-finalization-phase:
|
|
|
|
KHO finalization phase
|
|
======================
|
|
|
|
To enable user space based kexec file loader, the kernel needs to be able to
|
|
provide the FDT that describes the current kernel's state before
|
|
performing the actual kexec. The process of generating that FDT is
|
|
called serialization. When the FDT is generated, some properties
|
|
of the system may become immutable because they are already written down
|
|
in the FDT. That state is called the KHO finalization phase.
|
|
|
|
Public API
|
|
==========
|
|
.. kernel-doc:: kernel/kexec_handover.c
|
|
:export:
|