mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
116 lines
4.4 KiB
ReStructuredText
116 lines
4.4 KiB
ReStructuredText
![]() |
.. SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
|
||
|
====================
|
||
|
Kexec Handover Usage
|
||
|
====================
|
||
|
|
||
|
Kexec HandOver (KHO) is a mechanism that allows Linux to preserve memory
|
||
|
regions, which could contain serialized system states, across kexec.
|
||
|
|
||
|
This document expects that you are familiar with the base KHO
|
||
|
:ref:`concepts <kho-concepts>`. If you have not read
|
||
|
them yet, please do so now.
|
||
|
|
||
|
Prerequisites
|
||
|
=============
|
||
|
|
||
|
KHO is available when the kernel is compiled with ``CONFIG_KEXEC_HANDOVER``
|
||
|
set to y. Every KHO producer may have its own config option that you
|
||
|
need to enable if you would like to preserve their respective state across
|
||
|
kexec.
|
||
|
|
||
|
To use KHO, please boot the kernel with the ``kho=on`` command line
|
||
|
parameter. You may use ``kho_scratch`` parameter to define size of the
|
||
|
scratch regions. For example ``kho_scratch=16M,512M,256M`` will reserve a
|
||
|
16 MiB low memory scratch area, a 512 MiB global scratch region, and 256 MiB
|
||
|
per NUMA node scratch regions on boot.
|
||
|
|
||
|
Perform a KHO kexec
|
||
|
===================
|
||
|
|
||
|
First, before you perform a KHO kexec, you need to move the system into
|
||
|
the :ref:`KHO finalization phase <kho-finalization-phase>` ::
|
||
|
|
||
|
$ echo 1 > /sys/kernel/debug/kho/out/finalize
|
||
|
|
||
|
After this command, the KHO FDT is available in
|
||
|
``/sys/kernel/debug/kho/out/fdt``. Other subsystems may also register
|
||
|
their own preserved sub FDTs under
|
||
|
``/sys/kernel/debug/kho/out/sub_fdts/``.
|
||
|
|
||
|
Next, load the target payload and kexec into it. It is important that you
|
||
|
use the ``-s`` parameter to use the in-kernel kexec file loader, as user
|
||
|
space kexec tooling currently has no support for KHO with the user space
|
||
|
based file loader ::
|
||
|
|
||
|
# kexec -l /path/to/bzImage --initrd /path/to/initrd -s
|
||
|
# kexec -e
|
||
|
|
||
|
The new kernel will boot up and contain some of the previous kernel's state.
|
||
|
|
||
|
For example, if you used ``reserve_mem`` command line parameter to create
|
||
|
an early memory reservation, the new kernel will have that memory at the
|
||
|
same physical address as the old kernel.
|
||
|
|
||
|
Abort a KHO exec
|
||
|
================
|
||
|
|
||
|
You can move the system out of KHO finalization phase again by calling ::
|
||
|
|
||
|
$ echo 0 > /sys/kernel/debug/kho/out/active
|
||
|
|
||
|
After this command, the KHO FDT is no longer available in
|
||
|
``/sys/kernel/debug/kho/out/fdt``.
|
||
|
|
||
|
debugfs Interfaces
|
||
|
==================
|
||
|
|
||
|
Currently KHO creates the following debugfs interfaces. Notice that these
|
||
|
interfaces may change in the future. They will be moved to sysfs once KHO is
|
||
|
stabilized.
|
||
|
|
||
|
``/sys/kernel/debug/kho/out/finalize``
|
||
|
Kexec HandOver (KHO) allows Linux to transition the state of
|
||
|
compatible drivers into the next kexec'ed kernel. To do so,
|
||
|
device drivers will instruct KHO to preserve memory regions,
|
||
|
which could contain serialized kernel state.
|
||
|
While the state is serialized, they are unable to perform
|
||
|
any modifications to state that was serialized, such as
|
||
|
handed over memory allocations.
|
||
|
|
||
|
When this file contains "1", the system is in the transition
|
||
|
state. When contains "0", it is not. To switch between the
|
||
|
two states, echo the respective number into this file.
|
||
|
|
||
|
``/sys/kernel/debug/kho/out/fdt``
|
||
|
When KHO state tree is finalized, the kernel exposes the
|
||
|
flattened device tree blob that carries its current KHO
|
||
|
state in this file. Kexec user space tooling can use this
|
||
|
as input file for the KHO payload image.
|
||
|
|
||
|
``/sys/kernel/debug/kho/out/scratch_len``
|
||
|
Lengths of KHO scratch regions, which are physically contiguous
|
||
|
memory regions that will always stay available for future kexec
|
||
|
allocations. Kexec user space tools can use this file to determine
|
||
|
where it should place its payload images.
|
||
|
|
||
|
``/sys/kernel/debug/kho/out/scratch_phys``
|
||
|
Physical locations of KHO scratch regions. Kexec user space tools
|
||
|
can use this file in conjunction to scratch_phys to determine where
|
||
|
it should place its payload images.
|
||
|
|
||
|
``/sys/kernel/debug/kho/out/sub_fdts/``
|
||
|
In the KHO finalization phase, KHO producers register their own
|
||
|
FDT blob under this directory.
|
||
|
|
||
|
``/sys/kernel/debug/kho/in/fdt``
|
||
|
When the kernel was booted with Kexec HandOver (KHO),
|
||
|
the state tree that carries metadata about the previous
|
||
|
kernel's state is in this file in the format of flattened
|
||
|
device tree. This file may disappear when all consumers of
|
||
|
it finished to interpret their metadata.
|
||
|
|
||
|
``/sys/kernel/debug/kho/in/sub_fdts/``
|
||
|
Similar to ``kho/out/sub_fdts/``, but contains sub FDT blobs
|
||
|
of KHO producers passed from the old kernel.
|