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)}(hThis is a radix tree implementation for tracking physical memory pages across kexec transitions. It was developed for the KHO mechanism but is designed for broader use by any subsystem that needs to preserve pages.h]hThis is a radix tree implementation for tracking physical memory pages across kexec transitions. It was developed for the KHO mechanism but is designed for broader use by any subsystem that needs to preserve pages.}(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)}(hX0The radix tree is a multi-level tree where leaf nodes are bitmaps representing individual pages. 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]hX2The radix tree is a multi-level tree where leaf nodes are bitmaps representing individual pages. 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_page (C function)c.kho_radix_add_pagehNtauh1jhjhhhNhNubhdesc)}(hhh](hdesc_signature)}(h[int kho_radix_add_page (struct kho_radix_tree *tree, unsigned long pfn, unsigned int order)h]hdesc_signature_line)}(hZint kho_radix_add_page(struct kho_radix_tree *tree, unsigned long pfn, unsigned int order)h](hdesc_sig_keyword_type)}(hinth]hint}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1j hjhhhe/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&]uh1jhjhhhjhKubh desc_name)}(hkho_radix_add_pageh]h desc_sig_name)}(hkho_radix_add_pageh]hkho_radix_add_page}(hj7hhhNhNubah}(h]h ]nah"]h$]h&]uh1j5hj1ubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1j/hjhhhjhKubhdesc_parameterlist)}(hD(struct kho_radix_tree *tree, unsigned long pfn, unsigned int order)h](hdesc_parameter)}(hstruct kho_radix_tree *treeh](hdesc_sig_keyword)}(hstructh]hstruct}(hj\hhhNhNubah}(h]h ]kah"]h$]h&]uh1jZhjVubj)}(h h]h }(hjkhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjVubh)}(hhh]j6)}(hkho_radix_treeh]hkho_radix_tree}(hj|hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjyubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetj~modnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jj9sbc.kho_radix_add_pageasbuh1hhjVubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjVubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjVubj6)}(htreeh]htree}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjVubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjPubjU)}(hunsigned long pfnh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj6)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjPubjU)}(hunsigned int orderh](j )}(hunsignedh]hunsigned}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj*ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj*ubj )}(hinth]hint}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj*ubj)}(h h]h }(hjXhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj*ubj6)}(horderh]horder}(hjfhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjPubeh}(h]h ]h"]h$]h&]hhuh1jNhjhhhjhKubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1jsphinx_line_type declaratorhjhhhjhKubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhKhjhhubh desc_content)}(hhh]h)}(h,Marks a page as preserved in the radix tree.h]h,Marks a page as preserved in 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.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjhNhNubh container)}(hX**Parameters** ``struct kho_radix_tree *tree`` The KHO radix tree. ``unsigned long pfn`` The page frame number of the page to preserve. ``unsigned int order`` The order of the page. **Description** This function traverses the radix tree based on the key derived from **pfn** and **order**. It sets the corresponding bit in the leaf bitmap to mark the page for preservation. If intermediate nodes do not exist along the path, they are allocated and added to the tree. **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.chKhjubhdefinition_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)}(hE``unsigned long pfn`` The page frame number of the page to preserve. h](j)}(h``unsigned long pfn``h]j)}(hj&h]hunsigned long pfn}(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.chKhj ubj)}(hhh]h)}(h.The page frame number of the page to preserve.h]h.The page frame number of the page to preserve.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hKhj<ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj;hKhjubj)}(h.``unsigned int order`` The order of the page. h](j)}(h``unsigned int order``h]j)}(hj_h]hunsigned int order}(hjahhhNhNubah}(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.chKhjYubj)}(hhh]h)}(hThe order of the page.h]hThe order of the page.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthKhjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjthKhjubeh}(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.chKhjubh)}(hX This function traverses the radix tree based on the key derived from **pfn** and **order**. It sets the corresponding bit in the leaf bitmap to mark the page for preservation. If intermediate nodes do not exist along the path, they are allocated and added to the tree.h](hEThis function traverses the radix tree based on the key derived from }(hjhhhNhNubj)}(h**pfn**h]hpfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h **order**h]horder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. It sets the corresponding bit in the leaf bitmap to mark the page for preservation. If intermediate nodes do not exist along the path, they are allocated and added to the tree.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhjubh)}(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.chKhjubh)}(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.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_radix_del_page (C function)c.kho_radix_del_pagehNtauh1jhjhhhNhNubj)}(hhh](j)}(h\void kho_radix_del_page (struct kho_radix_tree *tree, unsigned long pfn, unsigned int order)h]j)}(h[void kho_radix_del_page(struct kho_radix_tree *tree, unsigned long pfn, unsigned int order)h](j )}(hvoidh]hvoid}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj&hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKubj)}(h h]h }(hj9hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj&hhhj8hKubj0)}(hkho_radix_del_pageh]j6)}(hkho_radix_del_pageh]hkho_radix_del_page}(hjKhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjGubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj&hhhj8hKubjO)}(hD(struct kho_radix_tree *tree, unsigned long pfn, unsigned int order)h](jU)}(hstruct kho_radix_tree *treeh](j[)}(hj^h]hstruct}(hjghhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjcubj)}(h h]h }(hjthhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjcubh)}(hhh]j6)}(hkho_radix_treeh]hkho_radix_tree}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjMsbc.kho_radix_del_pageasbuh1hhjcubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjcubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj6)}(htreeh]htree}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjcubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj_ubjU)}(hunsigned long pfnh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj6)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj_ubjU)}(hunsigned int orderh](j )}(hunsignedh]hunsigned}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj&ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj&ubj )}(hinth]hint}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj&ubj)}(h h]h }(hjThhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj&ubj6)}(horderh]horder}(hjbhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj_ubeh}(h]h ]h"]h$]h&]hhuh1jNhj&hhhj8hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj"hhhj8hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj8hKhjhhubj)}(hhh]h)}(h9Removes a page's preservation status from the radix tree.h]h;Removes a page’s preservation status 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.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj8hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct kho_radix_tree *tree`` The KHO radix tree. ``unsigned long pfn`` The page frame number of the page to unpreserve. ``unsigned int order`` The order of the page. **Description** This function traverses the radix tree and clears the bit corresponding to the page, effectively removing its "preserved" status. 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.chKhjubj)}(hhh](j)}(h4``struct kho_radix_tree *tree`` The KHO radix tree. h](j)}(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.chKhjubj)}(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)}(hG``unsigned long pfn`` The page frame number of the page to unpreserve. h](j)}(h``unsigned long pfn``h]j)}(hjh]hunsigned long pfn}(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)}(h0The page frame number of the page to unpreserve.h]h0The page frame number of the page to unpreserve.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h.``unsigned int order`` The order of the page. h](j)}(h``unsigned int order``h]j)}(hj?h]hunsigned int order}(hjAhhhNhNubah}(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.chKhj9ubj)}(hhh]h)}(hThe order of the page.h]hThe order of the page.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThKhjUubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhjThKhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjzh]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhjubh)}(hThis function traverses the radix tree and clears the bit corresponding to the page, effectively removing its "preserved" status. It does not free the tree's intermediate nodes, even if they become empty.h]hThis function traverses the radix tree and clears the bit corresponding to the page, effectively removing its “preserved” status. It does not free the tree’s intermediate nodes, even if they become empty.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j kho_radix_walk_tree (C function)c.kho_radix_walk_treehNtauh1jhjhhhNhNubj)}(hhh](j)}(hXint kho_radix_walk_tree (struct kho_radix_tree *tree, kho_radix_tree_walk_callback_t cb)h]j)}(hWint kho_radix_walk_tree(struct kho_radix_tree *tree, kho_radix_tree_walk_callback_t cb)h](j )}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMOubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjhhhjhMOubj0)}(hkho_radix_walk_treeh]j6)}(hkho_radix_walk_treeh]hkho_radix_walk_tree}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhjhMOubjO)}(h@(struct kho_radix_tree *tree, kho_radix_tree_walk_callback_t cb)h](jU)}(hstruct kho_radix_tree *treeh](j[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubh)}(hhh]j6)}(hkho_radix_treeh]hkho_radix_tree}(hj hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jjsbc.kho_radix_walk_treeasbuh1hhjubj)}(h h]h }(hj: hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjH hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj6)}(htreeh]htree}(hjU hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubjU)}(h!kho_radix_tree_walk_callback_t cbh](h)}(hhh]j6)}(hkho_radix_tree_walk_callback_th]hkho_radix_tree_walk_callback_t}(hjq hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjn ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjs modnameN classnameNjj)}j]j6 c.kho_radix_walk_treeasbuh1hhjj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjj ubj6)}(hcbh]hcb}(hj hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubeh}(h]h ]h"]h$]h&]hhuh1jNhjhhhjhMOubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMOubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMOhjhhubj)}(hhh]h)}(hFTraverses the radix tree and calls a callback for each preserved page.h]hFTraverses the radix tree and calls a callback for each preserved page.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMOhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMOubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct kho_radix_tree *tree`` A pointer to the KHO radix tree to walk. ``kho_radix_tree_walk_callback_t cb`` A callback function of type kho_radix_tree_walk_callback_t that will be invoked for each preserved page found in the tree. The callback receives the physical address and order of the preserved page. **Description** This function walks the radix tree, searching from the specified top level down to the lowest level (level 0). For each preserved page found, it invokes the provided callback, passing the page's physical address and order. **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.chMShj 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.chMPhj 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 hMPhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMPhj ubj)}(h``kho_radix_tree_walk_callback_t cb`` A callback function of type kho_radix_tree_walk_callback_t that will be invoked for each preserved page found in the tree. The callback receives the physical address and order of the preserved page. h](j)}(h%``kho_radix_tree_walk_callback_t cb``h]j)}(hjA h]h!kho_radix_tree_walk_callback_t cb}(hjC 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.chMShj; ubj)}(hhh]h)}(hA callback function of type kho_radix_tree_walk_callback_t that will be invoked for each preserved page found in the tree. The callback receives the physical address and order of the preserved page.h]hA callback function of type kho_radix_tree_walk_callback_t that will be invoked for each preserved page found in the tree. The callback receives the physical address and order of the preserved page.}(hjZ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMQhjW ubah}(h]h ]h"]h$]h&]uh1jhj; ubeh}(h]h ]h"]h$]h&]uh1jhjV hMShj 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&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMUhj ubh)}(hThis function walks the radix tree, searching from the specified top level down to the lowest level (level 0). For each preserved page found, it invokes the provided callback, passing the page's physical address and order.h]hThis function walks the radix tree, searching from the specified top level down to the lowest level (level 0). For each preserved page found, it invokes the provided callback, passing the page’s physical address and order.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMThj 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.chMXhj 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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMYhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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](j[)}(hj^h]hstruct}(hj hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj 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&]uh1jhj hhhj hMubh)}(hhh]j6)}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jkho_restore_foliosbc.kho_restore_folioasbuh1hhj hhhj hMubj)}(h h]h }(hj) hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj hhhj hMubj)}(hjh]h*}(hj7 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubj0)}(hkho_restore_folioh]j6)}(hj& h]hkho_restore_folio}(hjH hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjD ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj hhhj hMubjO)}(h(phys_addr_t phys)h]jU)}(hphys_addr_t physh](h)}(hhh]j6)}(h phys_addr_th]h phys_addr_t}(hjf hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjc ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjh modnameN classnameNjj)}j]j$ c.kho_restore_folioasbuh1hhj_ ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj_ ubj6)}(hphysh]hphys}(hj hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj_ ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj[ ubah}(h]h ]h"]h$]h&]hhuh1jNhj hhhj hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj hhhj hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hMhj hhubj)}(hhh]h)}(h.recreates the folio from the preserved memory.h]h.recreates the folio from the preserved 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&]uh1jhj hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(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)}(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)}(h4``phys_addr_t phys`` physical address of the folio. 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.chMhj ubj)}(hhh]h)}(hphysical address of the folio.h]hphysical address of the folio.}(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 **Return**h]j)}(hj8 h]hReturn}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6 ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj ubh)}(h8pointer to the struct folio on success, NULL on failure.h]h8pointer to the struct folio on success, NULL on failure.}(hjN 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&]uh1jhjhhhNhNubj)}(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](j[)}(hj^h]hstruct}(hj} hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjy 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&]uh1jhjy hhhj hMubh)}(hhh]j6)}(hpageh]hpage}(hj hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jkho_restore_pagessbc.kho_restore_pagesasbuh1hhjy hhhj hMubj)}(h h]h }(hj hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjy hhhj hMubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy hhhj hMubj0)}(hkho_restore_pagesh]j6)}(hj h]hkho_restore_pages}(hj hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjy hhhj hMubjO)}(h*(phys_addr_t phys, unsigned long nr_pages)h](jU)}(hphys_addr_t physh](h)}(hhh]j6)}(h phys_addr_th]h phys_addr_t}(hj hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j c.kho_restore_pagesasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj ubj6)}(hphysh]hphys}(hj& hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj ubjU)}(hunsigned long nr_pagesh](j )}(hunsignedh]hunsigned}(hj? hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj; ubj)}(h h]h }(hjM hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj; ubj )}(hlongh]hlong}(hj[ hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj; ubj)}(h h]h }(hji hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj; ubj6)}(hnr_pagesh]hnr_pages}(hjw hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj; ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj ubeh}(h]h ]h"]h$]h&]hhuh1jNhjy hhhj hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhju hhhj hMubah}(h]jp ah ](jjeh"]h$]h&]jj)jhuh1jhj hMhjr hhubj)}(hhh]h)}(h)restore list of contiguous order 0 pages.h]h)restore list of contiguous order 0 pages.}(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&]uh1jhjr hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjhNhNubj)}(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)}(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)}(h9``phys_addr_t phys`` physical address of the first page. 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.chMhj ubj)}(hhh]h)}(h#physical address of the first page.h]h#physical address of the first page.}(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,``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.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]j)}(hjVh]h Description}(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.chMhj ubh)}(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().}(hjlhhhNhNubah}(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}(hjhhhNhNubah}(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)}(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.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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 ]jah"]h$]h&]uh1j hjhhhe/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&]uh1jhjhhhjhMubj0)}(hkho_add_subtreeh]j6)}(hkho_add_subtreeh]hkho_add_subtree}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhjhMubjO)}(h+(const char *name, void *blob, size_t size)h](jU)}(hconst char *nameh](j[)}(hconsth]hconst}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hj)hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj6)}(hnameh]hname}(hjDhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubjU)}(h void *blobh](j )}(hvoidh]hvoid}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjYubj)}(h h]h }(hjkhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjYubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj6)}(hblobh]hblob}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjYubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubjU)}(h size_t sizeh](h)}(hhh]j6)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.kho_add_subtreeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj6)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubeh}(h]h ]h"]h$]h&]hhuh1jNhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(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&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(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)}(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.chMhjubj)}(hhh](j)}(h+``const char *name`` name of the sub tree. h](j)}(h``const char *name``h]j)}(hj;h]hconst char *name}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj5ubj)}(hhh]h)}(hname of the sub tree.h]hname of the sub tree.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhMhjQubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhMhj2ubj)}(h"``void *blob`` the sub tree blob. h](j)}(h``void *blob``h]j)}(hjth]h void *blob}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjnubj)}(hhh]h)}(hthe sub tree blob.h]hthe sub tree blob.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjhMhj2ubj)}(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&]uh1jhjhMhj2ubeh}(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.chMhjubh)}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh5 in KHO root FDT and records the physical address of }(hjhhhNhNubj)}(h**blob**h]hblob}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. The pages of }(hjhhhNhNubj)}(h**blob**h]hblob}(hj*hhhNhNubah}(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.chMhjubh)}(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 }(hjChhhNhNubj)}(h/``/sys/kernel/debug/kho/out/sub_fdts/**name**``h]h+/sys/kernel/debug/kho/out/sub_fdts/**name**}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh= when kernel is configured with CONFIG_KEXEC_HANDOVER_DEBUGFS}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubh)}(h **Return**h]j)}(hjfh]hReturn}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubh)}(h#0 on success, error code on failureh]h#0 on success, error code 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.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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 ]jah"]h$]h&]uh1j hjhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM8ubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjhhhjhM8ubj0)}(hkho_preserve_folioh]j6)}(hkho_preserve_folioh]hkho_preserve_folio}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhjhM8ubjO)}(h(struct folio *folio)h]jU)}(hstruct folio *folioh](j[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubh)}(hhh]j6)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.kho_preserve_folioasbuh1hhjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj6)}(hfolioh]hfolio}(hjAhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubah}(h]h ]h"]h$]h&]hhuh1jNhjhhhjhM8ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhM8ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM8hjhhubj)}(hhh]h)}(hpreserve a folio across kexec.h]hpreserve a folio across kexec.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM8hjhhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM8ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(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.chM<hjubj)}(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.chM9hjubj)}(hhh]h)}(hfolio to preserve.h]hfolio to preserve.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM9hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM9hjubah}(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)}(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.chM:hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(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=hjubh)}(h#0 on success, error code on failureh]h#0 on success, error code 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.chM>hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjOhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMNubj)}(h h]h }(hjbhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjOhhhjahMNubj0)}(hkho_unpreserve_folioh]j6)}(hkho_unpreserve_folioh]hkho_unpreserve_folio}(hjthhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjpubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjOhhhjahMNubjO)}(h(struct folio *folio)h]jU)}(hstruct folio *folioh](j[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubh)}(hhh]j6)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjvsbc.kho_unpreserve_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj6)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubah}(h]h ]h"]h$]h&]hhuh1jNhjOhhhjahMNubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjKhhhjahMNubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhjahMNhjHhhubj)}(hhh]h)}(hunpreserve a folio.h]hunpreserve a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMNhjhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjahMNubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+jj+jjjuh1jhhhjhNhNubj)}(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)}(hj5h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMRhj/ubj)}(hhh]j)}(h-``struct folio *folio`` folio to unpreserve. h](j)}(h``struct folio *folio``h]j)}(hjTh]hstruct folio *folio}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMOhjNubj)}(hhh]h)}(hfolio to unpreserve.h]hfolio to unpreserve.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMOhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjihMOhjKubah}(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.chMQhj/ubh)}(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.chMPhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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 ]jah"]h$]h&]uh1j hjhhhe/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&]uh1jhjhhhjhM`ubj0)}(hkho_preserve_pagesh]j6)}(hkho_preserve_pagesh]hkho_preserve_pages}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhjhM`ubjO)}(h+(struct page *page, unsigned long nr_pages)h](jU)}(hstruct page *pageh](j[)}(hj^h]hstruct}(hj#hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubj)}(h h]h }(hj0hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubh)}(hhh]j6)}(hpageh]hpage}(hjAhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj>ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjCmodnameN classnameNjj)}j]j)}jj sbc.kho_preserve_pagesasbuh1hhjubj)}(h h]h }(hjahhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj6)}(hpageh]hpage}(hj|hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubjU)}(hunsigned long nr_pagesh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj6)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubeh}(h]h ]h"]h$]h&]hhuh1jNhjhhhjhM`ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhM`ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM`hjhhubj)}(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.chM`hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM`ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(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)}(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.``struct page *page`` first page in the list. h](j)}(h``struct page *page``h]j)}(hj8h]hstruct page *page}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMahj2ubj)}(hhh]h)}(hfirst page in the list.h]hfirst page in the list.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMahjNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhMahj/ubj)}(h,``unsigned long nr_pages`` number of pages. h](j)}(h``unsigned long nr_pages``h]j)}(hjqh]hunsigned long nr_pages}(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.chMbhjkubj)}(hhh]h)}(hnumber of pages.h]hnumber of pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMbhjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjhMbhj/ubeh}(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.chMdhjubh)}(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.chMchjubh)}(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.chMfhjubh)}(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.chMghjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhe/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&]uh1jhjhhhj&hMubj0)}(hkho_unpreserve_pagesh]j6)}(hkho_unpreserve_pagesh]hkho_unpreserve_pages}(hj9hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj5ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhj&hMubjO)}(h+(struct page *page, unsigned long nr_pages)h](jU)}(hstruct page *pageh](j[)}(hj^h]hstruct}(hjUhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjQubj)}(h h]h }(hjbhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjQubh)}(hhh]j6)}(hpageh]hpage}(hjshhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjpubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjumodnameN classnameNjj)}j]j)}jj;sbc.kho_unpreserve_pagesasbuh1hhjQubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjQubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj6)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjQubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjMubjU)}(hunsigned long nr_pagesh](j )}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj )}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj6)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjMubeh}(h]h ]h"]h$]h&]hhuh1jNhjhhhj&hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhj&hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj&hMhj hhubj)}(hhh]h)}(hunpreserve contiguous pages.h]hunpreserve contiguous pages.}(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&]uh1jhj hhhj&hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjAjjAjjjuh1jhhhjhNhNubj)}(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)}(hjKh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjEubj)}(hhh](j)}(h.``struct page *page`` first page in the list. h](j)}(h``struct page *page``h]j)}(hjjh]hstruct page *page}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjdubj)}(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&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjhMhjaubj)}(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&]uh1jhjhMhjaubeh}(h]h ]h"]h$]h&]uh1jhjEubh)}(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.chMhjEubh)}(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}(hjhhhNhNubah}(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}(hj2hhhNhNubah}(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.chMhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjghhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj)}(h h]h }(hjzhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjghhhjyhMubj0)}(hkho_preserve_vmalloch]j6)}(hkho_preserve_vmalloch]hkho_preserve_vmalloc}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjghhhjyhMubjO)}(h-(void *ptr, struct kho_vmalloc *preservation)h](jU)}(h void *ptrh](j )}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj6)}(hptrh]hptr}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubjU)}(h struct kho_vmalloc *preservationh](j[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubh)}(hhh]j6)}(h kho_vmalloch]h kho_vmalloc}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jjsbc.kho_preserve_vmallocasbuh1hhjubj)}(h h]h }(hj(hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj6)}(h preservationh]h preservation}(hjChhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubeh}(h]h ]h"]h$]h&]hhuh1jNhjghhhjyhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjchhhjyhMubah}(h]j^ah ](jjeh"]h$]h&]jj)jhuh1jhjyhMhj`hhubj)}(hhh]h)}(h5preserve memory allocated with vmalloc() across kexech]h5preserve memory allocated with vmalloc() across kexec}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjjhhubah}(h]h ]h"]h$]h&]uh1jhj`hhhjyhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(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.chMhjubj)}(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.chMhjubj)}(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&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(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.chMhjubj)}(hhh]h)}(h%placeholder for preservation metadatah]h%placeholder for preservation metadata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(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.chMhjubh)}(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 }(hj8hhhNhNubj)}(h**ptr**h]hptr}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh. The physical pages mapped at }(hj8hhhNhNubj)}(h**ptr**h]hptr}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh, will be preserved and on successful return }(hj8hhhNhNubj)}(h**preservation**h]h preservation}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubhO will hold the physical address of a structure that describes the preservation.}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubh)}(h**NOTE**h]j)}(hjh]hNOTE}(hjhhhNhNubah}(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.chMhjubh)}(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.chMhjubh)}(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.chMhjubh)}(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.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhe/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&]uh1jhjhhhjhM.ubj0)}(hkho_unpreserve_vmalloch]j6)}(hkho_unpreserve_vmalloch]hkho_unpreserve_vmalloc}(hj hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhjhM.ubjO)}(h"(struct kho_vmalloc *preservation)h]jU)}(h struct kho_vmalloc *preservationh](j[)}(hj^h]hstruct}(hj(hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj$ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj$ubh)}(hhh]j6)}(h kho_vmalloch]h kho_vmalloc}(hjFhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjCubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjHmodnameN classnameNjj)}j]j)}jjsbc.kho_unpreserve_vmallocasbuh1hhj$ubj)}(h h]h }(hjfhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj$ubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj6)}(h preservationh]h preservation}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj ubah}(h]h ]h"]h$]h&]hhuh1jNhjhhhjhM.ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhM.ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM.hjhhubj)}(hhh]h)}(h*unpreserve memory allocated with vmalloc()h]h*unpreserve memory allocated with vmalloc()}(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&]uh1jhjhhhjhM.ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(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)}(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.chM2hjubj)}(hhh]j)}(h^``struct kho_vmalloc *preservation`` preservation metadata returned by kho_preserve_vmalloc() 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.chM/hjubj)}(hhh]h)}(h8preservation metadata returned by kho_preserve_vmalloc()h]h8preservation metadata returned by kho_preserve_vmalloc()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM/hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM/hjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(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.chM1hjubh)}(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().}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM0hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMDubj)}(h h]h }(hj{hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjhhhhjzhMDubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjzhMDubj0)}(hkho_restore_vmalloch]j6)}(hkho_restore_vmalloch]hkho_restore_vmalloc}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhhjzhMDubjO)}(h((const struct kho_vmalloc *preservation)h]jU)}(h&const struct kho_vmalloc *preservationh](j[)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj[)}(hj^h]hstruct}(hjhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubh)}(hhh]j6)}(h kho_vmalloch]h kho_vmalloc}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.kho_restore_vmallocasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj6)}(h preservationh]h preservation}(hj*hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjubah}(h]h ]h"]h$]h&]hhuh1jNhjhhhhjzhMDubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjdhhhjzhMDubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1jhjzhMDhjahhubj)}(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.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMDhjQhhubah}(h]h ]h"]h$]h&]uh1jhjahhhjzhMDubeh}(h]h ](jfunctioneh"]h$]h&]jjjjljjljjjuh1jhhhjhNhNubj)}(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)}(hjvh]h Parameters}(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.chMHhjpubj)}(hhh]j)}(hB``const struct kho_vmalloc *preservation`` preservation metadata. h](j)}(h*``const struct kho_vmalloc *preservation``h]j)}(hjh]h&const 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.chMFhjubj)}(hhh]h)}(hpreservation metadata.h]hpreservation metadata.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMFhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMFhjubah}(h]h ]h"]h$]h&]uh1jhjpubh)}(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.chMHhjpubh)}(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().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMGhjpubh)}(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.chMJhjpubh)}(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.chMKhjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj8hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj)}(h h]h }(hjKhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj8hhhjJhMubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhjJhMubj0)}(hkho_alloc_preserveh]j6)}(hkho_alloc_preserveh]hkho_alloc_preserve}(hjjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjfubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj8hhhjJhMubjO)}(h (size_t size)h]jU)}(h size_t sizeh](h)}(hhh]j6)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjlsbc.kho_alloc_preserveasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjubj6)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj~ubah}(h]h ]h"]h$]h&]hhuh1jNhj8hhhjJhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj4hhhjJhMubah}(h]j/ah ](jjeh"]h$]h&]jj)jhuh1jhjJhMhj1hhubj)}(hhh]h)}(h$Allocate, zero, and preserve memory.h]h$Allocate, zero, and preserve memory.}(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&]uh1jhj1hhhjJhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jhhhjhNhNubj)}(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.chMhjubj)}(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}(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 The number of bytes to allocate.h]h The number of bytes to allocate.}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7 hMhj8 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj7 hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubh)}(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.chMhjubh)}(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 }(hjs hhhNhNubj)}(h**size**h]hsize}(hj{ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs ubhY bytes. The allocated memory is then registered with KHO for preservation across a kexec.}(hjs hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjubh)}(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.chMhjubh)}(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.chMhjubh)}(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.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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 ]jah"]h$]h&]uh1j hj 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&]uh1jhj hhhj!hMubj0)}(hkho_unpreserve_freeh]j6)}(hkho_unpreserve_freeh]hkho_unpreserve_free}(hj!hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj!ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj hhhj!hMubjO)}(h (void *mem)h]jU)}(h void *memh](j )}(hvoidh]hvoid}(hj5!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj1!ubj)}(h h]h }(hjC!hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj1!ubj)}(hjh]h*}(hjQ!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1!ubj6)}(hmemh]hmem}(hj^!hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj1!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj-!ubah}(h]h ]h"]h$]h&]hhuh1jNhj hhhj!hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj hhhj!hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj!hMhj hhubj)}(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.chMhj!hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj!hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!jj!jjjuh1jhhhjhNhNubj)}(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.chMhj!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.chMhj!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!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)}(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().}(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&]uh1jhjhhhNhNubj)}(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}(hjI"hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjE"hhhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMubj)}(h h]h }(hjX"hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjE"hhhjW"hMubj0)}(hkho_restore_freeh]j6)}(hkho_restore_freeh]hkho_restore_free}(hjj"hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjf"ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjE"hhhjW"hMubjO)}(h (void *mem)h]jU)}(h void *memh](j )}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj"ubj)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj6)}(hmemh]hmem}(hj"hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj~"ubah}(h]h ]h"]h$]h&]hhuh1jNhjE"hhhjW"hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjA"hhhjW"hMubah}(h]j<"ah ](jjeh"]h$]h&]jj)jhuh1jhjW"hMhj>"hhubj)}(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.chMhj"hhubah}(h]h ]h"]h$]h&]uh1jhj>"hhhjW"hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj"jj"jjjuh1jhhhjhNhNubj)}(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.chMhj"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)}(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.chMhj#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.}(hj3#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj0#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)}(hjV#h]h Description}(hjX#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT#ubah}(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 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().}(hjl#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhj"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.chMhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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 ]jah"]h$]h&]uh1j hj#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&]uh1jhj#hhhj#hM ubj0)}(h is_kho_booth]j6)}(h is_kho_booth]h is_kho_boot}(hj#hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj#ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj#hhhj#hM ubjO)}(h(void)h]jU)}(hvoidh]j )}(hvoidh]hvoid}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubah}(h]h ]h"]h$]h&]noemphhhuh1jThj#ubah}(h]h ]h"]h$]h&]hhuh1jNhj#hhhj#hM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj#hhhj#hM ubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1jhj#hM hj#hhubj)}(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.chM hj$hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj#hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj)$jj)$jjjuh1jhhhjhNhNubj)}(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)}(hj3$h]h Parameters}(hj5$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1$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``void`` no arguments h](j)}(h``void``h]j)}(hjR$h]hvoid}(hjT$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP$ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chKhjL$ubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjk$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg$hKhjh$ubah}(h]h ]h"]h$]h&]uh1jhjL$ubeh}(h]h ]h"]h$]h&]uh1jhjg$hKhjI$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.chKhj-$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.chM hj-$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)}(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.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)}(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.chMhj-$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(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 ]jah"]h$]h&]uh1j hj%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&]uh1jhj%hhhj.%hM ubj0)}(hkho_retrieve_subtreeh]j6)}(hkho_retrieve_subtreeh]hkho_retrieve_subtree}(hjA%hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj=%ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj%hhhj.%hM ubjO)}(h3(const char *name, phys_addr_t *phys, size_t *size)h](jU)}(hconst char *nameh](j[)}(hjh]hconst}(hj]%hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjY%ubj)}(h h]h }(hjj%hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjY%ubj )}(hcharh]hchar}(hjx%hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjY%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjY%ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY%ubj6)}(hnameh]hname}(hj%hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjY%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjU%ubjU)}(hphys_addr_t *physh](h)}(hhh]j6)}(h phys_addr_th]h phys_addr_t}(hj%hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj%ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj%modnameN classnameNjj)}j]j)}jjC%sbc.kho_retrieve_subtreeasbuh1hhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj%ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj6)}(hphysh]hphys}(hj%hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjU%ubjU)}(h size_t *sizeh](h)}(hhh]j6)}(hsize_th]hsize_t}(hj&hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj&ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj&modnameN classnameNjj)}j]j%c.kho_retrieve_subtreeasbuh1hhj &ubj)}(h h]h }(hj2&hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj &ubj)}(hjh]h*}(hj@&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj &ubj6)}(hsizeh]hsize}(hjM&hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj &ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjU%ubeh}(h]h ]h"]h$]h&]hhuh1jNhj%hhhj.%hM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj%hhhj.%hM ubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj.%hM hj%hhubj)}(hhh]h)}(h*retrieve a preserved sub blob by its name.h]h*retrieve a preserved sub blob by its name.}(hjw&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM hjt&hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj.%hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj&jj&jjjuh1jhhhjhNhNubj)}(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.chM$hj&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.chM!hj&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&hM!hj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hM!hj&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.chM"hj&ubj)}(hhh]h)}(hEif found, the physical address of the sub blob is stored in **phys**.h](h'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#hj6'ubj)}(hhh]h)}(hFif not NULL and found, the size of the sub blob is stored in **size**.h](h=if not NULL and found, the size of the sub blob is stored in }(hjU'hhhNhNubj)}(h**size**h]hsize}(hj]'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU'ubh.}(hjU'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjQ'hM#hjR'ubah}(h]h ]h"]h$]h&]uh1jhj6'ubeh}(h]h ]h"]h$]h&]uh1jhjQ'hM#hj&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&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM%hj&ubh)}(h|Retrieve a preserved sub blob named **name** and store its physical address in **phys** and optionally its size in **size**.h9](h$Retrieve a preserved sub blob named }(hj'hhhNhNubj)}(h**name**h]hname}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh# and store its physical address in }(hj'hhhNhNubj)}(h**phys**h]hphys}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh and optionally its size in }(hj'hhhNhNubj)}(h**size**h]hsize}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM$hj&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'hj&ubh)}(h#0 on success, error code on failureh]h#0 on success, error code 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.chM(hj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h] public-apiah ]h"] public apiah$]h&]uh1hhhhhhhhKQubh)}(hhh](h)}(hSee Alsoh]hSee Also}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hhhhhKWubh bullet_list)}(hhh]h list_item)}(h:doc:`/admin-guide/mm/kho`h]h)}(hj4(h]h)}(hj4(h]j)}(hj4(h]h/admin-guide/mm/kho}(hj<(hhhNhNubah}(h]h ](j$stdstd-doceh"]h$]h&]uh1jhj9(ubah}(h]h ]h"]h$]h&]refdocj1 refdomainjF(reftypedoc refexplicitrefwarnj7/admin-guide/mm/khouh1hhhhKYhj6(ubah}(h]h ]h"]h$]h&]uh1hhhhKYhj2(ubah}(h]h ]h"]h$]h&]uh1j0(hj-(hhhhhNubah}(h]h ]h"]h$]h&]bullet-uh1j+(hhhKYhj(hhubeh}(h]see-alsoah ]h"]see alsoah$]h&]uh1hhhhhhhhKWubeh}(h](kexec-handover-subsystemheh ]h"](kexec handover subsystem kho-conceptseh$]h&]uh1hhhhhhhhKj}jz(hsj}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_handlerj(error_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}(jz(hjy(jv(jwjtjjqj j jzjjyjvjjj(j(jq(jn(u nametypes}(jz(jy(jwjj jzjyjj(jq(uh}(hhjv(hjthjqjzj jzjjjvjjjj(jjjjj"jjj j jp ju jjjjjFjKjjj jj^jcjjj_jdj/j4j j j<"jA"j#j#j%j%jn(j(u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j(KsRparse_messages]transform_messages](hsystem_message)}(hhh]h)}(hhh]h2Hyperlink target "kho-concepts" is not referenced.}hj)sbah}(h]h ]h"]h$]h&]uh1hhj )ubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehnjlineKuh1j )ubj ))}(hhh]h)}(hhh]h-Hyperlink target "kho-fdt" is not referenced.}hj))sbah}(h]h ]h"]h$]h&]uh1hhj&)ubah}(h]h ]h"]h$]h&]levelKtypej#)sourcehnjlineKuh1j )ubj ))}(hhh]h)}(hhh]h1Hyperlink target "kho-scratch" is not referenced.}hjC)sbah}(h]h ]h"]h$]h&]uh1hhj@)ubah}(h]h ]h"]h$]h&]levelKtypej#)sourcehnjlineK+uh1j )ube transformerN include_log] decorationNhhub.