sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget&/translations/zh_CN/core-api/kho/indexmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/zh_TW/core-api/kho/indexmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/it_IT/core-api/kho/indexmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ja_JP/core-api/kho/indexmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ko_KR/core-api/kho/indexmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/pt_BR/core-api/kho/indexmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/sp_SP/core-api/kho/indexmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h)SPDX-License-Identifier: GPL-2.0-or-laterh]h)SPDX-License-Identifier: GPL-2.0-or-later}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh@/var/lib/git/docbuild/linux/Documentation/core-api/kho/index.rsthKubhtarget)}(h.. _kho-concepts:h]h}(h]h ]h"]h$]h&]refid kho-conceptsuh1hhKhhhhhhubhsection)}(hhh](htitle)}(hKexec Handover Subsystemh]hKexec Handover Subsystem}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hOverviewh]hOverview}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh paragraph)}(hKexec HandOver (KHO) is a mechanism that allows Linux to preserve memory regions, which could contain serialized system states, across kexec.h]hKexec HandOver (KHO) is a mechanism that allows Linux to preserve memory regions, which could contain serialized system states, across kexec.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hKHO uses :ref:`flattened device tree (FDT) ` to pass information about the preserved state from pre-exec kernel to post-kexec kernel and :ref:`scratch memory regions ` to ensure integrity of the preserved memory.h](h KHO uses }(hj hhhNhNubh)}(h,:ref:`flattened device tree (FDT) `h]hinline)}(hjh]hflattened device tree (FDT)}(hjhhhNhNubah}(h]h ](xrefstdstd-refeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdoccore-api/kho/index refdomainj%reftyperef refexplicitrefwarn reftargetkho_fdtuh1hhhhKhj ubh] to pass information about the preserved state from pre-exec kernel to post-kexec kernel and }(hj hhhNhNubh)}(h+:ref:`scratch memory regions `h]j)}(hj?h]hscratch memory regions}(hjAhhhNhNubah}(h]h ](j$stdstd-refeh"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]refdocj1 refdomainjKreftyperef refexplicitrefwarnj7 kho_scratchuh1hhhhKhj ubh- to ensure integrity of the preserved memory.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h .. _kho_fdt:h]h}(h]h ]h"]h$]h&]hԌkho-fdtuh1hhKhhhhhhubeh}(h]overviewah ]h"]overviewah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hKHO FDTh]hKHO FDT}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhhhhhKubh)}(hEvery KHO kexec carries a KHO specific flattened device tree (FDT) blob that describes the preserved state. The FDT includes properties describing preserved memory regions and nodes that hold subsystem specific state.h]hEvery KHO kexec carries a KHO specific flattened device tree (FDT) blob that describes the preserved state. The FDT includes properties describing preserved memory regions and nodes that hold subsystem specific state.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjzhhubh)}(hThe preserved memory regions contain either serialized subsystem states, or in-memory data that shall not be touched across kexec. After KHO, subsystems can retrieve and restore the preserved state from KHO FDT.h]hThe preserved memory regions contain either serialized subsystem states, or in-memory data that shall not be touched across kexec. After KHO, subsystems can retrieve and restore the preserved state from KHO FDT.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjzhhubh)}(heSubsystems participating in KHO can define their own format for state serialization and preservation.h]heSubsystems participating in KHO can define their own format for state serialization and preservation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjzhhubh)}(hKHO FDT and structures defined by the subsystems form an ABI between pre-kexec and post-kexec kernels. This ABI is defined by header files in ``include/linux/kho/abi`` directory.h](hKHO FDT and structures defined by the subsystems form an ABI between pre-kexec and post-kexec kernels. This ABI is defined by header files in }(hjhhhNhNubhliteral)}(h``include/linux/kho/abi``h]hinclude/linux/kho/abi}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh directory.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK"hjzhhubhcompound)}(hhh]htoctree)}(hhh]h}(h]h ]h"]h$]h&]hj1entries]Ncore-api/kho/abia includefiles]jamaxdepthKcaptionNglobhidden includehiddennumberedK titlesonly rawentries]uh1jhhhK&hjubah}(h]h ]toctree-wrapperah"]h$]h&]uh1jhjzhhhhhNubh)}(h.. _kho_scratch:h]h}(h]h ]h"]h$]h&]hԌ kho-scratchuh1hhK+hjzhhhhubeh}(h](jqid1eh ]h"](kho fdtkho_fdteh$]h&]uh1hhhhhhhhKexpect_referenced_by_name}jjgsexpect_referenced_by_id}jqjgsubh)}(hhh](h)}(hScratch Regionsh]hScratch Regions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK.ubh)}(hX4To 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.h]hX4To 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.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjhhubh)}(hXWe 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.h](hXWe 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 }(hj4hhhNhNubj)}(h``kho_scratch``h]h kho_scratch}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubhX 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.}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK5hjhhubh)}(hXAfter 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.h](hAfter KHO kexec, we ignore the }(hjThhhNhNubj)}(h``kho_scratch``h]h kho_scratch}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubhX 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.}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKChjhhubeh}(h](scratch-regionsjeh ]h"](scratch regions kho_scratcheh$]h&]uh1hhhhhhhhK.j}jzjsj}jjsubh)}(hhh](h)}(hKexec Handover Radix Treeh]hKexec Handover Radix Tree}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKKubh)}(hXFThis is a radix tree implementation for tracking numeric keys across kexec transitions. It was developed for the KHO preserved memory map but is designed for broader use by any subsystem that needs to track keys. Conceptually speaking, the data structure is similar to a set. It tracks the presence or absence of numeric keys.h]hXFThis is a radix tree implementation for tracking numeric keys across kexec transitions. It was developed for the KHO preserved memory map but is designed for broader use by any subsystem that needs to track keys. Conceptually speaking, the data structure is similar to a set. It tracks the presence or absence of numeric keys.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:77: ./include/linux/kho_radix_tree.hhK hjhhubh)}(h_The radix tree is a multi-level tree where leaf nodes are bitmaps representing individual keys.h]h_The radix tree is a multi-level tree where leaf nodes are bitmaps representing individual keys.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:77: ./include/linux/kho_radix_tree.hhKhjhhubh)}(hFor the KHO preserved memory map, to allow pages of different sizes (orders) to be stored efficiently in a single tree, it uses a unique key encoding scheme. Each key is an unsigned long that combines a page's physical address and its order.h]hFor the KHO preserved memory map, to allow pages of different sizes (orders) to be stored efficiently in a single tree, it uses a unique key encoding scheme. Each key is an unsigned long that combines a page’s physical address and its order.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:77: ./include/linux/kho_radix_tree.hhKhjhhubh)}(hClient code is responsible for allocating the root node of the tree, initializing the mutex lock, and managing its lifecycle. It must use the tree data structures defined in the KHO ABI, `include/linux/kho/abi/kexec_handover.h`.h](hClient code is responsible for allocating the root node of the tree, initializing the mutex lock, and managing its lifecycle. It must use the tree data structures defined in the KHO ABI, }(hjhhhNhNubhtitle_reference)}(h(`include/linux/kho/abi/kexec_handover.h`h]h&include/linux/kho/abi/kexec_handover.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hha/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:77: ./include/linux/kho_radix_tree.hhKhjhhubeh}(h]kexec-handover-radix-treeah ]h"]kexec handover radix treeah$]h&]uh1hhhhhhhhKKubh)}(hhh](h)}(h Public APIh]h Public API}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKQubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlekho_radix_add_key (C function)c.kho_radix_add_keyhNtauh1jhjhhhNhNubhdesc)}(hhh](hdesc_signature)}(hFint kho_radix_add_key (struct kho_radix_tree *tree, unsigned long key)h]hdesc_signature_line)}(hEint kho_radix_add_key(struct kho_radix_tree *tree, unsigned long key)h](hdesc_sig_keyword_type)}(hinth]hint}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKubhdesc_sig_space)}(h h]h }(hj/hhhNhNubah}(h]h ]wah"]h$]h&]uh1j-hjhhhj,hKubh desc_name)}(hkho_radix_add_keyh]h desc_sig_name)}(hkho_radix_add_keyh]hkho_radix_add_key}(hjFhhhNhNubah}(h]h ]nah"]h$]h&]uh1jDhj@ubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1j>hjhhhj,hKubhdesc_parameterlist)}(h0(struct kho_radix_tree *tree, unsigned long key)h](hdesc_parameter)}(hstruct kho_radix_tree *treeh](hdesc_sig_keyword)}(hstructh]hstruct}(hjkhhhNhNubah}(h]h ]kah"]h$]h&]uh1jihjeubj.)}(h h]h }(hjzhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjeubh)}(hhh]jE)}(hkho_radix_treeh]hkho_radix_tree}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jjHsbc.kho_radix_add_keyasbuh1hhjeubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjeubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjeubjE)}(htreeh]htree}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjeubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj_ubjd)}(hunsigned long keyh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubjE)}(hkeyh]hkey}(hj$hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj_ubeh}(h]h ]h"]h$]h&]hhuh1j]hjhhhj,hKubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1jsphinx_line_type declaratorhjhhhj,hKubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhj,hKhj hhubh desc_content)}(hhh]h)}(hAdd a key to the radix tree.h]hAdd a key to the radix tree.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhjUhhubah}(h]h ]h"]h$]h&]uh1jShj hhhj,hKubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejpdesctypejpnoindex noindexentrynocontentsentryuh1j hhhjhNhNubh container)}(hX**Parameters** ``struct kho_radix_tree *tree`` The KHO radix tree. ``unsigned long key`` The key to add. **Description** This function traverses the radix tree based on the **key** provided. It sets the corresponding bit in the leaf bitmap to mark the **key** as present. If intermediate nodes do not exist along the path, they are allocated and added to the tree. **NOTE** Currently only keys of width up to ``KHO_RADIX_KEY_WIDTH`` are supported. This limit only exists because current users of the radix tree don't use more than that. Changing the maximum width requires changing the tree depth, which needs bumping the ABI version. **Return** 0 on success, or a negative error code on failure.h](h)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhj|ubhdefinition_list)}(hhh](hdefinition_list_item)}(h4``struct kho_radix_tree *tree`` The KHO radix tree. h](hterm)}(h``struct kho_radix_tree *tree``h]j)}(hjh]hstruct kho_radix_tree *tree}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhjubh definition)}(hhh]h)}(hThe KHO radix tree.h]hThe KHO radix tree.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h&``unsigned long key`` The key to add. h](j)}(h``unsigned long key``h]j)}(hjh]hunsigned long key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhjubj)}(hhh]h)}(hThe key to add.h]hThe key to add.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhj|ubh)}(h**Description**h]j)}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhj|ubh)}(hThis function traverses the radix tree based on the **key** provided. It sets the corresponding bit in the leaf bitmap to mark the **key** as present. If intermediate nodes do not exist along the path, they are allocated and added to the tree.h](h4This function traverses the radix tree based on the }(hj5hhhNhNubj)}(h**key**h]hkey}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubhH provided. It sets the corresponding bit in the leaf bitmap to mark the }(hj5hhhNhNubj)}(h**key**h]hkey}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubhi as present. If intermediate nodes do not exist along the path, they are allocated and added to the tree.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhj|ubh)}(h**NOTE**h]j)}(hjjh]hNOTE}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhj|ubh)}(hXCurrently only keys of width up to ``KHO_RADIX_KEY_WIDTH`` are supported. This limit only exists because current users of the radix tree don't use more than that. Changing the maximum width requires changing the tree depth, which needs bumping the ABI version.h](h#Currently only keys of width up to }(hjhhhNhNubj)}(h``KHO_RADIX_KEY_WIDTH``h]hKHO_RADIX_KEY_WIDTH}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh are supported. This limit only exists because current users of the radix tree don’t use more than that. Changing the maximum width requires changing the tree depth, which needs bumping the ABI version.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhj|ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhj|ubh)}(h20 on success, or a negative error code on failure.h]h20 on success, or a negative error code on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhj|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_radix_del_key (C function)c.kho_radix_del_keyhNtauh1jhjhhhNhNubj )}(hhh](j)}(hGvoid kho_radix_del_key (struct kho_radix_tree *tree, unsigned long key)h]j)}(hFvoid kho_radix_del_key(struct kho_radix_tree *tree, unsigned long key)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhMubj?)}(hkho_radix_del_keyh]jE)}(hkho_radix_del_keyh]hkho_radix_del_key}(hj hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjhhhjhMubj^)}(h0(struct kho_radix_tree *tree, unsigned long key)h](jd)}(hstruct kho_radix_tree *treeh](jj)}(hjmh]hstruct}(hj%hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj!ubj.)}(h h]h }(hj2hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj!ubh)}(hhh]jE)}(hkho_radix_treeh]hkho_radix_tree}(hjChhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj@ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjEmodnameN classnameNjj)}j]j)}jj sbc.kho_radix_del_keyasbuh1hhj!ubj.)}(h h]h }(hjchhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj!ubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjE)}(htreeh]htree}(hj~hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjubjd)}(hunsigned long keyh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubjE)}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjubeh}(h]h ]h"]h$]h&]hhuh1j]hjhhhjhMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjhhhjhMubah}(h]jah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjhMhjhhubjT)}(hhh]h)}(h$Removes the key from the radix tree.h]h$Removes the key from the radix tree.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjhhubah}(h]h ]h"]h$]h&]uh1jShjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujjvjjwjxjyuh1j hhhjhNhNubj{)}(hXM**Parameters** ``struct kho_radix_tree *tree`` The KHO radix tree. ``unsigned long key`` The key to remove. **Description** This function traverses the radix tree and clears the bit corresponding to the **key**, effectively removing it from the tree. It does not free the tree's intermediate nodes, even if they become empty.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM"hjubj)}(hhh](j)}(h4``struct kho_radix_tree *tree`` The KHO radix tree. h](j)}(h``struct kho_radix_tree *tree``h]j)}(hj:h]hstruct kho_radix_tree *tree}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj4ubj)}(hhh]h)}(hThe KHO radix tree.h]hThe KHO radix tree.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhMhjPubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhjOhMhj1ubj)}(h)``unsigned long key`` The key to remove. h](j)}(h``unsigned long key``h]j)}(hjsh]hunsigned long key}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM hjmubj)}(hhh]h)}(hThe key to remove.h]hThe key to remove.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjhM hj1ubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM"hjubh)}(hThis function traverses the radix tree and clears the bit corresponding to the **key**, effectively removing it from the tree. It does not free the tree's intermediate nodes, even if they become empty.h](hOThis function traverses the radix tree and clears the bit corresponding to the }(hjhhhNhNubj)}(h**key**h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhu, effectively removing it from the tree. It does not free the tree’s intermediate nodes, even if they become empty.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM!hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j kho_radix_init_tree (C function)c.kho_radix_init_treehNtauh1jhjhhhNhNubj )}(hhh](j)}(hRint kho_radix_init_tree (struct kho_radix_tree *tree, struct kho_radix_node *root)h]j)}(hQint kho_radix_init_tree(struct kho_radix_tree *tree, struct kho_radix_node *root)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM`ubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhM`ubj?)}(hkho_radix_init_treeh]jE)}(hkho_radix_init_treeh]hkho_radix_init_tree}(hj&hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj"ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjhhhjhM`ubj^)}(h:(struct kho_radix_tree *tree, struct kho_radix_node *root)h](jd)}(hstruct kho_radix_tree *treeh](jj)}(hjmh]hstruct}(hjBhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj>ubj.)}(h h]h }(hjOhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj>ubh)}(hhh]jE)}(hkho_radix_treeh]hkho_radix_tree}(hj`hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjbmodnameN classnameNjj)}j]j)}jj(sbc.kho_radix_init_treeasbuh1hhj>ubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj>ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubjE)}(htreeh]htree}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj>ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj:ubjd)}(hstruct kho_radix_node *rooth](jj)}(hjmh]hstruct}(hjhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubh)}(hhh]jE)}(hkho_radix_nodeh]hkho_radix_node}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j|c.kho_radix_init_treeasbuh1hhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjE)}(hrooth]hroot}(hj hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj:ubeh}(h]h ]h"]h$]h&]hhuh1j]hjhhhjhM`ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjhhhjhM`ubah}(h]jah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjhM`hjhhubjT)}(hhh]h)}(hinitialize the radix tree.h]hinitialize the radix tree.}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM`hj2 hhubah}(h]h ]h"]h$]h&]uh1jShjhhhjhM`ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujM jvjM jwjxjyuh1j hhhjhNhNubj{)}(hX**Parameters** ``struct kho_radix_tree *tree`` the tree to initialize. ``struct kho_radix_node *root`` root table of the radix tree. **Description** Initialize the radix tree with the given root node. If root is ``NULL``, an empty root table is allocated. If root is not ``NULL``, it is the caller's responsibility to make sure the root is valid and in the correct format. **Return** 0 on success, -errno on failure.h](h)}(h**Parameters**h]j)}(hjW h]h Parameters}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMdhjQ ubj)}(hhh](j)}(h8``struct kho_radix_tree *tree`` the tree to initialize. h](j)}(h``struct kho_radix_tree *tree``h]j)}(hjv h]hstruct kho_radix_tree *tree}(hjx hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMahjp ubj)}(hhh]h)}(hthe tree to initialize.h]hthe tree to initialize.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMahj ubah}(h]h ]h"]h$]h&]uh1jhjp ubeh}(h]h ]h"]h$]h&]uh1jhj hMahjm ubj)}(h>``struct kho_radix_node *root`` root table of the radix tree. h](j)}(h``struct kho_radix_node *root``h]j)}(hj h]hstruct kho_radix_node *root}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMbhj ubj)}(hhh]h)}(hroot table of the radix tree.h]hroot table of the radix tree.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMbhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMbhjm ubeh}(h]h ]h"]h$]h&]uh1jhjQ ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMdhjQ ubh)}(hInitialize the radix tree with the given root node. If root is ``NULL``, an empty root table is allocated. If root is not ``NULL``, it is the caller's responsibility to make sure the root is valid and in the correct format.h](h?Initialize the radix tree with the given root node. If root is }(hj hhhNhNubj)}(h``NULL``h]hNULL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh3, an empty root table is allocated. If root is not }(hj hhhNhNubj)}(h``NULL``h]hNULL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh_, it is the caller’s responsibility to make sure the root is valid and in the correct format.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMchjQ ubh)}(h **Return**h]j)}(hj5 h]hReturn}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3 ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMghjQ ubh)}(h 0 on success, -errno on failure.h]h 0 on success, -errno on failure.}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhhjQ ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#kho_radix_destroy_tree (C function)c.kho_radix_destroy_treehNtauh1jhjhhhNhNubj )}(hhh](j)}(h9void kho_radix_destroy_tree (struct kho_radix_tree *tree)h]j)}(h8void kho_radix_destroy_tree(struct kho_radix_tree *tree)h](j)}(hvoidh]hvoid}(hjz hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjv hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMxubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjv hhhj hMxubj?)}(hkho_radix_destroy_treeh]jE)}(hkho_radix_destroy_treeh]hkho_radix_destroy_tree}(hj hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjv hhhj hMxubj^)}(h(struct kho_radix_tree *tree)h]jd)}(hstruct kho_radix_tree *treeh](jj)}(hjmh]hstruct}(hj hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj ubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj ubh)}(hhh]jE)}(hkho_radix_treeh]hkho_radix_tree}(hj hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jj sbc.kho_radix_destroy_treeasbuh1hhj ubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjE)}(htreeh]htree}(hj hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj ubah}(h]h ]h"]h$]h&]hhuh1j]hjv hhhj hMxubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjr hhhj hMxubah}(h]jm ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj hMxhjo hhubjT)}(hhh]h)}(hDestroy the radix treeh]hDestroy the radix tree}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMxhj7 hhubah}(h]h ]h"]h$]h&]uh1jShjo hhhj hMxubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujR jvjR jwjxjyuh1j hhhjhNhNubj{)}(h**Parameters** ``struct kho_radix_tree *tree`` The radix tree to destroy **Description** Walk **tree** and free all its nodes.h](h)}(h**Parameters**h]j)}(hj\ h]h Parameters}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM|hjV ubj)}(hhh]j)}(h:``struct kho_radix_tree *tree`` The radix tree to destroy h](j)}(h``struct kho_radix_tree *tree``h]j)}(hj{ h]hstruct kho_radix_tree *tree}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMyhju ubj)}(hhh]h)}(hThe radix tree to destroyh]hThe radix tree to destroy}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMyhj ubah}(h]h ]h"]h$]h&]uh1jhju ubeh}(h]h ]h"]h$]h&]uh1jhj hMyhjr ubah}(h]h ]h"]h$]h&]uh1jhjV ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM{hjV ubh)}(h%Walk **tree** and free all its nodes.h](hWalk }(hj hhhNhNubj)}(h**tree**h]htree}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh and free all its nodes.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMzhjV ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j kho_radix_walk_tree (C function)c.kho_radix_walk_treehNtauh1jhjhhhNhNubj )}(hhh](j)}(heint kho_radix_walk_tree (struct kho_radix_tree *tree, const struct kho_radix_walk_cb *cb, void *data)h]j)}(hdint kho_radix_walk_tree(struct kho_radix_tree *tree, const struct kho_radix_walk_cb *cb, void *data)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj hhhj hMubj?)}(hkho_radix_walk_treeh]jE)}(hkho_radix_walk_treeh]hkho_radix_walk_tree}(hj. hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj* ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj hhhj hMubj^)}(hM(struct kho_radix_tree *tree, const struct kho_radix_walk_cb *cb, void *data)h](jd)}(hstruct kho_radix_tree *treeh](jj)}(hjmh]hstruct}(hjJ hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjF ubj.)}(h h]h }(hjW hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjF ubh)}(hhh]jE)}(hkho_radix_treeh]hkho_radix_tree}(hjh hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhje ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjj modnameN classnameNjj)}j]j)}jj0 sbc.kho_radix_walk_treeasbuh1hhjF ubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjF ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF ubjE)}(htreeh]htree}(hj hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjF ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjB ubjd)}(h"const struct kho_radix_walk_cb *cbh](jj)}(hconsth]hconst}(hj hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj ubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj ubjj)}(hjmh]hstruct}(hj hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj ubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj ubh)}(hhh]jE)}(hkho_radix_walk_cbh]hkho_radix_walk_cb}(hj hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j c.kho_radix_walk_treeasbuh1hhj ubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj ubj)}(hjh]h*}(hj" hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjE)}(hcbh]hcb}(hj/ hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjB ubjd)}(h void *datah](j)}(hvoidh]hvoid}(hjH hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjD ubj.)}(h h]h }(hjV hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjD ubj)}(hjh]h*}(hjd hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD ubjE)}(hdatah]hdata}(hjq hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjD ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjB ubeh}(h]h ]h"]h$]h&]hhuh1j]hj hhhj hMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj hhhj hMubah}(h]j ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj hMhj hhubjT)}(hhh]h)}(h;Traverses the radix tree and calls a callback for each key.h]h;Traverses the radix tree and calls a callback for each key.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj hhubah}(h]h ]h"]h$]h&]uh1jShj hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj jvj jwjxjyuh1j hhhjhNhNubj{)}(hX**Parameters** ``struct kho_radix_tree *tree`` A pointer to the KHO radix tree to walk. ``const struct kho_radix_walk_cb *cb`` Set of callbacks to be invoked during the tree walk. ``void *data`` Opaque data pointer passed to each callback in **cb**. **Description** This function walks the radix tree, searching from the top level down to the lowest level (level 0), invoking the appropriate callbacks. **Return** 0 if the walk completed the specified tree, or the non-zero return value from the callback that stopped the walk.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubj)}(hhh](j)}(hI``struct kho_radix_tree *tree`` A pointer to the KHO radix tree to walk. h](j)}(h``struct kho_radix_tree *tree``h]j)}(hj h]hstruct kho_radix_tree *tree}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubj)}(hhh]h)}(h(A pointer to the KHO radix tree to walk.h]h(A pointer to the KHO radix tree to walk.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubj)}(h\``const struct kho_radix_walk_cb *cb`` Set of callbacks to be invoked during the tree walk. h](j)}(h&``const struct kho_radix_walk_cb *cb``h]j)}(hjh]h"const struct kho_radix_walk_cb *cb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubj)}(hhh]h)}(h4Set of callbacks to be invoked during the tree walk.h]h4Set of callbacks to be invoked during the tree walk.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj+ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj ubj)}(hF``void *data`` Opaque data pointer passed to each callback in **cb**. h](j)}(h``void *data``h]j)}(hjNh]h void *data}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjHubj)}(hhh]h)}(h6Opaque data pointer passed to each callback in **cb**.h](h/Opaque data pointer passed to each callback in }(hjghhhNhNubj)}(h**cb**h]hcb}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubh.}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjchMhjdubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjchMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubh)}(hThis function walks the radix tree, searching from the top level down to the lowest level (level 0), invoking the appropriate callbacks.h]hThis function walks the radix tree, searching from the top level down to the lowest level (level 0), invoking the appropriate callbacks.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubh)}(hq0 if the walk completed the specified tree, or the non-zero return value from the callback that stopped the walk.h]hq0 if the walk completed the specified tree, or the non-zero return value from the callback that stopped the walk.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_restore_folio (C function)c.kho_restore_foliohNtauh1jhjhhhNhNubj )}(hhh](j)}(h3struct folio * kho_restore_folio (phys_addr_t phys)h]j)}(h1struct folio *kho_restore_folio(phys_addr_t phys)h](jj)}(hjmh]hstruct}(hjhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM!ubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhM!ubh)}(hhh]jE)}(hfolioh]hfolio}(hj&hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj#ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj(modnameN classnameNjj)}j]j)}jkho_restore_foliosbc.kho_restore_folioasbuh1hhjhhhjhM!ubj.)}(h h]h }(hjGhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhM!ubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM!ubj?)}(hkho_restore_folioh]jE)}(hjDh]hkho_restore_folio}(hjfhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjbubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjhhhjhM!ubj^)}(h(phys_addr_t phys)h]jd)}(hphys_addr_t physh](h)}(hhh]jE)}(h phys_addr_th]h phys_addr_t}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jBc.kho_restore_folioasbuh1hhj}ubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj}ubjE)}(hphysh]hphys}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj}ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjyubah}(h]h ]h"]h$]h&]hhuh1j]hjhhhjhM!ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjhhhjhM!ubah}(h]jah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjhM!hjhhubjT)}(hhh]h)}(h.recreates the folio from the preserved memory.h]h.recreates the folio from the preserved memory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM!hjhhubah}(h]h ]h"]h$]h&]uh1jShjhhhjhM!ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujjvjjwjxjyuh1j hhhjhNhNubj{)}(h**Parameters** ``phys_addr_t phys`` physical address of the folio. **Return** pointer to the struct folio on success, NULL on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM%hjubj)}(hhh]j)}(h4``phys_addr_t phys`` physical address of the folio. h](j)}(h``phys_addr_t phys``h]j)}(hjh]hphys_addr_t phys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM"hjubj)}(hhh]h)}(hphysical address of the folio.h]hphysical address of the folio.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hM"hj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hM"hjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h **Return**h]j)}(hjVh]hReturn}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM$hjubh)}(h8pointer to the struct folio on success, NULL on failure.h]h8pointer to the struct folio on success, NULL on failure.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM$hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_restore_pages (C function)c.kho_restore_pageshNtauh1jhjhhhNhNubj )}(hhh](j)}(hJstruct page * kho_restore_pages (phys_addr_t phys, unsigned long nr_pages)h]j)}(hHstruct page *kho_restore_pages(phys_addr_t phys, unsigned long nr_pages)h](jj)}(hjmh]hstruct}(hjhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM/ubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhM/ubh)}(hhh]jE)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jkho_restore_pagessbc.kho_restore_pagesasbuh1hhjhhhjhM/ubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhM/ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM/ubj?)}(hkho_restore_pagesh]jE)}(hjh]hkho_restore_pages}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjhhhjhM/ubj^)}(h*(phys_addr_t phys, unsigned long nr_pages)h](jd)}(hphys_addr_t physh](h)}(hhh]jE)}(h phys_addr_th]h phys_addr_t}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.kho_restore_pagesasbuh1hhjubj.)}(h h]h }(hj6hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubjE)}(hphysh]hphys}(hjDhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj ubjd)}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hj]hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjYubj.)}(h h]h }(hjkhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjYubj)}(hlongh]hlong}(hjyhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjYubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjYubjE)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjYubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj ubeh}(h]h ]h"]h$]h&]hhuh1j]hjhhhjhM/ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjhhhjhM/ubah}(h]jah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjhM/hjhhubjT)}(hhh]h)}(h)restore list of contiguous order 0 pages.h]h)restore list of contiguous order 0 pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM/hjhhubah}(h]h ]h"]h$]h&]uh1jShjhhhjhM/ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujjvjjwjxjyuh1j hhhjhNhNubj{)}(hX**Parameters** ``phys_addr_t phys`` physical address of the first page. ``unsigned long nr_pages`` number of pages. **Description** Restore a contiguous list of order 0 pages that was preserved with kho_preserve_pages(). **Return** the first page on success, NULL on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM3hjubj)}(hhh](j)}(h9``phys_addr_t phys`` physical address of the first page. h](j)}(h``phys_addr_t phys``h]j)}(hjh]hphys_addr_t phys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM0hjubj)}(hhh]h)}(h#physical address of the first page.h]h#physical address of the first page.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM0hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM0hjubj)}(h,``unsigned long nr_pages`` number of pages. h](j)}(h``unsigned long nr_pages``h]j)}(hj9h]hunsigned long nr_pages}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM1hj3ubj)}(hhh]h)}(hnumber of pages.h]hnumber of pages.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhM1hjOubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhM1hjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjth]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM3hjubh)}(hXRestore a contiguous list of order 0 pages that was preserved with kho_preserve_pages().h]hXRestore a contiguous list of order 0 pages that was preserved with kho_preserve_pages().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM2hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM5hjubh)}(h+the first page on success, NULL on failure.h]h+the first page on success, NULL on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM6hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_add_subtree (C function)c.kho_add_subtreehNtauh1jhjhhhNhNubj )}(hhh](j)}(h?int kho_add_subtree (const char *name, void *blob, size_t size)h]j)}(h>int kho_add_subtree(const char *name, void *blob, size_t size)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhMubj?)}(hkho_add_subtreeh]jE)}(hkho_add_subtreeh]hkho_add_subtree}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjhhhjhMubj^)}(h+(const char *name, void *blob, size_t size)h](jd)}(hconst char *nameh](jj)}(hj h]hconst}(hjhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjubj.)}(h h]h }(hj*hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hcharh]hchar}(hj8hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjFhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hjh]h*}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjE)}(hnameh]hname}(hjahhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjubjd)}(h void *blobh](j)}(hvoidh]hvoid}(hjzhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjvubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjvubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubjE)}(hblobh]hblob}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjvubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjubjd)}(h size_t sizeh](h)}(hhh]jE)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.kho_add_subtreeasbuh1hhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubjE)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjubeh}(h]h ]h"]h$]h&]hhuh1j]hjhhhjhMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjhhhjhMubah}(h]jah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjhMhjhhubjT)}(hhh]h)}(h;record the physical address of a sub blob in KHO root tree.h]h;record the physical address of a sub blob in KHO root tree.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjhhubah}(h]h ]h"]h$]h&]uh1jShjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj/jvj/jwjxjyuh1j hhhjhNhNubj{)}(hX1**Parameters** ``const char *name`` name of the sub tree. ``void *blob`` the sub tree blob. ``size_t size`` size of the blob in bytes. **Description** Creates a new child node named **name** in KHO root FDT and records the physical address of **blob**. The pages of **blob** must also be preserved by KHO for the new kernel to retrieve it after kexec. A debugfs blob entry is also created at ``/sys/kernel/debug/kho/out/sub_fdts/**name**`` when kernel is configured with CONFIG_KEXEC_HANDOVER_DEBUGFS **Return** 0 on success, error code on failureh](h)}(h**Parameters**h]j)}(hj9h]h Parameters}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj3ubj)}(hhh](j)}(h+``const char *name`` name of the sub tree. h](j)}(h``const char *name``h]j)}(hjXh]hconst char *name}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjRubj)}(hhh]h)}(hname of the sub tree.h]hname of the sub tree.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhMhjnubah}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]uh1jhjmhMhjOubj)}(h"``void *blob`` the sub tree blob. h](j)}(h``void *blob``h]j)}(hjh]h void *blob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubj)}(hhh]h)}(hthe sub tree blob.h]hthe sub tree blob.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjOubj)}(h+``size_t size`` size of the blob in bytes. h](j)}(h``size_t size``h]j)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubj)}(hhh]h)}(hsize of the blob in bytes.h]hsize of the blob in bytes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjOubeh}(h]h ]h"]h$]h&]uh1jhj3ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj3ubh)}(hCreates a new child node named **name** in KHO root FDT and records the physical address of **blob**. The pages of **blob** must also be preserved by KHO for the new kernel to retrieve it after kexec.h](hCreates a new child node named }(hjhhhNhNubj)}(h**name**h]hname}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh5 in KHO root FDT and records the physical address of }(hjhhhNhNubj)}(h**blob**h]hblob}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. The pages of }(hjhhhNhNubj)}(h**blob**h]hblob}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhM must also be preserved by KHO for the new kernel to retrieve it after kexec.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj3ubh)}(hA debugfs blob entry is also created at ``/sys/kernel/debug/kho/out/sub_fdts/**name**`` when kernel is configured with CONFIG_KEXEC_HANDOVER_DEBUGFSh](h(A debugfs blob entry is also created at }(hj`hhhNhNubj)}(h/``/sys/kernel/debug/kho/out/sub_fdts/**name**``h]h+/sys/kernel/debug/kho/out/sub_fdts/**name**}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh= when kernel is configured with CONFIG_KEXEC_HANDOVER_DEBUGFS}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj3ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM hj3ubh)}(h#0 on success, error code on failureh]h#0 on success, error code on failure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM!hj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_preserve_folio (C function)c.kho_preserve_foliohNtauh1jhjhhhNhNubj )}(hhh](j)}(h,int kho_preserve_folio (struct folio *folio)h]j)}(h+int kho_preserve_folio(struct folio *folio)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMsubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhMsubj?)}(hkho_preserve_folioh]jE)}(hkho_preserve_folioh]hkho_preserve_folio}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjhhhjhMsubj^)}(h(struct folio *folio)h]jd)}(hstruct folio *folioh](jj)}(hjmh]hstruct}(hjhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubh)}(hhh]jE)}(hfolioh]hfolio}(hj#hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj%modnameN classnameNjj)}j]j)}jjsbc.kho_preserve_folioasbuh1hhjubj.)}(h h]h }(hjChhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjE)}(hfolioh]hfolio}(hj^hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjubah}(h]h ]h"]h$]h&]hhuh1j]hjhhhjhMsubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjhhhjhMsubah}(h]jah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjhMshjhhubjT)}(hhh]h)}(hpreserve a folio across kexec.h]hpreserve a folio across kexec.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMshjhhubah}(h]h ]h"]h$]h&]uh1jShjhhhjhMsubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujjvjjwjxjyuh1j hhhjhNhNubj{)}(h**Parameters** ``struct folio *folio`` folio to preserve. **Description** Instructs KHO to preserve the whole folio across kexec. The order will be preserved as well. **Return** 0 on success, error code on failureh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMwhjubj)}(hhh]j)}(h+``struct folio *folio`` folio to preserve. h](j)}(h``struct folio *folio``h]j)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMthjubj)}(hhh]h)}(hfolio to preserve.h]hfolio to preserve.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMthjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMthjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMvhjubh)}(h\Instructs KHO to preserve the whole folio across kexec. The order will be preserved as well.h]h\Instructs KHO to preserve the whole folio across kexec. The order will be preserved as well.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMuhjubh)}(h **Return**h]j)}(hj+h]hReturn}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMxhjubh)}(h#0 on success, error code on failureh]h#0 on success, error code on failure}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMyhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!kho_unpreserve_folio (C function)c.kho_unpreserve_foliohNtauh1jhjhhhNhNubj )}(hhh](j)}(h/void kho_unpreserve_folio (struct folio *folio)h]j)}(h.void kho_unpreserve_folio(struct folio *folio)h](j)}(hvoidh]hvoid}(hjphhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjlhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjlhhhj~hMubj?)}(hkho_unpreserve_folioh]jE)}(hkho_unpreserve_folioh]hkho_unpreserve_folio}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjlhhhj~hMubj^)}(h(struct folio *folio)h]jd)}(hstruct folio *folioh](jj)}(hjmh]hstruct}(hjhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubh)}(hhh]jE)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.kho_unpreserve_folioasbuh1hhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjE)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjubah}(h]h ]h"]h$]h&]hhuh1j]hjlhhhj~hMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjhhhhj~hMubah}(h]jcah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj~hMhjehhubjT)}(hhh]h)}(hunpreserve a folio.h]hunpreserve a folio.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj-hhubah}(h]h ]h"]h$]h&]uh1jShjehhhj~hMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujHjvjHjwjxjyuh1j hhhjhNhNubj{)}(h**Parameters** ``struct folio *folio`` folio to unpreserve. **Description** Instructs KHO to unpreserve a folio that was preserved by kho_preserve_folio() before. The provided **folio** (pfn and order) must exactly match a previously preserved folio.h](h)}(h**Parameters**h]j)}(hjRh]h Parameters}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjLubj)}(hhh]j)}(h-``struct folio *folio`` folio to unpreserve. h](j)}(h``struct folio *folio``h]j)}(hjqh]hstruct folio *folio}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjkubj)}(hhh]h)}(hfolio to unpreserve.h]hfolio to unpreserve.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjhMhjhubah}(h]h ]h"]h$]h&]uh1jhjLubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjLubh)}(hInstructs KHO to unpreserve a folio that was preserved by kho_preserve_folio() before. The provided **folio** (pfn and order) must exactly match a previously preserved folio.h](hdInstructs KHO to unpreserve a folio that was preserved by kho_preserve_folio() before. The provided }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhA (pfn and order) must exactly match a previously preserved folio.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjLubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_preserve_pages (C function)c.kho_preserve_pageshNtauh1jhjhhhNhNubj )}(hhh](j)}(hBint kho_preserve_pages (struct page *page, unsigned long nr_pages)h]j)}(hAint kho_preserve_pages(struct page *page, unsigned long nr_pages)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhMubj?)}(hkho_preserve_pagesh]jE)}(hkho_preserve_pagesh]hkho_preserve_pages}(hj$hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjhhhjhMubj^)}(h+(struct page *page, unsigned long nr_pages)h](jd)}(hstruct page *pageh](jj)}(hjmh]hstruct}(hj@hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj<ubj.)}(h h]h }(hjMhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj<ubh)}(hhh]jE)}(hpageh]hpage}(hj^hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj[ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj`modnameN classnameNjj)}j]j)}jj&sbc.kho_preserve_pagesasbuh1hhj<ubj.)}(h h]h }(hj~hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj<ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubjE)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj8ubjd)}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubjE)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj8ubeh}(h]h ]h"]h$]h&]hhuh1j]hjhhhjhMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjhhhjhMubah}(h]jah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjhMhjhhubjT)}(hhh]h)}(h&preserve contiguous pages across kexech]h&preserve contiguous pages across kexec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjhhubah}(h]h ]h"]h$]h&]uh1jShjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj,jvj,jwjxjyuh1j hhhjhNhNubj{)}(hX?**Parameters** ``struct page *page`` first page in the list. ``unsigned long nr_pages`` number of pages. **Description** Preserve a contiguous list of order 0 pages. Must be restored using kho_restore_pages() to ensure the pages are restored properly as order 0. **Return** 0 on success, error code on failureh](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj0ubj)}(hhh](j)}(h.``struct page *page`` first page in the list. h](j)}(h``struct page *page``h]j)}(hjUh]hstruct page *page}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjOubj)}(hhh]h)}(hfirst page in the list.h]hfirst page in the list.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMhjkubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjjhMhjLubj)}(h,``unsigned long nr_pages`` number of pages. h](j)}(h``unsigned long nr_pages``h]j)}(hjh]hunsigned long nr_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubj)}(hhh]h)}(hnumber of pages.h]hnumber of pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjLubeh}(h]h ]h"]h$]h&]uh1jhj0ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj0ubh)}(hPreserve a contiguous list of order 0 pages. Must be restored using kho_restore_pages() to ensure the pages are restored properly as order 0.h]hPreserve a contiguous list of order 0 pages. Must be restored using kho_restore_pages() to ensure the pages are restored properly as order 0.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj0ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj0ubh)}(h#0 on success, error code on failureh]h#0 on success, error code on failure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!kho_unpreserve_pages (C function)c.kho_unpreserve_pageshNtauh1jhjhhhNhNubj )}(hhh](j)}(hEvoid kho_unpreserve_pages (struct page *page, unsigned long nr_pages)h]j)}(hDvoid kho_unpreserve_pages(struct page *page, unsigned long nr_pages)h](j)}(hvoidh]hvoid}(hj5hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj1hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj.)}(h h]h }(hjDhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj1hhhjChMubj?)}(hkho_unpreserve_pagesh]jE)}(hkho_unpreserve_pagesh]hkho_unpreserve_pages}(hjVhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjRubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj1hhhjChMubj^)}(h+(struct page *page, unsigned long nr_pages)h](jd)}(hstruct page *pageh](jj)}(hjmh]hstruct}(hjrhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjnubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjnubh)}(hhh]jE)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjXsbc.kho_unpreserve_pagesasbuh1hhjnubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjnubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubjE)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjnubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjjubjd)}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubjE)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjjubeh}(h]h ]h"]h$]h&]hhuh1j]hj1hhhjChMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj-hhhjChMubah}(h]j(ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjChMhj*hhubjT)}(hhh]h)}(hunpreserve contiguous pages.h]hunpreserve contiguous pages.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjChhubah}(h]h ]h"]h$]h&]uh1jShj*hhhjChMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj^jvj^jwjxjyuh1j hhhjhNhNubj{)}(hX**Parameters** ``struct page *page`` first page in the list. ``unsigned long nr_pages`` number of pages. **Description** Instructs KHO to unpreserve **nr_pages** contiguous pages starting from **page**. This must be called with the same **page** and **nr_pages** as the corresponding kho_preserve_pages() call. Unpreserving arbitrary sub-ranges of larger preserved blocks is not supported.h](h)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjbubj)}(hhh](j)}(h.``struct page *page`` first page in the list. h](j)}(h``struct page *page``h]j)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubj)}(hhh]h)}(hfirst page in the list.h]hfirst page in the list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj~ubj)}(h,``unsigned long nr_pages`` number of pages. h](j)}(h``unsigned long nr_pages``h]j)}(hjh]hunsigned long nr_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubj)}(hhh]h)}(hnumber of pages.h]hnumber of pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj~ubeh}(h]h ]h"]h$]h&]uh1jhjbubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjbubh)}(hX Instructs KHO to unpreserve **nr_pages** contiguous pages starting from **page**. This must be called with the same **page** and **nr_pages** as the corresponding kho_preserve_pages() call. Unpreserving arbitrary sub-ranges of larger preserved blocks is not supported.h](hInstructs KHO to unpreserve }(hjhhhNhNubj)}(h **nr_pages**h]hnr_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh contiguous pages starting from }(hjhhhNhNubj)}(h**page**h]hpage}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh$. This must be called with the same }(hjhhhNhNubj)}(h**page**h]hpage}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h **nr_pages**h]hnr_pages}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh as the corresponding kho_preserve_pages() call. Unpreserving arbitrary sub-ranges of larger preserved blocks is not supported.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!kho_preserve_vmalloc (C function)c.kho_preserve_vmallochNtauh1jhjhhhNhNubj )}(hhh](j)}(hFint kho_preserve_vmalloc (void *ptr, struct kho_vmalloc *preservation)h]j)}(hEint kho_preserve_vmalloc(void *ptr, struct kho_vmalloc *preservation)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM@ubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjhhhjhM@ubj?)}(hkho_preserve_vmalloch]jE)}(hkho_preserve_vmalloch]hkho_preserve_vmalloc}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjhhhjhM@ubj^)}(h-(void *ptr, struct kho_vmalloc *preservation)h](jd)}(h void *ptrh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjE)}(hptrh]hptr}(hjhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjubjd)}(h struct kho_vmalloc *preservationh](jj)}(hjmh]hstruct}(hjhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjubj.)}(h h]h }(hjhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubh)}(hhh]jE)}(h kho_vmalloch]h kho_vmalloc}(hj%hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj'modnameN classnameNjj)}j]j)}jjsbc.kho_preserve_vmallocasbuh1hhjubj.)}(h h]h }(hjEhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjubj)}(hjh]h*}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjE)}(h preservationh]h preservation}(hj`hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjubeh}(h]h ]h"]h$]h&]hhuh1j]hjhhhjhM@ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjhhhjhM@ubah}(h]j{ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjhM@hj}hhubjT)}(hhh]h)}(h5preserve memory allocated with vmalloc() across kexech]h5preserve memory allocated with vmalloc() across kexec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM@hjhhubah}(h]h ]h"]h$]h&]uh1jShj}hhhjhM@ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujjvjjwjxjyuh1j hhhjhNhNubj{)}(hX?**Parameters** ``void *ptr`` pointer to the area in vmalloc address space ``struct kho_vmalloc *preservation`` placeholder for preservation metadata **Description** Instructs KHO to preserve the area in vmalloc address space at **ptr**. The physical pages mapped at **ptr** will be preserved and on successful return **preservation** will hold the physical address of a structure that describes the preservation. **NOTE** The memory allocated with vmalloc_node() variants cannot be reliably restored on the same node **Return** 0 on success, error code on failureh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMDhjubj)}(hhh](j)}(h;``void *ptr`` pointer to the area in vmalloc address space h](j)}(h ``void *ptr``h]j)}(hjh]h void *ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMAhjubj)}(hhh]h)}(h,pointer to the area in vmalloc address spaceh]h,pointer to the area in vmalloc address space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMAhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMAhjubj)}(hK``struct kho_vmalloc *preservation`` placeholder for preservation metadata h](j)}(h$``struct kho_vmalloc *preservation``h]j)}(hjh]h struct kho_vmalloc *preservation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMBhjubj)}(hhh]h)}(h%placeholder for preservation metadatah]h%placeholder for preservation metadata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMBhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMBhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj?h]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMDhjubh)}(hInstructs KHO to preserve the area in vmalloc address space at **ptr**. The physical pages mapped at **ptr** will be preserved and on successful return **preservation** will hold the physical address of a structure that describes the preservation.h](h?Instructs KHO to preserve the area in vmalloc address space at }(hjUhhhNhNubj)}(h**ptr**h]hptr}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh. The physical pages mapped at }(hjUhhhNhNubj)}(h**ptr**h]hptr}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh, will be preserved and on successful return }(hjUhhhNhNubj)}(h**preservation**h]h preservation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubhO will hold the physical address of a structure that describes the preservation.}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMChjubh)}(h**NOTE**h]j)}(hjh]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMHhjubh)}(h^The memory allocated with vmalloc_node() variants cannot be reliably restored on the same nodeh]h^The memory allocated with vmalloc_node() variants cannot be reliably restored on the same node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMIhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMLhjubh)}(h#0 on success, error code on failureh]h#0 on success, error code on failure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMLhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#kho_unpreserve_vmalloc (C function)c.kho_unpreserve_vmallochNtauh1jhjhhhNhNubj )}(hhh](j)}(h>void kho_unpreserve_vmalloc (struct kho_vmalloc *preservation)h]j)}(h=void kho_unpreserve_vmalloc(struct kho_vmalloc *preservation)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj hhhj hMubj?)}(hkho_unpreserve_vmalloch]jE)}(hkho_unpreserve_vmalloch]hkho_unpreserve_vmalloc}(hj) hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj% ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj hhhj hMubj^)}(h"(struct kho_vmalloc *preservation)h]jd)}(h struct kho_vmalloc *preservationh](jj)}(hjmh]hstruct}(hjE hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjA ubj.)}(h h]h }(hjR hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjA ubh)}(hhh]jE)}(h kho_vmalloch]h kho_vmalloc}(hjc hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj` ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetje modnameN classnameNjj)}j]j)}jj+ sbc.kho_unpreserve_vmallocasbuh1hhjA ubj.)}(h h]h }(hj hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjA ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA ubjE)}(h preservationh]h preservation}(hj hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjA ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj= ubah}(h]h ]h"]h$]h&]hhuh1j]hj hhhj hMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj hhhj hMubah}(h]jah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj hMhjhhubjT)}(hhh]h)}(h*unpreserve memory allocated with vmalloc()h]h*unpreserve memory allocated with vmalloc()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj hhubah}(h]h ]h"]h$]h&]uh1jShjhhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj jvj jwjxjyuh1j hhhjhNhNubj{)}(h**Parameters** ``struct kho_vmalloc *preservation`` preservation metadata returned by kho_preserve_vmalloc() **Description** Instructs KHO to unpreserve the area in vmalloc address space that was previously preserved with kho_preserve_vmalloc().h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubj)}(hhh]j)}(h^``struct kho_vmalloc *preservation`` preservation metadata returned by kho_preserve_vmalloc() h](j)}(h$``struct kho_vmalloc *preservation``h]j)}(hj !h]h struct kho_vmalloc *preservation}(hj !hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj!ubj)}(hhh]h)}(h8preservation metadata returned by kho_preserve_vmalloc()h]h8preservation metadata returned by kho_preserve_vmalloc()}(hj"!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hMhj!ubah}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]j)}(hjD!h]h Description}(hjF!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjB!ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubh)}(hxInstructs KHO to unpreserve the area in vmalloc address space that was previously preserved with kho_preserve_vmalloc().h]hxInstructs KHO to unpreserve the area in vmalloc address space that was previously preserved with kho_preserve_vmalloc().}(hjZ!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j kho_restore_vmalloc (C function)c.kho_restore_vmallochNtauh1jhjhhhNhNubj )}(hhh](j)}(hCvoid * kho_restore_vmalloc (const struct kho_vmalloc *preservation)h]j)}(hAvoid *kho_restore_vmalloc(const struct kho_vmalloc *preservation)h](j)}(hvoidh]hvoid}(hj!hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj!hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj.)}(h h]h }(hj!hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj!hhhj!hMubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!hhhj!hMubj?)}(hkho_restore_vmalloch]jE)}(hkho_restore_vmalloch]hkho_restore_vmalloc}(hj!hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj!ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj!hhhj!hMubj^)}(h((const struct kho_vmalloc *preservation)h]jd)}(h&const struct kho_vmalloc *preservationh](jj)}(hj h]hconst}(hj!hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj!ubj.)}(h h]h }(hj!hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj!ubjj)}(hjmh]hstruct}(hj!hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj!ubj.)}(h h]h }(hj!hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj!ubh)}(hhh]jE)}(h kho_vmalloch]h kho_vmalloc}(hj "hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj "ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj"modnameN classnameNjj)}j]j)}jj!sbc.kho_restore_vmallocasbuh1hhj!ubj.)}(h h]h }(hj,"hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj!ubj)}(hjh]h*}(hj:"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjE)}(h preservationh]h preservation}(hjG"hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj!ubah}(h]h ]h"]h$]h&]hhuh1j]hj!hhhj!hMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj!hhhj!hMubah}(h]j|!ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj!hMhj~!hhubjT)}(hhh]h)}(hSrecreates and populates an area in vmalloc address space from the preserved memory.h]hSrecreates and populates an area in vmalloc address space from the preserved memory.}(hjq"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjn"hhubah}(h]h ]h"]h$]h&]uh1jShj~!hhhj!hMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj"jvj"jwjxjyuh1j hhhjhNhNubj{)}(hX.**Parameters** ``const struct kho_vmalloc *preservation`` preservation metadata. **Description** Recreates an area in vmalloc address space and populates it with memory that was preserved using kho_preserve_vmalloc(). **Return** pointer to the area in the vmalloc address space, NULL on failure.h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj"ubj)}(hhh]j)}(hB``const struct kho_vmalloc *preservation`` preservation metadata. h](j)}(h*``const struct kho_vmalloc *preservation``h]j)}(hj"h]h&const struct kho_vmalloc *preservation}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj"ubj)}(hhh]h)}(hpreservation metadata.h]hpreservation metadata.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubh)}(h**Description**h]j)}(hj"h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj"ubh)}(hxRecreates an area in vmalloc address space and populates it with memory that was preserved using kho_preserve_vmalloc().h]hxRecreates an area in vmalloc address space and populates it with memory that was preserved using kho_preserve_vmalloc().}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj"ubh)}(h **Return**h]j)}(hj#h]hReturn}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj"ubh)}(hBpointer to the area in the vmalloc address space, NULL on failure.h]hBpointer to the area in the vmalloc address space, NULL on failure.}(hj*#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_alloc_preserve (C function)c.kho_alloc_preservehNtauh1jhjhhhNhNubj )}(hhh](j)}(h'void * kho_alloc_preserve (size_t size)h]j)}(h%void *kho_alloc_preserve(size_t size)h](j)}(hvoidh]hvoid}(hjY#hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjU#hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj.)}(h h]h }(hjh#hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjU#hhhjg#hMubj)}(hjh]h*}(hjv#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU#hhhjg#hMubj?)}(hkho_alloc_preserveh]jE)}(hkho_alloc_preserveh]hkho_alloc_preserve}(hj#hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj#ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjU#hhhjg#hMubj^)}(h (size_t size)h]jd)}(h size_t sizeh](h)}(hhh]jE)}(hsize_th]hsize_t}(hj#hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj#ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj#modnameN classnameNjj)}j]j)}jj#sbc.kho_alloc_preserveasbuh1hhj#ubj.)}(h h]h }(hj#hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj#ubjE)}(hsizeh]hsize}(hj#hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj#ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj#ubah}(h]h ]h"]h$]h&]hhuh1j]hjU#hhhjg#hMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjQ#hhhjg#hMubah}(h]jL#ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjg#hMhjN#hhubjT)}(hhh]h)}(h$Allocate, zero, and preserve memory.h]h$Allocate, zero, and preserve memory.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj#hhubah}(h]h ]h"]h$]h&]uh1jShjN#hhhjg#hMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj$jvj$jwjxjyuh1j hhhjhNhNubj{)}(hX**Parameters** ``size_t size`` The number of bytes to allocate. **Description** Allocates a physically contiguous block of zeroed pages that is large enough to hold **size** bytes. The allocated memory is then registered with KHO for preservation across a kexec. **Note** The actual allocated size will be rounded up to the nearest power-of-two page boundary. **return** A virtual pointer to the allocated and preserved memory on success, or an ERR_PTR() encoded error on failure.h](h)}(h**Parameters**h]j)}(hj $h]h Parameters}(hj"$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj$ubj)}(hhh]j)}(h1``size_t size`` The number of bytes to allocate. h](j)}(h``size_t size``h]j)}(hj?$h]h size_t size}(hjA$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=$ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj9$ubj)}(hhh]h)}(h The number of bytes to allocate.h]h The number of bytes to allocate.}(hjX$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjT$hMhjU$ubah}(h]h ]h"]h$]h&]uh1jhj9$ubeh}(h]h ]h"]h$]h&]uh1jhjT$hMhj6$ubah}(h]h ]h"]h$]h&]uh1jhj$ubh)}(h**Description**h]j)}(hjz$h]h Description}(hj|$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx$ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj$ubh)}(hAllocates a physically contiguous block of zeroed pages that is large enough to hold **size** bytes. The allocated memory is then registered with KHO for preservation across a kexec.h](hUAllocates a physically contiguous block of zeroed pages that is large enough to hold }(hj$hhhNhNubj)}(h**size**h]hsize}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubhY bytes. The allocated memory is then registered with KHO for preservation across a kexec.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj$ubh)}(h**Note**h]j)}(hj$h]hNote}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj$ubh)}(hWThe actual allocated size will be rounded up to the nearest power-of-two page boundary.h]hWThe actual allocated size will be rounded up to the nearest power-of-two page boundary.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj$ubh)}(hx**return** A virtual pointer to the allocated and preserved memory on success, or an ERR_PTR() encoded error on failure.h](j)}(h **return**h]hreturn}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubhn A virtual pointer to the allocated and preserved memory on success, or an ERR_PTR() encoded error on failure.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j kho_unpreserve_free (C function)c.kho_unpreserve_freehNtauh1jhjhhhNhNubj )}(hhh](j)}(h$void kho_unpreserve_free (void *mem)h]j)}(h#void kho_unpreserve_free(void *mem)h](j)}(hvoidh]hvoid}(hj%hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj%hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM$ubj.)}(h h]h }(hj$%hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj%hhhj#%hM$ubj?)}(hkho_unpreserve_freeh]jE)}(hkho_unpreserve_freeh]hkho_unpreserve_free}(hj6%hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj2%ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj%hhhj#%hM$ubj^)}(h (void *mem)h]jd)}(h void *memh](j)}(hvoidh]hvoid}(hjR%hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjN%ubj.)}(h h]h }(hj`%hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjN%ubj)}(hjh]h*}(hjn%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN%ubjE)}(hmemh]hmem}(hj{%hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjN%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjJ%ubah}(h]h ]h"]h$]h&]hhuh1j]hj%hhhj#%hM$ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj %hhhj#%hM$ubah}(h]j%ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj#%hM$hj %hhubjT)}(hhh]h)}(hUnpreserve and free memory.h]hUnpreserve and free memory.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM$hj%hhubah}(h]h ]h"]h$]h&]uh1jShj %hhhj#%hM$ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj%jvj%jwjxjyuh1j hhhjhNhNubj{)}(hX!**Parameters** ``void *mem`` Pointer to the memory allocated by kho_alloc_preserve(). **Description** Unregisters the memory from KHO preservation and frees the underlying pages back to the system. This function should be called to clean up memory allocated with kho_alloc_preserve().h](h)}(h**Parameters**h]j)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM(hj%ubj)}(hhh]j)}(hG``void *mem`` Pointer to the memory allocated by kho_alloc_preserve(). h](j)}(h ``void *mem``h]j)}(hj%h]h void *mem}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM%hj%ubj)}(hhh]h)}(h8Pointer to the memory allocated by kho_alloc_preserve().h]h8Pointer to the memory allocated by kho_alloc_preserve().}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hM%hj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hM%hj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubh)}(h**Description**h]j)}(hj!&h]h Description}(hj#&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM'hj%ubh)}(hUnregisters the memory from KHO preservation and frees the underlying pages back to the system. This function should be called to clean up memory allocated with kho_alloc_preserve().h]hUnregisters the memory from KHO preservation and frees the underlying pages back to the system. This function should be called to clean up memory allocated with kho_alloc_preserve().}(hj7&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM&hj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_restore_free (C function)c.kho_restore_freehNtauh1jhjhhhNhNubj )}(hhh](j)}(h!void kho_restore_free (void *mem)h]j)}(h void kho_restore_free(void *mem)h](j)}(hvoidh]hvoid}(hjf&hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjb&hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM9ubj.)}(h h]h }(hju&hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjb&hhhjt&hM9ubj?)}(hkho_restore_freeh]jE)}(hkho_restore_freeh]hkho_restore_free}(hj&hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj&ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjb&hhhjt&hM9ubj^)}(h (void *mem)h]jd)}(h void *memh](j)}(hvoidh]hvoid}(hj&hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj&ubj.)}(h h]h }(hj&hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj&ubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubjE)}(hmemh]hmem}(hj&hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj&ubah}(h]h ]h"]h$]h&]hhuh1j]hjb&hhhjt&hM9ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj^&hhhjt&hM9ubah}(h]jY&ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjt&hM9hj[&hhubjT)}(hhh]h)}(h$Restore and free memory after kexec.h]h$Restore and free memory after kexec.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM9hj&hhubah}(h]h ]h"]h$]h&]uh1jShj[&hhhjt&hM9ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj'jvj'jwjxjyuh1j hhhjhNhNubj{)}(hX**Parameters** ``void *mem`` Pointer to the memory (in the new kernel's address space) that was allocated by the old kernel. **Description** This function is intended to be called in the new kernel (post-kexec) to take ownership of and free a memory region that was preserved by the old kernel using kho_alloc_preserve(). It first restores the pages from KHO (using their physical address) and then frees the pages back to the new kernel's page allocator.h](h)}(h**Parameters**h]j)}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM=hj'ubj)}(hhh]j)}(hn``void *mem`` Pointer to the memory (in the new kernel's address space) that was allocated by the old kernel. h](j)}(h ``void *mem``h]j)}(hj7'h]h void *mem}(hj9'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5'ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM;hj1'ubj)}(hhh]h)}(h_Pointer to the memory (in the new kernel's address space) that was allocated by the old kernel.h]haPointer to the memory (in the new kernel’s address space) that was allocated by the old kernel.}(hjP'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM:hjM'ubah}(h]h ]h"]h$]h&]uh1jhj1'ubeh}(h]h ]h"]h$]h&]uh1jhjL'hM;hj.'ubah}(h]h ]h"]h$]h&]uh1jhj'ubh)}(h**Description**h]j)}(hjs'h]h Description}(hju'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq'ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM=hj'ubh)}(hThis function is intended to be called in the new kernel (post-kexec) to take ownership of and free a memory region that was preserved by the old kernel using kho_alloc_preserve().h]hThis function is intended to be called in the new kernel (post-kexec) to take ownership of and free a memory region that was preserved by the old kernel using kho_alloc_preserve().}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM<hj'ubh)}(hIt first restores the pages from KHO (using their physical address) and then frees the pages back to the new kernel's page allocator.h]hIt first restores the pages from KHO (using their physical address) and then frees the pages back to the new kernel’s page allocator.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM@hj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jis_kho_boot (C function) c.is_kho_boothNtauh1jhjhhhNhNubj )}(hhh](j)}(hbool is_kho_boot (void)h]j)}(hbool is_kho_boot(void)h](j)}(hboolh]hbool}(hj'hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj'hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMRubj.)}(h h]h }(hj'hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj'hhhj'hMRubj?)}(h is_kho_booth]jE)}(h is_kho_booth]h is_kho_boot}(hj'hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj'ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj'hhhj'hMRubj^)}(h(void)h]jd)}(hvoidh]j)}(hvoidh]hvoid}(hj(hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]noemphhhuh1jchj'ubah}(h]h ]h"]h$]h&]hhuh1j]hj'hhhj'hMRubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj'hhhj'hMRubah}(h]j'ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj'hMRhj'hhubjT)}(hhh]h)}(h8check if current kernel was booted via KHO-enabled kexech]h8check if current kernel was booted via KHO-enabled kexec}(hj.(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMRhj+(hhubah}(h]h ]h"]h$]h&]uh1jShj'hhhj'hMRubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujF(jvjF(jwjxjyuh1j hhhjhNhNubj{)}(hX**Parameters** ``void`` no arguments **Description** This function checks if the current kernel was loaded through a kexec operation with KHO enabled, by verifying that a valid KHO FDT was passed. **Note** This function returns reliable results only after kho_populate() has been called during early boot. Before that, it may return false even if KHO data is present. **Return** true if booted via KHO-enabled kexec, false otherwiseh](h)}(h**Parameters**h]j)}(hjP(h]h Parameters}(hjR(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN(ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMVhjJ(ubj)}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hjo(h]hvoid}(hjq(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm(ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhji(ubj)}(hhh]h)}(h no argumentsh]h no arguments}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hKhj(ubah}(h]h ]h"]h$]h&]uh1jhji(ubeh}(h]h ]h"]h$]h&]uh1jhj(hKhjf(ubah}(h]h ]h"]h$]h&]uh1jhjJ(ubh)}(h**Description**h]j)}(hj(h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhjJ(ubh)}(hThis function checks if the current kernel was loaded through a kexec operation with KHO enabled, by verifying that a valid KHO FDT was passed.h]hThis function checks if the current kernel was loaded through a kexec operation with KHO enabled, by verifying that a valid KHO FDT was passed.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMShjJ(ubh)}(h**Note**h]j)}(hj(h]hNote}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMWhjJ(ubh)}(hThis function returns reliable results only after kho_populate() has been called during early boot. Before that, it may return false even if KHO data is present.h]hThis function returns reliable results only after kho_populate() has been called during early boot. Before that, it may return false even if KHO data is present.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMYhjJ(ubh)}(h **Return**h]j)}(hj(h]hReturn}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM]hjJ(ubh)}(h5true if booted via KHO-enabled kexec, false otherwiseh]h5true if booted via KHO-enabled kexec, false otherwise}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM]hjJ(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!kho_retrieve_subtree (C function)c.kho_retrieve_subtreehNtauh1jhjhhhNhNubj )}(hhh](j)}(hLint kho_retrieve_subtree (const char *name, phys_addr_t *phys, size_t *size)h]j)}(hKint kho_retrieve_subtree(const char *name, phys_addr_t *phys, size_t *size)h](j)}(hinth]hint}(hj=)hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj9)hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMfubj.)}(h h]h }(hjL)hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj9)hhhjK)hMfubj?)}(hkho_retrieve_subtreeh]jE)}(hkho_retrieve_subtreeh]hkho_retrieve_subtree}(hj^)hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjZ)ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj9)hhhjK)hMfubj^)}(h3(const char *name, phys_addr_t *phys, size_t *size)h](jd)}(hconst char *nameh](jj)}(hj h]hconst}(hjz)hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjv)ubj.)}(h h]h }(hj)hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjv)ubj)}(hcharh]hchar}(hj)hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjv)ubj.)}(h h]h }(hj)hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjv)ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv)ubjE)}(hnameh]hname}(hj)hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjv)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjr)ubjd)}(hphys_addr_t *physh](h)}(hhh]jE)}(h phys_addr_th]h phys_addr_t}(hj)hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj)ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj)modnameN classnameNjj)}j]j)}jj`)sbc.kho_retrieve_subtreeasbuh1hhj)ubj.)}(h h]h }(hj)hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj)ubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubjE)}(hphysh]hphys}(hj*hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjr)ubjd)}(h size_t *sizeh](h)}(hhh]jE)}(hsize_th]hsize_t}(hj1*hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj.*ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj3*modnameN classnameNjj)}j]j)c.kho_retrieve_subtreeasbuh1hhj**ubj.)}(h h]h }(hjO*hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj**ubj)}(hjh]h*}(hj]*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj**ubjE)}(hsizeh]hsize}(hjj*hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj**ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjr)ubeh}(h]h ]h"]h$]h&]hhuh1j]hj9)hhhjK)hMfubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj5)hhhjK)hMfubah}(h]j0)ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjK)hMfhj2)hhubjT)}(hhh]h)}(h*retrieve a preserved sub blob by its name.h]h*retrieve a preserved sub blob by its name.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMfhj*hhubah}(h]h ]h"]h$]h&]uh1jShj2)hhhjK)hMfubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj*jvj*jwjxjyuh1j hhhjhNhNubj{)}(hX**Parameters** ``const char *name`` the name of the sub blob passed to kho_add_subtree(). ``phys_addr_t *phys`` if found, the physical address of the sub blob is stored in **phys**. ``size_t *size`` if not NULL and found, the size of the sub blob is stored in **size**. **Description** Retrieve a preserved sub blob named **name** and store its physical address in **phys** and optionally its size in **size**. **Return** 0 on success, error code on failureh](h)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMjhj*ubj)}(hhh](j)}(hK``const char *name`` the name of the sub blob passed to kho_add_subtree(). h](j)}(h``const char *name``h]j)}(hj*h]hconst char *name}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMghj*ubj)}(hhh]h)}(h5the name of the sub blob passed to kho_add_subtree().h]h5the name of the sub blob passed to kho_add_subtree().}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMghj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMghj*ubj)}(h\``phys_addr_t *phys`` if found, the physical address of the sub blob is stored in **phys**. h](j)}(h``phys_addr_t *phys``h]j)}(hj+h]hphys_addr_t *phys}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj +ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhhj+ubj)}(hhh]h)}(hEif found, the physical address of the sub blob is stored in **phys**.h](hhj{,hhhj,hKubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjw,hhhj,hKubah}(h]jr,ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj,hKhjt,hhubjT)}(hhh]h)}(h1Internal representation of a serialization block.h]h1Internal representation of a serialization block.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj,hhubah}(h]h ]h"]h$]h&]uh1jShjt,hhhj,hKubeh}(h]h ](jstructeh"]h$]h&]jtjjuj,jvj,jwjxjyuh1j hhhj7,hNhNubj{)}(h**Definition**:: struct kho_block { struct list_head list; struct kho_block_header_ser *ser; }; **Members** ``list`` List head for linking blocks in memory. ``ser`` Pointer to the serialized header in preserved memory.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh:}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj,ubh literal_block)}(hVstruct kho_block { struct list_head list; struct kho_block_header_ser *ser; };h]hVstruct kho_block { struct list_head list; struct kho_block_header_ser *ser; };}hj-sbah}(h]h ]h"]h$]h&]hhuh1j,h\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj,ubh)}(h **Members**h]j)}(hj-h]hMembers}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj,ubj)}(hhh](j)}(h1``list`` List head for linking blocks in memory. h](j)}(h``list``h]j)}(hj0-h]hlist}(hj2-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.-ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj*-ubj)}(hhh]h)}(h'List head for linking blocks in memory.h]h'List head for linking blocks in memory.}(hjI-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjE-hKhjF-ubah}(h]h ]h"]h$]h&]uh1jhj*-ubeh}(h]h ]h"]h$]h&]uh1jhjE-hKhj'-ubj)}(h=``ser`` Pointer to the serialized header in preserved memory.h](j)}(h``ser``h]j)}(hji-h]hser}(hjk-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg-ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhjc-ubj)}(hhh]h)}(h5Pointer to the serialized header in preserved memory.h]h5Pointer to the serialized header in preserved memory.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj-ubah}(h]h ]h"]h$]h&]uh1jhjc-ubeh}(h]h ]h"]h$]h&]uh1jhj~-hKhj'-ubeh}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_block_set (C struct)c.kho_block_sethNtauh1jhj7,hhhNhNubj )}(hhh](j)}(h kho_block_seth]j)}(hstruct kho_block_seth](jj)}(hjmh]hstruct}(hj-hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj-hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKubj.)}(h h]h }(hj-hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj-hhhj-hKubj?)}(h kho_block_seth]jE)}(hj-h]h kho_block_set}(hj-hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj-ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj-hhhj-hKubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj-hhhj-hKubah}(h]j-ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj-hKhj-hhubjT)}(hhh]h)}(h?A set of blocks containing serialized entries of the same type.h]h?A set of blocks containing serialized entries of the same type.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj.hhubah}(h]h ]h"]h$]h&]uh1jShj-hhhj-hKubeh}(h]h ](jstructeh"]h$]h&]jtjjuj.jvj.jwjxjyuh1j hhhj7,hNhNubj{)}(hXV**Definition**:: struct kho_block_set { struct list_head blocks; long nblocks; u64 head_pa; size_t entry_size; u64 count_per_block; bool incoming; }; **Members** ``blocks`` The list of serialization blocks (struct kho_block). ``nblocks`` The number of allocated serialization blocks. ``head_pa`` Physical address of the first block header. ``entry_size`` The size of each entry in the blocks. ``count_per_block`` The maximum number of entries each block can hold. ``incoming`` True if this block set was restored from the previous kernel.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj).hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%.ubh:}(hj%.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj!.ubj,)}(hstruct kho_block_set { struct list_head blocks; long nblocks; u64 head_pa; size_t entry_size; u64 count_per_block; bool incoming; };h]hstruct kho_block_set { struct list_head blocks; long nblocks; u64 head_pa; size_t entry_size; u64 count_per_block; bool incoming; };}hjB.sbah}(h]h ]h"]h$]h&]hhuh1j,h\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj!.ubh)}(h **Members**h]j)}(hjS.h]hMembers}(hjU.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ.ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK(hj!.ubj)}(hhh](j)}(h@``blocks`` The list of serialization blocks (struct kho_block). h](j)}(h ``blocks``h]j)}(hjr.h]hblocks}(hjt.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp.ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhjl.ubj)}(hhh]h)}(h4The list of serialization blocks (struct kho_block).h]h4The list of serialization blocks (struct kho_block).}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKhj.ubah}(h]h ]h"]h$]h&]uh1jhjl.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhji.ubj)}(h:``nblocks`` The number of allocated serialization blocks. h](j)}(h ``nblocks``h]j)}(hj.h]hnblocks}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj.ubj)}(hhh]h)}(h-The number of allocated serialization blocks.h]h-The number of allocated serialization blocks.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhji.ubj)}(h8``head_pa`` Physical address of the first block header. h](j)}(h ``head_pa``h]j)}(hj.h]hhead_pa}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj.ubj)}(hhh]h)}(h+Physical address of the first block header.h]h+Physical address of the first block header.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hKhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhji.ubj)}(h5``entry_size`` The size of each entry in the blocks. h](j)}(h``entry_size``h]j)}(hj/h]h entry_size}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj/ubj)}(hhh]h)}(h%The size of each entry in the blocks.h]h%The size of each entry in the blocks.}(hj6/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2/hKhj3/ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj2/hKhji.ubj)}(hG``count_per_block`` The maximum number of entries each block can hold. h](j)}(h``count_per_block``h]j)}(hjV/h]hcount_per_block}(hjX/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT/ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhjP/ubj)}(hhh]h)}(h2The maximum number of entries each block can hold.h]h2The maximum number of entries each block can hold.}(hjo/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjk/hKhjl/ubah}(h]h ]h"]h$]h&]uh1jhjP/ubeh}(h]h ]h"]h$]h&]uh1jhjk/hKhji.ubj)}(hJ``incoming`` True if this block set was restored from the previous kernel.h](j)}(h ``incoming``h]j)}(hj/h]hincoming}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj/ubj)}(hhh]h)}(h=True if this block set was restored from the previous kernel.h]h=True if this block set was restored from the previous kernel.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK hj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj/hKhji.ubeh}(h]h ]h"]h$]h&]uh1jhj!.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubh)}(h**Note**h]j)}(hj/h]hNote}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK#hj7,hhubh)}(hSynchronization and locking are the responsibility of the caller. The block set structure itself is not internally synchronized.h]hSynchronization and locking are the responsibility of the caller. The block set structure itself is not internally synchronized.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK!hj7,hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_block_set_it (C struct)c.kho_block_set_ithNtauh1jhj7,hhhNhNubj )}(hhh](j)}(hkho_block_set_ith]j)}(hstruct kho_block_set_ith](jj)}(hjmh]hstruct}(hj0hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj 0hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK'ubj.)}(h h]h }(hj0hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj 0hhhj0hK'ubj?)}(hkho_block_set_ith]jE)}(hj 0h]hkho_block_set_it}(hj00hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj,0ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj 0hhhj0hK'ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj0hhhj0hK'ubah}(h]j0ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj0hK'hj0hhubjT)}(hhh]h)}(h-Iterator for serializing entries into blocks.h]h-Iterator for serializing entries into blocks.}(hjR0hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK.hjO0hhubah}(h]h ]h"]h$]h&]uh1jShj0hhhj0hK'ubeh}(h]h ](jstructeh"]h$]h&]jtjjujj0jvjj0jwjxjyuh1j hhhj7,hNhNubj{)}(hX**Definition**:: struct kho_block_set_it { struct kho_block_set *bs; struct kho_block *block; u64 i; }; **Members** ``bs`` The block set being iterated. ``block`` The current block. ``i`` The current entry index within **block**.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjv0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjr0ubh:}(hjr0hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK2hjn0ubj,)}(hbstruct kho_block_set_it { struct kho_block_set *bs; struct kho_block *block; u64 i; };h]hbstruct kho_block_set_it { struct kho_block_set *bs; struct kho_block *block; u64 i; };}hj0sbah}(h]h ]h"]h$]h&]hhuh1j,h\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK4hjn0ubh)}(h **Members**h]j)}(hj0h]hMembers}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK:hjn0ubj)}(hhh](j)}(h%``bs`` The block set being iterated. h](j)}(h``bs``h]j)}(hj0h]hbs}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK0hj0ubj)}(hhh]h)}(hThe block set being iterated.h]hThe block set being iterated.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hK0hj0ubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hK0hj0ubj)}(h``block`` The current block. h](j)}(h ``block``h]j)}(hj0h]hblock}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK1hj0ubj)}(hhh]h)}(hThe current block.h]hThe current block.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 1hK1hj1ubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhj 1hK1hj0ubj)}(h/``i`` The current entry index within **block**.h](j)}(h``i``h]j)}(hj11h]hi}(hj31hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/1ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK1hj+1ubj)}(hhh]h)}(h)The current entry index within **block**.h](hThe current entry index within }(hjJ1hhhNhNubj)}(h **block**h]hblock}(hjR1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ1ubh.}(hjJ1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK2hjG1ubah}(h]h ]h"]h$]h&]uh1jhj+1ubeh}(h]h ]h"]h$]h&]uh1jhjF1hK1hj0ubeh}(h]h ]h"]h$]h&]uh1jhjn0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jKHO_BLOCK_SET_INIT (C macro)c.KHO_BLOCK_SET_INIThNtauh1jhj7,hhhNhNubj )}(hhh](j)}(hKHO_BLOCK_SET_INITh]j)}(hKHO_BLOCK_SET_INITh]j?)}(hKHO_BLOCK_SET_INITh]jE)}(hj1h]hKHO_BLOCK_SET_INIT}(hj1hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj1ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj1hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK:ubah}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj1hhhj1hK:ubah}(h]j1ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj1hK:hj1hhubjT)}(hhh]h}(h]h ]h"]h$]h&]uh1jShj1hhhj1hK:ubeh}(h]h ](jmacroeh"]h$]h&]jtjjuj1jvj1jwjxjyuh1j hhhj7,hNhNubh)}(h+``KHO_BLOCK_SET_INIT (_name, _entry_size)``h]j)}(hj1h]h'KHO_BLOCK_SET_INIT (_name, _entry_size)}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj2ubj)}(hhh](j)}(h.``_name`` Name of the kho_block_set variable. h](j)}(h ``_name``h]j)}(hj)2h]h_name}(hj+2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'2ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK;hj#2ubj)}(hhh]h)}(h#Name of the kho_block_set variable.h]h#Name of the kho_block_set variable.}(hjB2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>2hK;hj?2ubah}(h]h ]h"]h$]h&]uh1jhj#2ubeh}(h]h ]h"]h$]h&]uh1jhj>2hK;hj 2ubj)}(h8``_entry_size`` The size of each entry in the block set.h](j)}(h``_entry_size``h]j)}(hjb2h]h _entry_size}(hjd2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`2ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK=hj\2ubj)}(hhh]h)}(h(The size of each entry in the block set.h]h(The size of each entry in the block set.}(hj{2hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj2hhhj2hKPubj^)}(h(struct kho_block_set *bs)h]jd)}(hstruct kho_block_set *bsh](jj)}(hjmh]hstruct}(hj3hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj 3ubj.)}(h h]h }(hj3hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj 3ubh)}(hhh]jE)}(h kho_block_seth]h kho_block_set}(hj,3hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj)3ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj.3modnameN classnameNjj)}j]j2c.kho_block_set_head_paasbuh1hhj 3ubj.)}(h h]h }(hjJ3hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj 3ubj)}(hjh]h*}(hjX3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 3ubjE)}(hbsh]hbs}(hje3hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj 3ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj3ubah}(h]h ]h"]h$]h&]hhuh1j]hj2hhhj2hKPubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj2hhhj2hKPubah}(h]j2ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj2hKPhj2hhubjT)}(hhh]h)}(h3Get the physical address of the first block header.h]h3Get the physical address of the first block header.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKPhj3hhubah}(h]h ]h"]h$]h&]uh1jShj2hhhj2hKPubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj3jvj3jwjxjyuh1j hhhj7,hNhNubj{)}(h**Parameters** ``struct kho_block_set *bs`` The block set. **Return** The physical address of the first block header, or 0 if empty.h](h)}(h**Parameters**h]j)}(hj3h]h Parameters}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKThj3ubj)}(hhh]j)}(h,``struct kho_block_set *bs`` The block set. h](j)}(h``struct kho_block_set *bs``h]j)}(hj3h]hstruct kho_block_set *bs}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKQhj3ubj)}(hhh]h)}(hThe block set.h]hThe block set.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hKQhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hKQhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubh)}(h **Return**h]j)}(hj 4h]hReturn}(hj 4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 4ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKShj3ubh)}(h>The physical address of the first block header, or 0 if empty.h]h>The physical address of the first block header, or 0 if empty.}(hj!4hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKShj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#kho_block_set_is_empty (C function)c.kho_block_set_is_emptyhNtauh1jhj7,hhhNhNubj )}(hhh](j)}(h6bool kho_block_set_is_empty (struct kho_block_set *bs)h]j)}(h5bool kho_block_set_is_empty(struct kho_block_set *bs)h](j)}(hj'h]hbool}(hjP4hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjL4hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK[ubj.)}(h h]h }(hj^4hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjL4hhhj]4hK[ubj?)}(hkho_block_set_is_emptyh]jE)}(hkho_block_set_is_emptyh]hkho_block_set_is_empty}(hjp4hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjl4ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjL4hhhj]4hK[ubj^)}(h(struct kho_block_set *bs)h]jd)}(hstruct kho_block_set *bsh](jj)}(hjmh]hstruct}(hj4hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj4ubj.)}(h h]h }(hj4hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj4ubh)}(hhh]jE)}(h kho_block_seth]h kho_block_set}(hj4hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj4modnameN classnameNjj)}j]j)}jjr4sbc.kho_block_set_is_emptyasbuh1hhj4ubj.)}(h h]h }(hj4hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj4ubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubjE)}(hbsh]hbs}(hj4hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj4ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj4ubah}(h]h ]h"]h$]h&]hhuh1j]hjL4hhhj]4hK[ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjH4hhhj]4hK[ubah}(h]jC4ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj]4hK[hjE4hhubjT)}(hhh]h)}(h/Check if the block set has no allocated blocks.h]h/Check if the block set has no allocated blocks.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK[hj 5hhubah}(h]h ]h"]h$]h&]uh1jShjE4hhhj]4hK[ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj'5jvj'5jwjxjyuh1j hhhj7,hNhNubj{)}(h**Parameters** ``struct kho_block_set *bs`` The block set. **Return** True if there are no blocks in the set, false otherwise.h](h)}(h**Parameters**h]j)}(hj15h]h Parameters}(hj35hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/5ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK_hj+5ubj)}(hhh]j)}(h,``struct kho_block_set *bs`` The block set. h](j)}(h``struct kho_block_set *bs``h]j)}(hjP5h]hstruct kho_block_set *bs}(hjR5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN5ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK\hjJ5ubj)}(hhh]h)}(hThe block set.h]hThe block set.}(hji5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhje5hK\hjf5ubah}(h]h ]h"]h$]h&]uh1jhjJ5ubeh}(h]h ]h"]h$]h&]uh1jhje5hK\hjG5ubah}(h]h ]h"]h$]h&]uh1jhj+5ubh)}(h **Return**h]j)}(hj5h]hReturn}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK^hj+5ubh)}(h8True if there are no blocks in the set, false otherwise.h]h8True if there are no blocks in the set, false otherwise.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK^hj+5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_block_set_init (C function)c.kho_block_set_inithNtauh1jhj7,hhhNhNubj )}(hhh](j)}(hEvoid kho_block_set_init (struct kho_block_set *bs, size_t entry_size)h]j)}(hDvoid kho_block_set_init(struct kho_block_set *bs, size_t entry_size)h](j)}(hvoidh]hvoid}(hj5hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj5hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK)ubj.)}(h h]h }(hj5hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj5hhhj5hK)ubj?)}(hkho_block_set_inith]jE)}(hkho_block_set_inith]hkho_block_set_init}(hj5hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj5ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj5hhhj5hK)ubj^)}(h-(struct kho_block_set *bs, size_t entry_size)h](jd)}(hstruct kho_block_set *bsh](jj)}(hjmh]hstruct}(hj 6hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj 6ubj.)}(h h]h }(hj6hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj 6ubh)}(hhh]jE)}(h kho_block_seth]h kho_block_set}(hj+6hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj(6ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj-6modnameN classnameNjj)}j]j)}jj5sbc.kho_block_set_initasbuh1hhj 6ubj.)}(h h]h }(hjK6hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj 6ubj)}(hjh]h*}(hjY6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 6ubjE)}(hbsh]hbs}(hjf6hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj 6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj6ubjd)}(hsize_t entry_sizeh](h)}(hhh]jE)}(hsize_th]hsize_t}(hj6hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj6ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj6modnameN classnameNjj)}j]jG6c.kho_block_set_initasbuh1hhj{6ubj.)}(h h]h }(hj6hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj{6ubjE)}(h entry_sizeh]h entry_size}(hj6hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj{6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj6ubeh}(h]h ]h"]h$]h&]hhuh1j]hj5hhhj5hK)ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj5hhhj5hK)ubah}(h]j5ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj5hK)hj5hhubjT)}(hhh]h)}(hInitialize a block set.h]hInitialize a block set.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK)hj6hhubah}(h]h ]h"]h$]h&]uh1jShj5hhhj5hK)ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj6jvj6jwjxjyuh1j hhhj7,hNhNubj{)}(h**Parameters** ``struct kho_block_set *bs`` The block set to initialize. ``size_t entry_size`` The size of each entry in the blocks.h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK-hj6ubj)}(hhh](j)}(h:``struct kho_block_set *bs`` The block set to initialize. h](j)}(h``struct kho_block_set *bs``h]j)}(hj7h]hstruct kho_block_set *bs}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK*hj7ubj)}(hhh]h)}(hThe block set to initialize.h]hThe block set to initialize.}(hj27hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.7hK*hj/7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj.7hK*hj7ubj)}(h;``size_t entry_size`` The size of each entry in the blocks.h](j)}(h``size_t entry_size``h]j)}(hjR7h]hsize_t entry_size}(hjT7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP7ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK,hjL7ubj)}(hhh]h)}(h%The size of each entry in the blocks.h]h%The size of each entry in the blocks.}(hjk7hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK+hjh7ubah}(h]h ]h"]h$]h&]uh1jhjL7ubeh}(h]h ]h"]h$]h&]uh1jhjg7hK,hj7ubeh}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_block_set_grow (C function)c.kho_block_set_growhNtauh1jhj7,hhhNhNubj )}(hhh](j)}(hhj7hhhj7hKubj^)}(h%(struct kho_block_set *bs, u64 count)h](jd)}(hstruct kho_block_set *bsh](jj)}(hjmh]hstruct}(hj7hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj7ubj.)}(h h]h }(hj7hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj7ubh)}(hhh]jE)}(h kho_block_seth]h kho_block_set}(hj8hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj8ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj 8modnameN classnameNjj)}j]j)}jj7sbc.kho_block_set_growasbuh1hhj7ubj.)}(h h]h }(hj'8hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj7ubj)}(hjh]h*}(hj58hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubjE)}(hbsh]hbs}(hjB8hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj7ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj7ubjd)}(h u64 counth](h)}(hhh]jE)}(hu64h]hu64}(hj^8hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj[8ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj`8modnameN classnameNjj)}j]j#8c.kho_block_set_growasbuh1hhjW8ubj.)}(h h]h }(hj|8hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjW8ubjE)}(hcounth]hcount}(hj8hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjW8ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj7ubeh}(h]h ]h"]h$]h&]hhuh1j]hj7hhhj7hKubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj7hhhj7hKubah}(h]j7ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj7hKhj7hhubjT)}(hhh]h)}(h5Expand the block set to accommodate the target count.h]h5Expand the block set to accommodate the target count.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj8hhubah}(h]h ]h"]h$]h&]uh1jShj7hhhj7hKubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj8jvj8jwjxjyuh1j hhhj7,hNhNubj{)}(hX**Parameters** ``struct kho_block_set *bs`` The block set. ``u64 count`` The target number of valid entries to accommodate. **Description** Dynamically preallocates and links preserved memory blocks if the target entry count exceeds the current total capacity of the set, ensuring they are available during serialization/deserialization. **Context** Caller must hold a lock protecting the block set. **Return** 0 on success, or a negative errno on failure.h](h)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj8ubj)}(hhh](j)}(h,``struct kho_block_set *bs`` The block set. h](j)}(h``struct kho_block_set *bs``h]j)}(hj8h]hstruct kho_block_set *bs}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj8ubj)}(hhh]h)}(hThe block set.h]hThe block set.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 9hKhj 9ubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhj 9hKhj8ubj)}(hA``u64 count`` The target number of valid entries to accommodate. h](j)}(h ``u64 count``h]j)}(hj.9h]h u64 count}(hj09hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,9ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj(9ubj)}(hhh]h)}(h2The target number of valid entries to accommodate.h]h2The target number of valid entries to accommodate.}(hjG9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC9hKhjD9ubah}(h]h ]h"]h$]h&]uh1jhj(9ubeh}(h]h ]h"]h$]h&]uh1jhjC9hKhj8ubeh}(h]h ]h"]h$]h&]uh1jhj8ubh)}(h**Description**h]j)}(hji9h]h Description}(hjk9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg9ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj8ubh)}(hDynamically preallocates and links preserved memory blocks if the target entry count exceeds the current total capacity of the set, ensuring they are available during serialization/deserialization.h]hDynamically preallocates and links preserved memory blocks if the target entry count exceeds the current total capacity of the set, ensuring they are available during serialization/deserialization.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj8ubh)}(h **Context**h]j)}(hj9h]hContext}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj8ubh)}(h1Caller must hold a lock protecting the block set.h]h1Caller must hold a lock protecting the block set.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj8ubh)}(h **Return**h]j)}(hj9h]hReturn}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj8ubh)}(h-0 on success, or a negative errno on failure.h]h-0 on success, or a negative errno on failure.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!kho_block_set_shrink (C function)c.kho_block_set_shrinkhNtauh1jhj7,hhhNhNubj )}(hhh](j)}(h?void kho_block_set_shrink (struct kho_block_set *bs, u64 count)h]j)}(h>void kho_block_set_shrink(struct kho_block_set *bs, u64 count)h](j)}(hvoidh]hvoid}(hj9hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj9hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKubj.)}(h h]h }(hj :hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj9hhhj :hKubj?)}(hkho_block_set_shrinkh]jE)}(hkho_block_set_shrinkh]hkho_block_set_shrink}(hj:hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj:ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj9hhhj :hKubj^)}(h%(struct kho_block_set *bs, u64 count)h](jd)}(hstruct kho_block_set *bsh](jj)}(hjmh]hstruct}(hj9:hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj5:ubj.)}(h h]h }(hjF:hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj5:ubh)}(hhh]jE)}(h kho_block_seth]h kho_block_set}(hjW:hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjT:ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjY:modnameN classnameNjj)}j]j)}jj:sbc.kho_block_set_shrinkasbuh1hhj5:ubj.)}(h h]h }(hjw:hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj5:ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5:ubjE)}(hbsh]hbs}(hj:hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj5:ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj1:ubjd)}(h u64 counth](h)}(hhh]jE)}(hu64h]hu64}(hj:hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj:ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj:modnameN classnameNjj)}j]js:c.kho_block_set_shrinkasbuh1hhj:ubj.)}(h h]h }(hj:hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj:ubjE)}(hcounth]hcount}(hj:hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj:ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj1:ubeh}(h]h ]h"]h$]h&]hhuh1j]hj9hhhj :hKubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj9hhhj :hKubah}(h]j9ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj :hKhj9hhubjT)}(hhh]h)}(h5Shrink the block set to accommodate the target count.h]h5Shrink the block set to accommodate the target count.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj;hhubah}(h]h ]h"]h$]h&]uh1jShj9hhhj :hKubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj;jvj;jwjxjyuh1j hhhj7,hNhNubj{)}(hX**Parameters** ``struct kho_block_set *bs`` The block set. ``u64 count`` The target number of valid entries to accommodate. **Description** Releases and unallocates redundant preserved memory blocks. Checks if the last block in the set can be removed because the remaining entry count is fully accommodated by the preceding blocks. **Note** It is the caller's responsibility to ensure that entries are removed in the reverse order of their insertion. Because shrinking destroys the last block in the set, removing entries in any other order would corrupt active data. **Context** Caller must hold a lock protecting the block set.h](h)}(h**Parameters**h]j)}(hj&;h]h Parameters}(hj(;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$;ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj ;ubj)}(hhh](j)}(h,``struct kho_block_set *bs`` The block set. h](j)}(h``struct kho_block_set *bs``h]j)}(hjE;h]hstruct kho_block_set *bs}(hjG;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC;ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj?;ubj)}(hhh]h)}(hThe block set.h]hThe block set.}(hj^;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZ;hKhj[;ubah}(h]h ]h"]h$]h&]uh1jhj?;ubeh}(h]h ]h"]h$]h&]uh1jhjZ;hKhj<;ubj)}(hA``u64 count`` The target number of valid entries to accommodate. h](j)}(h ``u64 count``h]j)}(hj~;h]h u64 count}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|;ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjx;ubj)}(hhh]h)}(h2The target number of valid entries to accommodate.h]h2The target number of valid entries to accommodate.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hKhj;ubah}(h]h ]h"]h$]h&]uh1jhjx;ubeh}(h]h ]h"]h$]h&]uh1jhj;hKhj<;ubeh}(h]h ]h"]h$]h&]uh1jhj ;ubh)}(h**Description**h]j)}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj ;ubh)}(hReleases and unallocates redundant preserved memory blocks. Checks if the last block in the set can be removed because the remaining entry count is fully accommodated by the preceding blocks.h]hReleases and unallocates redundant preserved memory blocks. Checks if the last block in the set can be removed because the remaining entry count is fully accommodated by the preceding blocks.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj ;ubh)}(h**Note**h]j)}(hj;h]hNote}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj ;ubh)}(hIt is the caller's responsibility to ensure that entries are removed in the reverse order of their insertion. Because shrinking destroys the last block in the set, removing entries in any other order would corrupt active data.h]hIt is the caller’s responsibility to ensure that entries are removed in the reverse order of their insertion. Because shrinking destroys the last block in the set, removing entries in any other order would corrupt active data.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj ;ubh)}(h **Context**h]j)}(hj<h]hContext}(hj <hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj ;ubh)}(h1Caller must hold a lock protecting the block set.h]h1Caller must hold a lock protecting the block set.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj ;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"kho_block_set_restore (C function)c.kho_block_set_restorehNtauh1jhj7,hhhNhNubj \)}(hhh](j)}(hAint kho_block_set_restore (struct kho_block_set *bs, u64 head_pa)h]j)}(h@int kho_block_set_restore(struct kho_block_set *bs, u64 head_pa)h](j)}(hinth]hint}(hjL<hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjH<hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKubj.)}(h h]h }(hj[<hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjH<hhhjZ<hKubj?)}(hkho_block_set_restoreh]jE)}(hkho_block_set_restoreh]hkho_block_set_restore}(hjm<hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhji<ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjH<hhhjZ<hKubj^)}(h'(struct kho_block_set *bs, u64 head_pa)h](jd)}(hstruct kho_block_set *bsh](jj)}(hjmh]hstruct}(hj<hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj<ubj.)}(h h]h }(hj<hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj<ubh)}(hhh]jE)}(h kho_block_seth]h kho_block_set}(hj<hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj<modnameN classnameNjj)}j]j)}jjo<sbc.kho_block_set_restoreasbuh1hhj<ubj.)}(h h]h }(hj<hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj<ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubjE)}(hbsh]hbs}(hj<hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj<ubjd)}(h u64 head_pah](h)}(hhh]jE)}(hu64h]hu64}(hj<hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj=modnameN classnameNjj)}j]j<c.kho_block_set_restoreasbuh1hhj<ubj.)}(h h]h }(hj=hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj<ubjE)}(hhead_pah]hhead_pa}(hj*=hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj<ubeh}(h]h ]h"]h$]h&]hhuh1j]hjH<hhhjZ<hKubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjD<hhhjZ<hKubah}(h]j?<ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjZ<hKhjA<hhubjT)}(hhh]h)}(h,Restore a block set from a physical address.h]h,Restore a block set from a physical address.}(hjT=hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjQ=hhubah}(h]h ]h"]h$]h&]uh1jShjA<hhhjZ<hKubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujl=jvjl=jwjxjyuh1j hhhj7,hNhNubj{)}(hX**Parameters** ``struct kho_block_set *bs`` The block set to restore. ``u64 head_pa`` Physical address of the first block header. **Description** Restores a serialized block set from a given physical address. The caller is responsible for ensuring that the block set **bs** has been allocated and initialized prior to calling this function. **Return** 0 on success, or a negative errno on failure.h](h)}(h**Parameters**h]j)}(hjv=h]h Parameters}(hjx=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt=ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjp=ubj)}(hhh](j)}(h7``struct kho_block_set *bs`` The block set to restore. h](j)}(h``struct kho_block_set *bs``h]j)}(hj=h]hstruct kho_block_set *bs}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj=ubj)}(hhh]h)}(hThe block set to restore.h]hThe block set to restore.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj=ubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hKhj=ubj)}(h<``u64 head_pa`` Physical address of the first block header. h](j)}(h``u64 head_pa``h]j)}(hj=h]h u64 head_pa}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj=ubj)}(hhh]h)}(h+Physical address of the first block header.h]h+Physical address of the first block header.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj=ubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hKhj=ubeh}(h]h ]h"]h$]h&]uh1jhjp=ubh)}(h**Description**h]j)}(hj >h]h Description}(hj >hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjp=ubh)}(hRestores a serialized block set from a given physical address. The caller is responsible for ensuring that the block set **bs** has been allocated and initialized prior to calling this function.h](hyRestores a serialized block set from a given physical address. The caller is responsible for ensuring that the block set }(hj>hhhNhNubj)}(h**bs**h]hbs}(hj'>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubhC has been allocated and initialized prior to calling this function.}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjp=ubh)}(h **Return**h]j)}(hjB>h]hReturn}(hjD>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@>ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjp=ubh)}(h-0 on success, or a negative errno on failure.h]h-0 on success, or a negative errno on failure.}(hjX>hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjp=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"kho_block_set_destroy (C function)c.kho_block_set_destroyhNtauh1jhj7,hhhNhNubj )}(hhh](j)}(h5void kho_block_set_destroy (struct kho_block_set *bs)h]j)}(h4void kho_block_set_destroy(struct kho_block_set *bs)h](j)}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj>hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM(ubj.)}(h h]h }(hj>hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj>hhhj>hM(ubj?)}(hkho_block_set_destroyh]jE)}(hkho_block_set_destroyh]hkho_block_set_destroy}(hj>hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj>ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj>hhhj>hM(ubj^)}(h(struct kho_block_set *bs)h]jd)}(hstruct kho_block_set *bsh](jj)}(hjmh]hstruct}(hj>hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj>ubj.)}(h h]h }(hj>hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj>ubh)}(hhh]jE)}(h kho_block_seth]h kho_block_set}(hj>hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj>modnameN classnameNjj)}j]j)}jj>sbc.kho_block_set_destroyasbuh1hhj>ubj.)}(h h]h }(hj?hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj>ubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubjE)}(hbsh]hbs}(hj?hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj>ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj>ubah}(h]h ]h"]h$]h&]hhuh1j]hj>hhhj>hM(ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj>hhhj>hM(ubah}(h]jz>ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj>hM(hj|>hhubjT)}(hhh]h)}(h"Destroy all blocks in a block set.h]h"Destroy all blocks in a block set.}(hjG?hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM(hjD?hhubah}(h]h ]h"]h$]h&]uh1jShj|>hhhj>hM(ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj_?jvj_?jwjxjyuh1j hhhj7,hNhNubj{)}(h=**Parameters** ``struct kho_block_set *bs`` The block set.h](h)}(h**Parameters**h]j)}(hji?h]h Parameters}(hjk?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg?ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM,hjc?ubj)}(hhh]j)}(h+``struct kho_block_set *bs`` The block set.h](j)}(h``struct kho_block_set *bs``h]j)}(hj?h]hstruct kho_block_set *bs}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM.hj?ubj)}(hhh]h)}(hThe block set.h]hThe block set.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM)hj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhj?hM.hj?ubah}(h]h ]h"]h$]h&]uh1jhjc?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j kho_block_set_clear (C function)c.kho_block_set_clearhNtauh1jhj7,hhhNhNubj )}(hhh](j)}(h3void kho_block_set_clear (struct kho_block_set *bs)h]j)}(h2void kho_block_set_clear(struct kho_block_set *bs)h](j)}(hvoidh]hvoid}(hj?hhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj?hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM9ubj.)}(h h]h }(hj?hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj?hhhj?hM9ubj?)}(hkho_block_set_clearh]jE)}(hkho_block_set_clearh]hkho_block_set_clear}(hj@hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj?ubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj?hhhj?hM9ubj^)}(h(struct kho_block_set *bs)h]jd)}(hstruct kho_block_set *bsh](jj)}(hjmh]hstruct}(hj@hhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihj@ubj.)}(h h]h }(hj,@hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj@ubh)}(hhh]jE)}(h kho_block_seth]h kho_block_set}(hj=@hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj:@ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj?@modnameN classnameNjj)}j]j)}jj@sbc.kho_block_set_clearasbuh1hhj@ubj.)}(h h]h }(hj]@hhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj@ubj)}(hjh]h*}(hjk@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubjE)}(hbsh]hbs}(hjx@hhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj@ubeh}(h]h ]h"]h$]h&]noemphhhuh1jchj@ubah}(h]h ]h"]h$]h&]hhuh1j]hj?hhhj?hM9ubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj?hhhj?hM9ubah}(h]j?ah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhj?hM9hj?hhubjT)}(hhh]h)}(h)Clear all serialized data in a block set.h]h)Clear all serialized data in a block set.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM9hj@hhubah}(h]h ]h"]h$]h&]uh1jShj?hhhj?hM9ubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj@jvj@jwjxjyuh1j hhhj7,hNhNubj{)}(hF**Parameters** ``struct kho_block_set *bs`` The block set to clear.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM=hj@ubj)}(hhh]j)}(h4``struct kho_block_set *bs`` The block set to clear.h](j)}(h``struct kho_block_set *bs``h]j)}(hj@h]hstruct kho_block_set *bs}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM?hj@ubj)}(hhh]h)}(hThe block set to clear.h]hThe block set to clear.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM:hj@ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hM?hj@ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"kho_block_set_it_init (C function)c.kho_block_set_it_inithNtauh1jhj7,hhhNhNubj )}(hhh](j)}(hRvoid kho_block_set_it_init (struct kho_block_set_it *it, struct kho_block_set *bs)h]j)}(hQvoid kho_block_set_it_init(struct kho_block_set_it *it, struct kho_block_set *bs)h](j)}(hvoidh]hvoid}(hj=AhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj9Ahhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMGubj.)}(h h]h }(hjLAhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj9AhhhjKAhMGubj?)}(hkho_block_set_it_inith]jE)}(hkho_block_set_it_inith]hkho_block_set_it_init}(hj^AhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjZAubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj9AhhhjKAhMGubj^)}(h7(struct kho_block_set_it *it, struct kho_block_set *bs)h](jd)}(hstruct kho_block_set_it *ith](jj)}(hjmh]hstruct}(hjzAhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjvAubj.)}(h h]h }(hjAhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjvAubh)}(hhh]jE)}(hkho_block_set_ith]hkho_block_set_it}(hjAhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjAubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjAmodnameN classnameNjj)}j]j)}jj`Asbc.kho_block_set_it_initasbuh1hhjvAubj.)}(h h]h }(hjAhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjvAubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvAubjE)}(hith]hit}(hjAhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjvAubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjrAubjd)}(hstruct kho_block_set *bsh](jj)}(hjmh]hstruct}(hjAhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjAubj.)}(h h]h }(hjAhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjAubh)}(hhh]jE)}(h kho_block_seth]h kho_block_set}(hj BhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjBubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj BmodnameN classnameNjj)}j]jAc.kho_block_set_it_initasbuh1hhjAubj.)}(h h]h }(hj(BhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjAubj)}(hjh]h*}(hj6BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubjE)}(hbsh]hbs}(hjCBhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjAubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjrAubeh}(h]h ]h"]h$]h&]hhuh1j]hj9AhhhjKAhMGubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj5AhhhjKAhMGubah}(h]j0Aah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjKAhMGhj2AhhubjT)}(hhh]h)}(h Initialize a block set iterator.h]h Initialize a block set iterator.}(hjmBhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMGhjjBhhubah}(h]h ]h"]h$]h&]uh1jShj2AhhhjKAhMGubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujBjvjBjwjxjyuh1j hhhj7,hNhNubj{)}(h**Parameters** ``struct kho_block_set_it *it`` The iterator to initialize. ``struct kho_block_set *bs`` The block set to iterate over.h](h)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMKhjBubj)}(hhh](j)}(h<``struct kho_block_set_it *it`` The iterator to initialize. h](j)}(h``struct kho_block_set_it *it``h]j)}(hjBh]hstruct kho_block_set_it *it}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMHhjBubj)}(hhh]h)}(hThe iterator to initialize.h]hThe iterator to initialize.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhMHhjBubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhjBhMHhjBubj)}(h;``struct kho_block_set *bs`` The block set to iterate over.h](j)}(h``struct kho_block_set *bs``h]j)}(hjBh]hstruct kho_block_set *bs}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMJhjBubj)}(hhh]h)}(hThe block set to iterate over.h]hThe block set to iterate over.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMIhjBubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhjBhMJhjBubeh}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j+kho_block_set_it_reserve_entry (C function) c.kho_block_set_it_reserve_entryhNtauh1jhj7,hhhNhNubj )}(hhh](j)}(hCvoid * kho_block_set_it_reserve_entry (struct kho_block_set_it *it)h]j)}(hAvoid *kho_block_set_it_reserve_entry(struct kho_block_set_it *it)h](j)}(hvoidh]hvoid}(hjAChhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhj=Chhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMSubj.)}(h h]h }(hjPChhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hj=ChhhjOChMSubj)}(hjh]h*}(hj^ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ChhhjOChMSubj?)}(hkho_block_set_it_reserve_entryh]jE)}(hkho_block_set_it_reserve_entryh]hkho_block_set_it_reserve_entry}(hjoChhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjkCubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hj=ChhhjOChMSubj^)}(h(struct kho_block_set_it *it)h]jd)}(hstruct kho_block_set_it *ith](jj)}(hjmh]hstruct}(hjChhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjCubj.)}(h h]h }(hjChhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjCubh)}(hhh]jE)}(hkho_block_set_ith]hkho_block_set_it}(hjChhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjCubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjCmodnameN classnameNjj)}j]j)}jjqCsb c.kho_block_set_it_reserve_entryasbuh1hhjCubj.)}(h h]h }(hjChhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjCubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubjE)}(hith]hit}(hjChhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjCubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjCubah}(h]h ]h"]h$]h&]hhuh1j]hj=ChhhjOChMSubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhj9ChhhjOChMSubah}(h]j4Cah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjOChMShj6ChhubjT)}(hhh]h)}(h7Reserve and return the next available slot for writing.h]h7Reserve and return the next available slot for writing.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMShj Dhhubah}(h]h ]h"]h$]h&]uh1jShj6ChhhjOChMSubeh}(h]h ](jfunctioneh"]h$]h&]jtjjuj&Djvj&Djwjxjyuh1j hhhj7,hNhNubj{)}(hX**Parameters** ``struct kho_block_set_it *it`` The block iterator. **Description** Reserves a slot in the current block during state serialization to add a new entry, advancing the internal index. If the current block is full, it automatically moves to the next block in the set. **Return** A pointer to the reserved entry slot, or NULL if the block set's capacity is fully exhausted.h](h)}(h**Parameters**h]j)}(hj0Dh]h Parameters}(hj2DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.Dubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMWhj*Dubj)}(hhh]j)}(h4``struct kho_block_set_it *it`` The block iterator. h](j)}(h``struct kho_block_set_it *it``h]j)}(hjODh]hstruct kho_block_set_it *it}(hjQDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMDubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMThjIDubj)}(hhh]h)}(hThe block iterator.h]hThe block iterator.}(hjhDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdDhMThjeDubah}(h]h ]h"]h$]h&]uh1jhjIDubeh}(h]h ]h"]h$]h&]uh1jhjdDhMThjFDubah}(h]h ]h"]h$]h&]uh1jhj*Dubh)}(h**Description**h]j)}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMVhj*Dubh)}(hReserves a slot in the current block during state serialization to add a new entry, advancing the internal index. If the current block is full, it automatically moves to the next block in the set.h]hReserves a slot in the current block during state serialization to add a new entry, advancing the internal index. If the current block is full, it automatically moves to the next block in the set.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMUhj*Dubh)}(h **Return**h]j)}(hjDh]hReturn}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMYhj*Dubh)}(h]A pointer to the reserved entry slot, or NULL if the block set's capacity is fully exhausted.h]h_A pointer to the reserved entry slot, or NULL if the block set’s capacity is fully exhausted.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMZhj*Dubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(kho_block_set_it_read_entry (C function)c.kho_block_set_it_read_entryhNtauh1jhj7,hhhNhNubj )}(hhh](j)}(h@void * kho_block_set_it_read_entry (struct kho_block_set_it *it)h]j)}(h>void *kho_block_set_it_read_entry(struct kho_block_set_it *it)h](j)}(hvoidh]hvoid}(hjDhhhNhNubah}(h]h ]j(ah"]h$]h&]uh1jhjDhhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMqubj.)}(h h]h }(hjEhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjDhhhjEhMqubj)}(hjh]h*}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhjEhMqubj?)}(hkho_block_set_it_read_entryh]jE)}(hkho_block_set_it_read_entryh]hkho_block_set_it_read_entry}(hj$EhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhj Eubah}(h]h ](jXjYeh"]h$]h&]hhuh1j>hjDhhhjEhMqubj^)}(h(struct kho_block_set_it *it)h]jd)}(hstruct kho_block_set_it *ith](jj)}(hjmh]hstruct}(hj@EhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjhjFhhhjFhMubj^)}(h(struct kho_block_set_it *it)h]jd)}(hstruct kho_block_set_it *ith](jj)}(hjmh]hstruct}(hjFhhhNhNubah}(h]h ]jvah"]h$]h&]uh1jihjFubj.)}(h h]h }(hjGhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjFubh)}(hhh]jE)}(hkho_block_set_ith]hkho_block_set_it}(hjGhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjGubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjGmodnameN classnameNjj)}j]j)}jjFsbc.kho_block_set_it_prevasbuh1hhjFubj.)}(h h]h }(hj3GhhhNhNubah}(h]h ]j:ah"]h$]h&]uh1j-hjFubj)}(hjh]h*}(hjAGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubjE)}(hith]hit}(hjNGhhhNhNubah}(h]h ]jQah"]h$]h&]uh1jDhjFubeh}(h]h ]h"]h$]h&]noemphhhuh1jchjFubah}(h]h ]h"]h$]h&]hhuh1j]hjFhhhjFhMubeh}(h]h ]h"]h$]h&]hhjEuh1jjFjGhjFhhhjFhMubah}(h]jFah ](jKjLeh"]h$]h&]jPjQ)jRhuh1jhjFhMhjFhhubjT)}(hhh]h)}(h0Return the previous entry slot in the block set.h]h0Return the previous entry slot in the block set.}(hjxGhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjuGhhubah}(h]h ]h"]h$]h&]uh1jShjFhhhjFhMubeh}(h]h ](jfunctioneh"]h$]h&]jtjjujGjvjGjwjxjyuh1j hhhj7,hNhNubj{)}(hX'**Parameters** ``struct kho_block_set_it *it`` The block iterator. **Description** If the current index is at the start of a block, it automatically moves to the end of the previous block. **Return** A pointer to the previous entry slot, or NULL if at the very beginning of the block set.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjGubj)}(hhh]j)}(h4``struct kho_block_set_it *it`` The block iterator. h](j)}(h``struct kho_block_set_it *it``h]j)}(hjGh]hstruct kho_block_set_it *it}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjGubj)}(hhh]h)}(hThe block iterator.h]hThe block iterator.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMhjGubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhjGhMhjGubah}(h]h ]h"]h$]h&]uh1jhjGubh)}(h**Description**h]j)}(hjGh]h Description}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjGubh)}(hiIf the current index is at the start of a block, it automatically moves to the end of the previous block.h]hiIf the current index is at the start of a block, it automatically moves to the end of the previous block.}(hj HhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjGubh)}(h **Return**h]j)}(hjHh]hReturn}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjGubh)}(hXA pointer to the previous entry slot, or NULL if at the very beginning of the block set.h]hXA pointer to the previous entry slot, or NULL if at the very beginning of the block set.}(hj1HhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jzhj7,hhhNhNubeh}(h]kho-serialization-blocks-apiah ]h"]kho serialization blocks apiah$]h&]uh1hhhhhhhhKWubh)}(hhh](h)}(hSee Alsoh]hSee Also}(hjRHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOHhhhhhKbubh bullet_list)}(hhh]h list_item)}(h:doc:`/admin-guide/mm/kho`h]h)}(hjiHh]h)}(hjiHh]j)}(hjiHh]h/admin-guide/mm/kho}(hjqHhhhNhNubah}(h]h ](j$stdstd-doceh"]h$]h&]uh1jhjnHubah}(h]h ]h"]h$]h&]refdocj1 refdomainj{Hreftypedoc refexplicitrefwarnj7/admin-guide/mm/khouh1hhhhKdhjkHubah}(h]h ]h"]h$]h&]uh1hhhhKdhjgHubah}(h]h ]h"]h$]h&]uh1jeHhjbHhhhhhNubah}(h]h ]h"]h$]h&]bullet-uh1j`HhhhKdhjOHhhubeh}(h]see-alsoah ]h"]see alsoah$]h&]uh1hhhhhhhhKbubeh}(h](kexec-handover-subsystemheh ]h"](kexec handover subsystem kho-conceptseh$]h&]uh1hhhhhhhhKj}jHhsj}hhsubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjHerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}(h]hajq]jgaj]jaunameids}(jHhjHjHjwjtjjqj j jzjjyjvjjj4,j1,jLHjIHjHjHu nametypes}(jHjHjwjj jzjyjj4,jLHjHuh}(hhjHhjthjqjzj jzjjjvjjjj1,jjjjjjjjm jr j j jjjjjjjjjcjhjjj(j-j{jjj j|!j!jL#jQ#j%j %jY&j^&j'j'j0)j5)jIHj7,jr,jw,j-j-j0j0j1j1j2j2jC4jH4j5j5j7j7j9j9j?<jD<jz>j>j?j?j0Aj5Aj4Cj9CjDjDjFjFjHjOHu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jHKsRparse_messages]transform_messages](hsystem_message)}(hhh]h)}(hhh]h2Hyperlink target "kho-concepts" is not referenced.}hjCIsbah}(h]h ]h"]h$]h&]uh1hhj@Iubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehnjlineKuh1j>Iubj?I)}(hhh]h)}(hhh]h-Hyperlink target "kho-fdt" is not referenced.}hj^Isbah}(h]h ]h"]h$]h&]uh1hhj[Iubah}(h]h ]h"]h$]h&]levelKtypejXIsourcehnjlineKuh1j>Iubj?I)}(hhh]h)}(hhh]h1Hyperlink target "kho-scratch" is not referenced.}hjxIsbah}(h]h ]h"]h$]h&]uh1hhjuIubah}(h]h ]h"]h$]h&]levelKtypejXIsourcehnjlineK+uh1j>Iube transformerN include_log] decorationNhhub.