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.chMYubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjhhhjhMYubj0)}(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/hjhhhjhMYubjO)}(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&]hhuh1jNhjhhhjhMYubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMYubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMYhjhhubj)}(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.chMYhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMYubeh}(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.chM]hj 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.chMZhj 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 hMZhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMZhj 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.chM]hj; 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.chM[hjW ubah}(h]h ]h"]h$]h&]uh1jhj; ubeh}(h]h ]h"]h$]h&]uh1jhjV 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)}(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.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.chMbhj 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.chMchj 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.chMWubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjhhhjhMWubj0)}(hkho_preserve_folioh]j6)}(hkho_preserve_folioh]hkho_preserve_folio}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhjhMWubjO)}(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&]hhuh1jNhjhhhjhMWubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMWubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMWhjhhubj)}(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.chMWhjhhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMWubeh}(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.chMXhjubj)}(hhh]h)}(hfolio to preserve.h]hfolio to preserve.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMXhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMXhjubah}(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.chMZhjubh)}(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.chMYhjubh)}(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.chMmubj)}(h h]h }(hjbhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjOhhhjahMmubj0)}(hkho_unpreserve_folioh]j6)}(hkho_unpreserve_folioh]hkho_unpreserve_folio}(hjthhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjpubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjOhhhjahMmubjO)}(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&]hhuh1jNhjOhhhjahMmubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjKhhhjahMmubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhjahMmhjHhhubj)}(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.chMmhjhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjahMmubeh}(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.chMqhj/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.chMnhjNubj)}(hhh]h)}(hfolio to unpreserve.h]hfolio to unpreserve.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMnhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjihMnhjKubah}(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.chMphj/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.chMohj/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.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjhhhjhMubj0)}(hkho_preserve_pagesh]j6)}(hkho_preserve_pagesh]hkho_preserve_pages}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhjhMubjO)}(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&]hhuh1jNhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h&preserve contiguous pages across kexech]h&preserve contiguous pages across kexec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(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.chMhjubj)}(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.chMhj2ubj)}(hhh]h)}(hfirst page in the list.h]hfirst page in the list.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhMhj/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.chMhjkubj)}(hhh]h)}(hnumber of pages.h]hnumber of pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjhMhj/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.chMhjubh)}(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.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_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.chM#hjubj)}(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.chM hjubj)}(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&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(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.chM!hjubj)}(hhh]h)}(h%placeholder for preservation metadatah]h%placeholder for preservation metadata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM!hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM!hjubeh}(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.chM#hjubh)}(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.chM"hjubh)}(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.chM'hjubh)}(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.chM(hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM+hjubh)}(h#0 on success, error code on failureh]h#0 on success, error code on failure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:83: ./kernel/liveupdate/kexec_handover.chM+hjubeh}(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.chMcubj)}(h h]h }(hjhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjhhhjhMcubj0)}(hkho_unpreserve_vmalloch]j6)}(hkho_unpreserve_vmalloch]hkho_unpreserve_vmalloc}(hj hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhjhMcubjO)}(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&]hhuh1jNhjhhhjhMcubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMcubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMchjhhubj)}(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.chMchjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMcubeh}(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.chMghjubj)}(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.chMdhjubj)}(hhh]h)}(h8preservation metadata returned by kho_preserve_vmalloc()h]h8preservation metadata returned by kho_preserve_vmalloc()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMdhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMdhjubah}(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.chMfhjubh)}(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.chMehjubeh}(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.chMyubj)}(h h]h }(hj{hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjhhhhjzhMyubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjzhMyubj0)}(hkho_restore_vmalloch]j6)}(hkho_restore_vmalloch]hkho_restore_vmalloc}(hjhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjhhhhjzhMyubjO)}(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&]hhuh1jNhjhhhhjzhMyubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjdhhhjzhMyubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1jhjzhMyhjahhubj)}(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.chMyhjQhhubah}(h]h ]h"]h$]h&]uh1jhjahhhjzhMyubeh}(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.chM}hjpubj)}(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.chM{hjubj)}(hhh]h)}(hpreservation metadata.h]hpreservation metadata.}(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&]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.chM}hjpubh)}(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.chM|hjpubh)}(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.chMhjpubh)}(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.chMhjpubeh}(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.chMAubj)}(h h]h }(hj#hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj#hhhj#hMAubj0)}(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#hMAubjO)}(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#hMAubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj#hhhj#hMAubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1jhj#hMAhj#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.chMAhj$hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj#hMAubeh}(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.chMEhj-$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.chMBhj-$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.chMFhj-$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.chMHhj-$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.chMLhj-$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.chMLhj-$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.chMUubj)}(h h]h }(hj/%hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj%hhhj.%hMUubj0)}(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.%hMUubjO)}(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.%hMUubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj%hhhj.%hMUubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1jhj.%hMUhj%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.chMUhjt&hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj.%hMUubeh}(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.chMYhj&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.chMVhj&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&hMVhj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMVhj&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.chMWhj&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.chMXhj6'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'hMXhjR'ubah}(h]h ]h"]h$]h&]uh1jhj6'ubeh}(h]h ]h"]h$]h&]uh1jhjQ'hMXhj&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.chMZhj&ubh)}(h|Retrieve a preserved sub blob named **name** and store its physical address in **phys** and optionally its size in **size**.h](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.chMYhj&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)}(hKHO Serialization Blocks APIh]hKHO Serialization Blocks API}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hhhhhKWubh)}(hKHO provides a mechanism to preserve stateful data across a kexec handover by serializing it into memory blocks, and provides the common infrastructure for managing these blocks.h]hKHO provides a mechanism to preserve stateful data across a kexec handover by serializing it into memory blocks, and provides the common infrastructure for managing these blocks.}(hj+(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:89: ./kernel/liveupdate/kho_block.chK hj(hhubh)}(hXEach block consists of a header (struct kho_block_header_ser) followed by an array of serialized entries. Multiple blocks are linked together via a physical pointer in the header, forming a linked list that can be easily traversed in both the current and the next kernel.h]hXEach block consists of a header (struct kho_block_header_ser) followed by an array of serialized entries. Multiple blocks are linked together via a physical pointer in the header, forming a linked list that can be easily traversed in both the current and the next kernel.}(hj:(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:89: ./kernel/liveupdate/kho_block.chK hj(hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_block (C struct) c.kho_blockhNtauh1jhj(hhhNhNubj)}(hhh](j)}(h kho_blockh]j)}(hstruct kho_blockh](j[)}(hj^h]hstruct}(hjb(hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj^(hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKubj)}(h h]h }(hjp(hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj^(hhhjo(hKubj0)}(h kho_blockh]j6)}(hj\(h]h kho_block}(hj(hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj~(ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj^(hhhjo(hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjZ(hhhjo(hKubah}(h]jU(ah ](jjeh"]h$]h&]jj)jhuh1jhjo(hKhjW(hhubj)}(hhh]h)}(h1Internal representation of a serialization block.h]h1Internal representation of a serialization block.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj(hhubah}(h]h ]h"]h$]h&]uh1jhjW(hhhjo(hKubeh}(h]h ](jstructeh"]h$]h&]jjjj(jj(jjjuh1jhhhj(hNhNubj)}(h**Definition**:: struct kho_block { struct list_head list; struct kho_block_header_ser *ser; }; **Members** ``list`` List head for linking blocks in memory. ``ser`` Pointer to the serialized header in preserved memory.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubh:}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj(ubh literal_block)}(hVstruct kho_block { struct list_head list; struct kho_block_header_ser *ser; };h]hVstruct kho_block { struct list_head list; struct kho_block_header_ser *ser; };}hj(sbah}(h]h ]h"]h$]h&]hhuh1j(h\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj(ubh)}(h **Members**h]j)}(hj(h]hMembers}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj(ubj)}(hhh](j)}(h1``list`` List head for linking blocks in memory. h](j)}(h``list``h]j)}(hj)h]hlist}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj )ubj)}(hhh]h)}(h'List head for linking blocks in memory.h]h'List head for linking blocks in memory.}(hj,)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj()hKhj))ubah}(h]h ]h"]h$]h&]uh1jhj )ubeh}(h]h ]h"]h$]h&]uh1jhj()hKhj )ubj)}(h=``ser`` Pointer to the serialized header in preserved memory.h](j)}(h``ser``h]j)}(hjL)h]hser}(hjN)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ)ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhjF)ubj)}(hhh]h)}(h5Pointer to the serialized header in preserved memory.h]h5Pointer to the serialized header in preserved memory.}(hje)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhjb)ubah}(h]h ]h"]h$]h&]uh1jhjF)ubeh}(h]h ]h"]h$]h&]uh1jhja)hKhj )ubeh}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_block_set (C struct)c.kho_block_sethNtauh1jhj(hhhNhNubj)}(hhh](j)}(h kho_block_seth]j)}(hstruct kho_block_seth](j[)}(hj^h]hstruct}(hj)hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj)hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKubj)}(h h]h }(hj)hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj)hhhj)hKubj0)}(h kho_block_seth]j6)}(hj)h]h kho_block_set}(hj)hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj)ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj)hhhj)hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj)hhhj)hKubah}(h]j)ah ](jjeh"]h$]h&]jj)jhuh1jhj)hKhj)hhubj)}(hhh]h)}(h?A set of blocks containing serialized entries of the same type.h]h?A set of blocks containing serialized entries of the same type.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj)hhubah}(h]h ]h"]h$]h&]uh1jhj)hhhj)hKubeh}(h]h ](jstructeh"]h$]h&]jjjj*jj*jjjuh1jhhhj(hNhNubj)}(hXV**Definition**:: struct kho_block_set { struct list_head blocks; long nblocks; u64 head_pa; size_t entry_size; u64 count_per_block; bool incoming; }; **Members** ``blocks`` The list of serialization blocks (struct kho_block). ``nblocks`` The number of allocated serialization blocks. ``head_pa`` Physical address of the first block header. ``entry_size`` The size of each entry in the blocks. ``count_per_block`` The maximum number of entries each block can hold. ``incoming`` True if this block set was restored from the previous kernel.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj *hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh:}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj*ubj()}(hstruct kho_block_set { struct list_head blocks; long nblocks; u64 head_pa; size_t entry_size; u64 count_per_block; bool incoming; };h]hstruct kho_block_set { struct list_head blocks; long nblocks; u64 head_pa; size_t entry_size; u64 count_per_block; bool incoming; };}hj%*sbah}(h]h ]h"]h$]h&]hhuh1j(h\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj*ubh)}(h **Members**h]j)}(hj6*h]hMembers}(hj8*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4*ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK(hj*ubj)}(hhh](j)}(h@``blocks`` The list of serialization blocks (struct kho_block). h](j)}(h ``blocks``h]j)}(hjU*h]hblocks}(hjW*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS*ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhjO*ubj)}(hhh]h)}(h4The list of serialization blocks (struct kho_block).h]h4The list of serialization blocks (struct kho_block).}(hjn*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjj*hKhjk*ubah}(h]h ]h"]h$]h&]uh1jhjO*ubeh}(h]h ]h"]h$]h&]uh1jhjj*hKhjL*ubj)}(h:``nblocks`` The number of allocated serialization blocks. h](j)}(h ``nblocks``h]j)}(hj*h]hnblocks}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj*ubj)}(hhh]h)}(h-The number of allocated serialization blocks.h]h-The number of allocated serialization blocks.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hKhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhjL*ubj)}(h8``head_pa`` Physical address of the first block header. h](j)}(h ``head_pa``h]j)}(hj*h]hhead_pa}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj*ubj)}(hhh]h)}(h+Physical address of the first block header.h]h+Physical address of the first block header.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hKhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hKhjL*ubj)}(h5``entry_size`` The size of each entry in the blocks. h](j)}(h``entry_size``h]j)}(hj+h]h entry_size}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj*ubj)}(hhh]h)}(h%The size of each entry in the blocks.h]h%The size of each entry in the blocks.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hKhj+ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj+hKhjL*ubj)}(hG``count_per_block`` The maximum number of entries each block can hold. h](j)}(h``count_per_block``h]j)}(hj9+h]hcount_per_block}(hj;+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7+ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj3+ubj)}(hhh]h)}(h2The maximum number of entries each block can hold.h]h2The maximum number of entries each block can hold.}(hjR+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjN+hKhjO+ubah}(h]h ]h"]h$]h&]uh1jhj3+ubeh}(h]h ]h"]h$]h&]uh1jhjN+hKhjL*ubj)}(hJ``incoming`` True if this block set was restored from the previous kernel.h](j)}(h ``incoming``h]j)}(hjr+h]hincoming}(hjt+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp+ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhjl+ubj)}(hhh]h)}(h=True if this block set was restored from the previous kernel.h]h=True if this block set was restored from the previous kernel.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK hj+ubah}(h]h ]h"]h$]h&]uh1jhjl+ubeh}(h]h ]h"]h$]h&]uh1jhj+hKhjL*ubeh}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubh)}(h**Note**h]j)}(hj+h]hNote}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK#hj(hhubh)}(hSynchronization and locking are the responsibility of the caller. The block set structure itself is not internally synchronized.h]hSynchronization and locking are the responsibility of the caller. The block set structure itself is not internally synchronized.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK!hj(hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_block_set_it (C struct)c.kho_block_set_ithNtauh1jhj(hhhNhNubj)}(hhh](j)}(hkho_block_set_ith]j)}(hstruct kho_block_set_ith](j[)}(hj^h]hstruct}(hj+hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj+hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK'ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj+hhhj,hK'ubj0)}(hkho_block_set_ith]j6)}(hj+h]hkho_block_set_it}(hj,hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj,ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj+hhhj,hK'ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj+hhhj,hK'ubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1jhj,hK'hj+hhubj)}(hhh]h)}(h-Iterator for serializing entries into blocks.h]h-Iterator for serializing entries into blocks.}(hj5,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK.hj2,hhubah}(h]h ]h"]h$]h&]uh1jhj+hhhj,hK'ubeh}(h]h ](jstructeh"]h$]h&]jjjjM,jjM,jjjuh1jhhhj(hNhNubj)}(hX**Definition**:: struct kho_block_set_it { struct kho_block_set *bs; struct kho_block *block; u64 i; }; **Members** ``bs`` The block set being iterated. ``block`` The current block. ``i`` The current entry index within **block**.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjY,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU,ubh:}(hjU,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK2hjQ,ubj()}(hbstruct kho_block_set_it { struct kho_block_set *bs; struct kho_block *block; u64 i; };h]hbstruct kho_block_set_it { struct kho_block_set *bs; struct kho_block *block; u64 i; };}hjr,sbah}(h]h ]h"]h$]h&]hhuh1j(h\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK4hjQ,ubh)}(h **Members**h]j)}(hj,h]hMembers}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK:hjQ,ubj)}(hhh](j)}(h%``bs`` The block set being iterated. h](j)}(h``bs``h]j)}(hj,h]hbs}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK0hj,ubj)}(hhh]h)}(hThe block set being iterated.h]hThe block set being iterated.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK0hj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hK0hj,ubj)}(h``block`` The current block. h](j)}(h ``block``h]j)}(hj,h]hblock}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK1hj,ubj)}(hhh]h)}(hThe current block.h]hThe current block.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK1hj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hK1hj,ubj)}(h/``i`` The current entry index within **block**.h](j)}(h``i``h]j)}(hj-h]hi}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK1hj-ubj)}(hhh]h)}(h)The current entry index within **block**.h](hThe current entry index within }(hj--hhhNhNubj)}(h **block**h]hblock}(hj5-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj--ubh.}(hj--hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK2hj*-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhj)-hK1hj,ubeh}(h]h ]h"]h$]h&]uh1jhjQ,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jKHO_BLOCK_SET_INIT (C macro)c.KHO_BLOCK_SET_INIThNtauh1jhj(hhhNhNubj)}(hhh](j)}(hKHO_BLOCK_SET_INITh]j)}(hKHO_BLOCK_SET_INITh]j0)}(hKHO_BLOCK_SET_INITh]j6)}(hjz-h]hKHO_BLOCK_SET_INIT}(hj-hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj-ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj|-hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK:ubah}(h]h ]h"]h$]h&]hhjuh1jjjhjx-hhhj-hK:ubah}(h]js-ah ](jjeh"]h$]h&]jj)jhuh1jhj-hK:hju-hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhju-hhhj-hK:ubeh}(h]h ](jmacroeh"]h$]h&]jjjj-jj-jjjuh1jhhhj(hNhNubh)}(h+``KHO_BLOCK_SET_INIT (_name, _entry_size)``h]j)}(hj-h]h'KHO_BLOCK_SET_INIT (_name, _entry_size)}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKhj-ubj)}(hhh](j)}(h.``_name`` Name of the kho_block_set variable. h](j)}(h ``_name``h]j)}(hj .h]h_name}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj .ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK;hj.ubj)}(hhh]h)}(h#Name of the kho_block_set variable.h]h#Name of the kho_block_set variable.}(hj%.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!.hK;hj".ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj!.hK;hj.ubj)}(h8``_entry_size`` The size of each entry in the block set.h](j)}(h``_entry_size``h]j)}(hjE.h]h _entry_size}(hjG.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC.ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK=hj?.ubj)}(hhh]h)}(h(The size of each entry in the block set.h]h(The size of each entry in the block set.}(hj^.hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKThe physical address of the first block header, or 0 if empty.h]h>The physical address of the first block header, or 0 if empty.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhKShj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#kho_block_set_is_empty (C function)c.kho_block_set_is_emptyhNtauh1jhj(hhhNhNubj)}(hhh](j)}(h6bool kho_block_set_is_empty (struct kho_block_set *bs)h]j)}(h5bool kho_block_set_is_empty(struct kho_block_set *bs)h](j )}(hj#h]hbool}(hj30hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj/0hhh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK[ubj)}(h h]h }(hjA0hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj/0hhhj@0hK[ubj0)}(hkho_block_set_is_emptyh]j6)}(hkho_block_set_is_emptyh]hkho_block_set_is_empty}(hjS0hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjO0ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj/0hhhj@0hK[ubjO)}(h(struct kho_block_set *bs)h]jU)}(hstruct kho_block_set *bsh](j[)}(hj^h]hstruct}(hjo0hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjk0ubj)}(h h]h }(hj|0hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjk0ubh)}(hhh]j6)}(h kho_block_seth]h kho_block_set}(hj0hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj0ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj0modnameN classnameNjj)}j]j)}jjU0sbc.kho_block_set_is_emptyasbuh1hhjk0ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjk0ubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk0ubj6)}(hbsh]hbs}(hj0hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjk0ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjg0ubah}(h]h ]h"]h$]h&]hhuh1jNhj/0hhhj@0hK[ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj+0hhhj@0hK[ubah}(h]j&0ah ](jjeh"]h$]h&]jj)jhuh1jhj@0hK[hj(0hhubj)}(hhh]h)}(h/Check if the block set has no allocated blocks.h]h/Check if the block set has no allocated blocks.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK[hj0hhubah}(h]h ]h"]h$]h&]uh1jhj(0hhhj@0hK[ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj 1jj 1jjjuh1jhhhj(hNhNubj)}(h**Parameters** ``struct kho_block_set *bs`` The block set. **Return** True if there are no blocks in the set, false otherwise.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK_hj1ubj)}(hhh]j)}(h,``struct kho_block_set *bs`` The block set. h](j)}(h``struct kho_block_set *bs``h]j)}(hj31h]hstruct kho_block_set *bs}(hj51hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj11ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK\hj-1ubj)}(hhh]h)}(hThe block set.h]hThe block set.}(hjL1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjH1hK\hjI1ubah}(h]h ]h"]h$]h&]uh1jhj-1ubeh}(h]h ]h"]h$]h&]uh1jhjH1hK\hj*1ubah}(h]h ]h"]h$]h&]uh1jhj1ubh)}(h **Return**h]j)}(hjn1h]hReturn}(hjp1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl1ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK^hj1ubh)}(h8True if there are no blocks in the set, false otherwise.h]h8True if there are no blocks in the set, false otherwise.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:92: ./include/linux/kho_block.hhK^hj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_block_set_init (C function)c.kho_block_set_inithNtauh1jhj(hhhNhNubj)}(hhh](j)}(hEvoid kho_block_set_init (struct kho_block_set *bs, size_t entry_size)h]j)}(hDvoid kho_block_set_init(struct kho_block_set *bs, size_t entry_size)h](j )}(hvoidh]hvoid}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj1hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK)ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj1hhhj1hK)ubj0)}(hkho_block_set_inith]j6)}(hkho_block_set_inith]hkho_block_set_init}(hj1hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj1ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj1hhhj1hK)ubjO)}(h-(struct kho_block_set *bs, size_t entry_size)h](jU)}(hstruct kho_block_set *bsh](j[)}(hj^h]hstruct}(hj1hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj1ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj1ubh)}(hhh]j6)}(h kho_block_seth]h kho_block_set}(hj2hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj 2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj2modnameN classnameNjj)}j]j)}jj1sbc.kho_block_set_initasbuh1hhj1ubj)}(h h]h }(hj.2hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj1ubj)}(hjh]h*}(hj<2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj6)}(hbsh]hbs}(hjI2hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj1ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj1ubjU)}(hsize_t entry_sizeh](h)}(hhh]j6)}(hsize_th]hsize_t}(hje2hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjb2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjg2modnameN classnameNjj)}j]j*2c.kho_block_set_initasbuh1hhj^2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj^2ubj6)}(h entry_sizeh]h entry_size}(hj2hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj^2ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj1ubeh}(h]h ]h"]h$]h&]hhuh1jNhj1hhhj1hK)ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj1hhhj1hK)ubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jhj1hK)hj1hhubj)}(hhh]h)}(hInitialize a block set.h]hInitialize a block set.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK)hj2hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhj1hK)ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj2jj2jjjuh1jhhhj(hNhNubj)}(h**Parameters** ``struct kho_block_set *bs`` The block set to initialize. ``size_t entry_size`` The size of each entry in the blocks.h](h)}(h**Parameters**h]j)}(hj2h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK-hj2ubj)}(hhh](j)}(h:``struct kho_block_set *bs`` The block set to initialize. h](j)}(h``struct kho_block_set *bs``h]j)}(hj2h]hstruct kho_block_set *bs}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK*hj2ubj)}(hhh]h)}(hThe block set to initialize.h]hThe block set to initialize.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hK*hj3ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj3hK*hj2ubj)}(h;``size_t entry_size`` The size of each entry in the blocks.h](j)}(h``size_t entry_size``h]j)}(hj53h]hsize_t entry_size}(hj73hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj33ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK,hj/3ubj)}(hhh]h)}(h%The size of each entry in the blocks.h]h%The size of each entry in the blocks.}(hjN3hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chK+hjK3ubah}(h]h ]h"]h$]h&]uh1jhj/3ubeh}(h]h ]h"]h$]h&]uh1jhjJ3hK,hj2ubeh}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkho_block_set_grow (C function)c.kho_block_set_growhNtauh1jhj(hhhNhNubj)}(hhh](j)}(h4ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjC4modnameN classnameNjj)}j]j4c.kho_block_set_growasbuh1hhj:4ubj)}(h h]h }(hj_4hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj:4ubj6)}(hcounth]hcount}(hjm4hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj:4ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj3ubeh}(h]h ]h"]h$]h&]hhuh1jNhj3hhhj3hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj3hhhj3hKubah}(h]j3ah ](jjeh"]h$]h&]jj)jhuh1jhj3hKhj3hhubj)}(hhh]h)}(h5Expand the block set to accommodate the target count.h]h5Expand the block set to accommodate the target count.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj4hhubah}(h]h ]h"]h$]h&]uh1jhj3hhhj3hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1jhhhj(hNhNubj)}(hX**Parameters** ``struct kho_block_set *bs`` The block set. ``u64 count`` The target number of valid entries to accommodate. **Description** Dynamically preallocates and links preserved memory blocks if the target entry count exceeds the current total capacity of the set, ensuring they are available during serialization/deserialization. **Context** Caller must hold a lock protecting the block set. **Return** 0 on success, or a negative errno on failure.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj4ubj)}(hhh](j)}(h,``struct kho_block_set *bs`` The block set. h](j)}(h``struct kho_block_set *bs``h]j)}(hj4h]hstruct kho_block_set *bs}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj4ubj)}(hhh]h)}(hThe block set.h]hThe block set.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hKhj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hKhj4ubj)}(hA``u64 count`` The target number of valid entries to accommodate. h](j)}(h ``u64 count``h]j)}(hj5h]h u64 count}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj 5ubj)}(hhh]h)}(h2The target number of valid entries to accommodate.h]h2The target number of valid entries to accommodate.}(hj*5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&5hKhj'5ubah}(h]h ]h"]h$]h&]uh1jhj 5ubeh}(h]h ]h"]h$]h&]uh1jhj&5hKhj4ubeh}(h]h ]h"]h$]h&]uh1jhj4ubh)}(h**Description**h]j)}(hjL5h]h Description}(hjN5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ5ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj4ubh)}(hDynamically preallocates and links preserved memory blocks if the target entry count exceeds the current total capacity of the set, ensuring they are available during serialization/deserialization.h]hDynamically preallocates and links preserved memory blocks if the target entry count exceeds the current total capacity of the set, ensuring they are available during serialization/deserialization.}(hjb5hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj4ubh)}(h **Context**h]j)}(hjs5h]hContext}(hju5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq5ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj4ubh)}(h1Caller must hold a lock protecting the block set.h]h1Caller must hold a lock protecting the block set.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj4ubh)}(h **Return**h]j)}(hj5h]hReturn}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj4ubh)}(h-0 on success, or a negative errno on failure.h]h-0 on success, or a negative errno on failure.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!kho_block_set_shrink (C function)c.kho_block_set_shrinkhNtauh1jhj(hhhNhNubj)}(hhh](j)}(h?void kho_block_set_shrink (struct kho_block_set *bs, u64 count)h]j)}(h>void kho_block_set_shrink(struct kho_block_set *bs, u64 count)h](j )}(hvoidh]hvoid}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj5hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKubj)}(h h]h }(hj5hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj5hhhj5hKubj0)}(hkho_block_set_shrinkh]j6)}(hkho_block_set_shrinkh]hkho_block_set_shrink}(hj6hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj5ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj5hhhj5hKubjO)}(h%(struct kho_block_set *bs, u64 count)h](jU)}(hstruct kho_block_set *bsh](j[)}(hj^h]hstruct}(hj6hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj6ubj)}(h h]h }(hj)6hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj6ubh)}(hhh]j6)}(h kho_block_seth]h kho_block_set}(hj:6hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj76ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj<6modnameN classnameNjj)}j]j)}jj6sbc.kho_block_set_shrinkasbuh1hhj6ubj)}(h h]h }(hjZ6hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj6ubj)}(hjh]h*}(hjh6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj6)}(hbsh]hbs}(hju6hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj6ubjU)}(h u64 counth](h)}(hhh]j6)}(hu64h]hu64}(hj6hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj6ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj6modnameN classnameNjj)}j]jV6c.kho_block_set_shrinkasbuh1hhj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj6ubj6)}(hcounth]hcount}(hj6hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj6ubeh}(h]h ]h"]h$]h&]hhuh1jNhj5hhhj5hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj5hhhj5hKubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1jhj5hKhj5hhubj)}(hhh]h)}(h5Shrink the block set to accommodate the target count.h]h5Shrink the block set to accommodate the target count.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj6hhubah}(h]h ]h"]h$]h&]uh1jhj5hhhj5hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj6jj6jjjuh1jhhhj(hNhNubj)}(hX**Parameters** ``struct kho_block_set *bs`` The block set. ``u64 count`` The target number of valid entries to accommodate. **Description** Releases and unallocates redundant preserved memory blocks. Checks if the last block in the set can be removed because the remaining entry count is fully accommodated by the preceding blocks. **Note** It is the caller's responsibility to ensure that entries are removed in the reverse order of their insertion. Because shrinking destroys the last block in the set, removing entries in any other order would corrupt active data. **Context** Caller must hold a lock protecting the block set.h](h)}(h**Parameters**h]j)}(hj 7h]h Parameters}(hj 7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj7ubj)}(hhh](j)}(h,``struct kho_block_set *bs`` The block set. h](j)}(h``struct kho_block_set *bs``h]j)}(hj(7h]hstruct kho_block_set *bs}(hj*7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&7ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj"7ubj)}(hhh]h)}(hThe block set.h]hThe block set.}(hjA7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=7hKhj>7ubah}(h]h ]h"]h$]h&]uh1jhj"7ubeh}(h]h ]h"]h$]h&]uh1jhj=7hKhj7ubj)}(hA``u64 count`` The target number of valid entries to accommodate. h](j)}(h ``u64 count``h]j)}(hja7h]h u64 count}(hjc7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_7ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj[7ubj)}(hhh]h)}(h2The target number of valid entries to accommodate.h]h2The target number of valid entries to accommodate.}(hjz7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjv7hKhjw7ubah}(h]h ]h"]h$]h&]uh1jhj[7ubeh}(h]h ]h"]h$]h&]uh1jhjv7hKhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7ubh)}(h**Description**h]j)}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj7ubh)}(hReleases and unallocates redundant preserved memory blocks. Checks if the last block in the set can be removed because the remaining entry count is fully accommodated by the preceding blocks.h]hReleases and unallocates redundant preserved memory blocks. Checks if the last block in the set can be removed because the remaining entry count is fully accommodated by the preceding blocks.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj7ubh)}(h**Note**h]j)}(hj7h]hNote}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj7ubh)}(hIt is the caller's responsibility to ensure that entries are removed in the reverse order of their insertion. Because shrinking destroys the last block in the set, removing entries in any other order would corrupt active data.h]hIt is the caller’s responsibility to ensure that entries are removed in the reverse order of their insertion. Because shrinking destroys the last block in the set, removing entries in any other order would corrupt active data.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj7ubh)}(h **Context**h]j)}(hj7h]hContext}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj7ubh)}(h1Caller must hold a lock protecting the block set.h]h1Caller must hold a lock protecting the block set.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"kho_block_set_restore (C function)c.kho_block_set_restorehNtauh1jhj(hhhNhNubj)}(hhh](j)}(hAint kho_block_set_restore (struct kho_block_set *bs, u64 head_pa)h]j)}(h@int kho_block_set_restore(struct kho_block_set *bs, u64 head_pa)h](j )}(hinth]hint}(hj/8hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj+8hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKubj)}(h h]h }(hj>8hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj+8hhhj=8hKubj0)}(hkho_block_set_restoreh]j6)}(hkho_block_set_restoreh]hkho_block_set_restore}(hjP8hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjL8ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj+8hhhj=8hKubjO)}(h'(struct kho_block_set *bs, u64 head_pa)h](jU)}(hstruct kho_block_set *bsh](j[)}(hj^h]hstruct}(hjl8hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjh8ubj)}(h h]h }(hjy8hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjh8ubh)}(hhh]j6)}(h kho_block_seth]h kho_block_set}(hj8hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj8ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj8modnameN classnameNjj)}j]j)}jjR8sbc.kho_block_set_restoreasbuh1hhjh8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjh8ubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh8ubj6)}(hbsh]hbs}(hj8hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjh8ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjd8ubjU)}(h u64 head_pah](h)}(hhh]j6)}(hu64h]hu64}(hj8hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj8ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj8modnameN classnameNjj)}j]j8c.kho_block_set_restoreasbuh1hhj8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj8ubj6)}(hhead_pah]hhead_pa}(hj 9hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj8ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjd8ubeh}(h]h ]h"]h$]h&]hhuh1jNhj+8hhhj=8hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj'8hhhj=8hKubah}(h]j"8ah ](jjeh"]h$]h&]jj)jhuh1jhj=8hKhj$8hhubj)}(hhh]h)}(h,Restore a block set from a physical address.h]h,Restore a block set from a physical address.}(hj79hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj49hhubah}(h]h ]h"]h$]h&]uh1jhj$8hhhj=8hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjO9jjO9jjjuh1jhhhj(hNhNubj)}(hX**Parameters** ``struct kho_block_set *bs`` The block set to restore. ``u64 head_pa`` Physical address of the first block header. **Description** Restores a serialized block set from a given physical address. The caller is responsible for ensuring that the block set **bs** has been allocated and initialized prior to calling this function. **Return** 0 on success, or a negative errno on failure.h](h)}(h**Parameters**h]j)}(hjY9h]h Parameters}(hj[9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW9ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjS9ubj)}(hhh](j)}(h7``struct kho_block_set *bs`` The block set to restore. h](j)}(h``struct kho_block_set *bs``h]j)}(hjx9h]hstruct kho_block_set *bs}(hjz9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv9ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjr9ubj)}(hhh]h)}(hThe block set to restore.h]hThe block set to restore.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hKhj9ubah}(h]h ]h"]h$]h&]uh1jhjr9ubeh}(h]h ]h"]h$]h&]uh1jhj9hKhjo9ubj)}(h<``u64 head_pa`` Physical address of the first block header. h](j)}(h``u64 head_pa``h]j)}(hj9h]h u64 head_pa}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhj9ubj)}(hhh]h)}(h+Physical address of the first block header.h]h+Physical address of the first block header.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hKhj9ubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhj9hKhjo9ubeh}(h]h ]h"]h$]h&]uh1jhjS9ubh)}(h**Description**h]j)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjS9ubh)}(hRestores a serialized block set from a given physical address. The caller is responsible for ensuring that the block set **bs** has been allocated and initialized prior to calling this function.h](hyRestores a serialized block set from a given physical address. The caller is responsible for ensuring that the block set }(hj:hhhNhNubj)}(h**bs**h]hbs}(hj :hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubhC has been allocated and initialized prior to calling this function.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjS9ubh)}(h **Return**h]j)}(hj%:h]hReturn}(hj':hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#:ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjS9ubh)}(h-0 on success, or a negative errno on failure.h]h-0 on success, or a negative errno on failure.}(hj;:hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chKhjS9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"kho_block_set_destroy (C function)c.kho_block_set_destroyhNtauh1jhj(hhhNhNubj)}(hhh](j)}(h5void kho_block_set_destroy (struct kho_block_set *bs)h]j)}(h4void kho_block_set_destroy(struct kho_block_set *bs)h](j )}(hvoidh]hvoid}(hjj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjf:hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM(ubj)}(h h]h }(hjy:hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjf:hhhjx:hM(ubj0)}(hkho_block_set_destroyh]j6)}(hkho_block_set_destroyh]hkho_block_set_destroy}(hj:hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj:ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjf:hhhjx:hM(ubjO)}(h(struct kho_block_set *bs)h]jU)}(hstruct kho_block_set *bsh](j[)}(hj^h]hstruct}(hj:hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj:ubh)}(hhh]j6)}(h kho_block_seth]h kho_block_set}(hj:hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj:ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj:modnameN classnameNjj)}j]j)}jj:sbc.kho_block_set_destroyasbuh1hhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj:ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj6)}(hbsh]hbs}(hj;hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj:ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj:ubah}(h]h ]h"]h$]h&]hhuh1jNhjf:hhhjx:hM(ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjb:hhhjx:hM(ubah}(h]j]:ah ](jjeh"]h$]h&]jj)jhuh1jhjx:hM(hj_:hhubj)}(hhh]h)}(h"Destroy all blocks in a block set.h]h"Destroy all blocks in a block set.}(hj*;hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM(hj';hhubah}(h]h ]h"]h$]h&]uh1jhj_:hhhjx:hM(ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjB;jjB;jjjuh1jhhhj(hNhNubj)}(h=**Parameters** ``struct kho_block_set *bs`` The block set.h](h)}(h**Parameters**h]j)}(hjL;h]h Parameters}(hjN;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ;ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM,hjF;ubj)}(hhh]j)}(h+``struct kho_block_set *bs`` The block set.h](j)}(h``struct kho_block_set *bs``h]j)}(hjk;h]hstruct kho_block_set *bs}(hjm;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji;ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM.hje;ubj)}(hhh]h)}(hThe block set.h]hThe block set.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM)hj;ubah}(h]h ]h"]h$]h&]uh1jhje;ubeh}(h]h ]h"]h$]h&]uh1jhj;hM.hjb;ubah}(h]h ]h"]h$]h&]uh1jhjF;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j kho_block_set_clear (C function)c.kho_block_set_clearhNtauh1jhj(hhhNhNubj)}(hhh](j)}(h3void kho_block_set_clear (struct kho_block_set *bs)h]j)}(h2void kho_block_set_clear(struct kho_block_set *bs)h](j )}(hvoidh]hvoid}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj;hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM9ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj;hhhj;hM9ubj0)}(hkho_block_set_clearh]j6)}(hkho_block_set_clearh]hkho_block_set_clear}(hj;hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj;ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj;hhhj;hM9ubjO)}(h(struct kho_block_set *bs)h]jU)}(hstruct kho_block_set *bsh](j[)}(hj^h]hstruct}(hj<hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj;ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj;ubh)}(hhh]j6)}(h kho_block_seth]h kho_block_set}(hj <hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj<ubah}(h]h ]h"Vs]h$]h&] refdomainjreftypej reftargetj"<modnameN classnameNjj)}j]j)}jj;sbc.kho_block_set_clearasbuh1hhj;ubj)}(h h]h }(hj@<hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj;ubj)}(hjh]h*}(hjN<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj6)}(hbsh]hbs}(hj[<hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj;ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThj;ubah}(h]h ]h"]h$]h&]hhuh1jNhj;hhhj;hM9ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj;hhhj;hM9ubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhj;hM9hj;hhubj)}(hhh]h)}(h)Clear all serialized data in a block set.h]h)Clear all serialized data in a block set.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM9hj<hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhj;hM9ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj<jj<jjjuh1jhhhj(hNhNubj)}(hF**Parameters** ``struct kho_block_set *bs`` The block set to clear.h](h)}(h**Parameters**h]j)}(hj<h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM=hj<ubj)}(hhh]j)}(h4``struct kho_block_set *bs`` The block set to clear.h](j)}(h``struct kho_block_set *bs``h]j)}(hj<h]hstruct kho_block_set *bs}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM?hj<ubj)}(hhh]h)}(hThe block set to clear.h]hThe block set to clear.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chM:hj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hM?hj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"kho_block_set_it_init (C function)c.kho_block_set_it_inithNtauh1jhj(hhhNhNubj)}(hhh](j)}(hRvoid kho_block_set_it_init (struct kho_block_set_it *it, struct kho_block_set *bs)h]j)}(hQvoid kho_block_set_it_init(struct kho_block_set_it *it, struct kho_block_set *bs)h](j )}(hvoidh]hvoid}(hj =hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj=hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMGubj)}(h h]h }(hj/=hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj=hhhj.=hMGubj0)}(hkho_block_set_it_inith]j6)}(hkho_block_set_it_inith]hkho_block_set_it_init}(hjA=hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj==ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj=hhhj.=hMGubjO)}(h7(struct kho_block_set_it *it, struct kho_block_set *bs)h](jU)}(hstruct kho_block_set_it *ith](j[)}(hj^h]hstruct}(hj]=hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjY=ubj)}(h h]h }(hjj=hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjY=ubh)}(hhh]j6)}(hkho_block_set_ith]hkho_block_set_it}(hj{=hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjx=ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj}=modnameN classnameNjj)}j]j)}jjC=sbc.kho_block_set_it_initasbuh1hhjY=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)}(hith]hit}(hj=hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjY=ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjU=ubjU)}(hstruct kho_block_set *bsh](j[)}(hj^h]hstruct}(hj=hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj=ubh)}(hhh]j6)}(h kho_block_seth]h kho_block_set}(hj=hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj=ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj=modnameN classnameNjj)}j]j=c.kho_block_set_it_initasbuh1hhj=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)}(hbsh]hbs}(hj&>hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj=ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjU=ubeh}(h]h ]h"]h$]h&]hhuh1jNhj=hhhj.=hMGubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj=hhhj.=hMGubah}(h]j=ah ](jjeh"]h$]h&]jj)jhuh1jhj.=hMGhj=hhubj)}(hhh]h)}(h Initialize a block set iterator.h]h Initialize a block set iterator.}(hjP>hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMGhjM>hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhj.=hMGubeh}(h]h ](jfunctioneh"]h$]h&]jjjjh>jjh>jjjuh1jhhhj(hNhNubj)}(h**Parameters** ``struct kho_block_set_it *it`` The iterator to initialize. ``struct kho_block_set *bs`` The block set to iterate over.h](h)}(h**Parameters**h]j)}(hjr>h]h Parameters}(hjt>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp>ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMKhjl>ubj)}(hhh](j)}(h<``struct kho_block_set_it *it`` The iterator to initialize. h](j)}(h``struct kho_block_set_it *it``h]j)}(hj>h]hstruct kho_block_set_it *it}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMHhj>ubj)}(hhh]h)}(hThe iterator to initialize.h]hThe iterator to initialize.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMHhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hMHhj>ubj)}(h;``struct kho_block_set *bs`` The block set to iterate over.h](j)}(h``struct kho_block_set *bs``h]j)}(hj>h]hstruct kho_block_set *bs}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMJhj>ubj)}(hhh]h)}(hThe block set to iterate over.h]hThe block set to iterate over.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMIhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hMJhj>ubeh}(h]h ]h"]h$]h&]uh1jhjl>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j+kho_block_set_it_reserve_entry (C function) c.kho_block_set_it_reserve_entryhNtauh1jhj(hhhNhNubj)}(hhh](j)}(hCvoid * kho_block_set_it_reserve_entry (struct kho_block_set_it *it)h]j)}(hAvoid *kho_block_set_it_reserve_entry(struct kho_block_set_it *it)h](j )}(hvoidh]hvoid}(hj$?hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ?hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMSubj)}(h h]h }(hj3?hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj ?hhhj2?hMSubj)}(hjh]h*}(hjA?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ?hhhj2?hMSubj0)}(hkho_block_set_it_reserve_entryh]j6)}(hkho_block_set_it_reserve_entryh]hkho_block_set_it_reserve_entry}(hjR?hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjN?ubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj ?hhhj2?hMSubjO)}(h(struct kho_block_set_it *it)h]jU)}(hstruct kho_block_set_it *ith](j[)}(hj^h]hstruct}(hjn?hhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjj?ubj)}(h h]h }(hj{?hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjj?ubh)}(hhh]j6)}(hkho_block_set_ith]hkho_block_set_it}(hj?hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj?ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj?modnameN classnameNjj)}j]j)}jjT?sb c.kho_block_set_it_reserve_entryasbuh1hhjj?ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjj?ubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj?ubj6)}(hith]hit}(hj?hhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjj?ubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjf?ubah}(h]h ]h"]h$]h&]hhuh1jNhj ?hhhj2?hMSubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj?hhhj2?hMSubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jhj2?hMShj?hhubj)}(hhh]h)}(h7Reserve and return the next available slot for writing.h]h7Reserve and return the next available slot for writing.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMShj?hhubah}(h]h ]h"]h$]h&]uh1jhj?hhhj2?hMSubeh}(h]h ](jfunctioneh"]h$]h&]jjjj @jj @jjjuh1jhhhj(hNhNubj)}(hX**Parameters** ``struct kho_block_set_it *it`` The block iterator. **Description** Reserves a slot in the current block during state serialization to add a new entry, advancing the internal index. If the current block is full, it automatically moves to the next block in the set. **Return** A pointer to the reserved entry slot, or NULL if the block set's capacity is fully exhausted.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMWhj @ubj)}(hhh]j)}(h4``struct kho_block_set_it *it`` The block iterator. h](j)}(h``struct kho_block_set_it *it``h]j)}(hj2@h]hstruct kho_block_set_it *it}(hj4@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0@ubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMThj,@ubj)}(hhh]h)}(hThe block iterator.h]hThe block iterator.}(hjK@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjG@hMThjH@ubah}(h]h ]h"]h$]h&]uh1jhj,@ubeh}(h]h ]h"]h$]h&]uh1jhjG@hMThj)@ubah}(h]h ]h"]h$]h&]uh1jhj @ubh)}(h**Description**h]j)}(hjm@h]h Description}(hjo@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk@ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMVhj @ubh)}(hReserves a slot in the current block during state serialization to add a new entry, advancing the internal index. If the current block is full, it automatically moves to the next block in the set.h]hReserves a slot in the current block during state serialization to add a new entry, advancing the internal index. If the current block is full, it automatically moves to the next block in the set.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMUhj @ubh)}(h **Return**h]j)}(hj@h]hReturn}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMYhj @ubh)}(h]A pointer to the reserved entry slot, or NULL if the block set's capacity is fully exhausted.h]h_A pointer to the reserved entry slot, or NULL if the block set’s capacity is fully exhausted.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMZhj @ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(kho_block_set_it_read_entry (C function)c.kho_block_set_it_read_entryhNtauh1jhj(hhhNhNubj)}(hhh](j)}(h@void * kho_block_set_it_read_entry (struct kho_block_set_it *it)h]j)}(h>void *kho_block_set_it_read_entry(struct kho_block_set_it *it)h](j )}(hvoidh]hvoid}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj@hhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMqubj)}(h h]h }(hj@hhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhj@hhhj@hMqubj)}(hjh]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhj@hMqubj0)}(hkho_block_set_it_read_entryh]j6)}(hkho_block_set_it_read_entryh]hkho_block_set_it_read_entry}(hjAhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjAubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hj@hhhj@hMqubjO)}(h(struct kho_block_set_it *it)h]jU)}(hstruct kho_block_set_it *ith](j[)}(hj^h]hstruct}(hj#AhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjAubj)}(h h]h }(hj0AhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjAubh)}(hhh]j6)}(hkho_block_set_ith]hkho_block_set_it}(hjAAhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hj>Aubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjCAmodnameN classnameNjj)}j]j)}jj Asbc.kho_block_set_it_read_entryasbuh1hhjAubj)}(h h]h }(hjaAhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjAubj)}(hjh]h*}(hjoAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj6)}(hith]hit}(hj|AhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjAubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjAubah}(h]h ]h"]h$]h&]hhuh1jNhj@hhhj@hMqubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj@hhhj@hMqubah}(h]j@ah ](jjeh"]h$]h&]jj)jhuh1jhj@hMqhj@hhubj)}(hhh]h)}(h2Read the next serialized entry from the block set.h]h2Read the next serialized entry from the block set.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMqhjAhhubah}(h]h ]h"]h$]h&]uh1jhj@hhhj@hMqubeh}(h]h ](jfunctioneh"]h$]h&]jjjjAjjAjjjuh1jhhhj(hNhNubj)}(hXC**Parameters** ``struct kho_block_set_it *it`` The block iterator. **Description** Iterates through previously written entries during state deserialization, respecting the actual count stored in each block's header. **Return** A pointer to the next serialized entry, or NULL if all serialized entries have been read.h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMuhjAubj)}(hhh]j)}(h4``struct kho_block_set_it *it`` The block iterator. h](j)}(h``struct kho_block_set_it *it``h]j)}(hjAh]hstruct kho_block_set_it *it}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMrhjAubj)}(hhh]h)}(hThe block iterator.h]hThe block iterator.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMrhjAubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhjAhMrhjAubah}(h]h ]h"]h$]h&]uh1jhjAubh)}(h**Description**h]j)}(hj"Bh]h Description}(hj$BhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Bubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMthjAubh)}(hIterates through previously written entries during state deserialization, respecting the actual count stored in each block's header.h]hIterates through previously written entries during state deserialization, respecting the actual count stored in each block’s header.}(hj8BhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMshjAubh)}(h **Return**h]j)}(hjIBh]hReturn}(hjKBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGBubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMvhjAubh)}(hYA pointer to the next serialized entry, or NULL if all serialized entries have been read.h]hYA pointer to the next serialized entry, or NULL if all serialized entries have been read.}(hj_BhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMwhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"kho_block_set_it_prev (C function)c.kho_block_set_it_prevhNtauh1jhj(hhhNhNubj)}(hhh](j)}(h:void * kho_block_set_it_prev (struct kho_block_set_it *it)h]j)}(h8void *kho_block_set_it_prev(struct kho_block_set_it *it)h](j )}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjBhhh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMubj)}(h h]h }(hjBhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjBhhhjBhMubj)}(hjh]h*}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBhhhjBhMubj0)}(hkho_block_set_it_prevh]j6)}(hkho_block_set_it_prevh]hkho_block_set_it_prev}(hjBhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjBubah}(h]h ](jIjJeh"]h$]h&]hhuh1j/hjBhhhjBhMubjO)}(h(struct kho_block_set_it *it)h]jU)}(hstruct kho_block_set_it *ith](j[)}(hj^h]hstruct}(hjBhhhNhNubah}(h]h ]jgah"]h$]h&]uh1jZhjBubj)}(h h]h }(hjBhhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjBubh)}(hhh]j6)}(hkho_block_set_ith]hkho_block_set_it}(hjBhhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjBubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjBmodnameN classnameNjj)}j]j)}jjBsbc.kho_block_set_it_prevasbuh1hhjBubj)}(h h]h }(hjChhhNhNubah}(h]h ]j+ah"]h$]h&]uh1jhjBubj)}(hjh]h*}(hj$ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj6)}(hith]hit}(hj1ChhhNhNubah}(h]h ]jBah"]h$]h&]uh1j5hjBubeh}(h]h ]h"]h$]h&]noemphhhuh1jThjBubah}(h]h ]h"]h$]h&]hhuh1jNhjBhhhjBhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjBhhhjBhMubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhjBhMhjBhhubj)}(hhh]h)}(h0Return the previous entry slot in the block set.h]h0Return the previous entry slot in the block set.}(hj[ChhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjXChhubah}(h]h ]h"]h$]h&]uh1jhjBhhhjBhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsCjjsCjjjuh1jhhhj(hNhNubj)}(hX'**Parameters** ``struct kho_block_set_it *it`` The block iterator. **Description** If the current index is at the start of a block, it automatically moves to the end of the previous block. **Return** A pointer to the previous entry slot, or NULL if at the very beginning of the block set.h](h)}(h**Parameters**h]j)}(hj}Ch]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{Cubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjwCubj)}(hhh]j)}(h4``struct kho_block_set_it *it`` The block iterator. h](j)}(h``struct kho_block_set_it *it``h]j)}(hjCh]hstruct kho_block_set_it *it}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjCubj)}(hhh]h)}(hThe block iterator.h]hThe block iterator.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjCubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhjChMhjCubah}(h]h ]h"]h$]h&]uh1jhjwCubh)}(h**Description**h]j)}(hjCh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjwCubh)}(hiIf the current index is at the start of a block, it automatically moves to the end of the previous block.h]hiIf the current index is at the start of a block, it automatically moves to the end of the previous block.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjwCubh)}(h **Return**h]j)}(hjCh]hReturn}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjwCubh)}(hXA pointer to the previous entry slot, or NULL if at the very beginning of the block set.h]hXA pointer to the previous entry slot, or NULL if at the very beginning of the block set.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh`/var/lib/git/docbuild/linux/Documentation/core-api/kho/index:94: ./kernel/liveupdate/kho_block.chMhjwCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj(hhhNhNubeh}(h]kho-serialization-blocks-apiah ]h"]kho serialization blocks apiah$]h&]uh1hhhhhhhhKWubh)}(hhh](h)}(hSee Alsoh]hSee Also}(hj5DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2DhhhhhKbubh bullet_list)}(hhh]h list_item)}(h:doc:`/admin-guide/mm/kho`h]h)}(hjLDh]h)}(hjLDh]j)}(hjLDh]h/admin-guide/mm/kho}(hjTDhhhNhNubah}(h]h ](j$stdstd-doceh"]h$]h&]uh1jhjQDubah}(h]h ]h"]h$]h&]refdocj1 refdomainj^Dreftypedoc refexplicitrefwarnj7/admin-guide/mm/khouh1hhhhKdhjNDubah}(h]h ]h"]h$]h&]uh1hhhhKdhjJDubah}(h]h ]h"]h$]h&]uh1jHDhjEDhhhhhNubah}(h]h ]h"]h$]h&]bullet-uh1jCDhhhKdhj2Dhhubeh}(h]see-alsoah ]h"]see alsoah$]h&]uh1hhhhhhhhKbubeh}(h](kexec-handover-subsystemheh ]h"](kexec handover subsystem kho-conceptseh$]h&]uh1hhhhhhhhKj}jDhsj}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_handlerjDerror_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}(jDhjDjDjwjtjjqj j jzjjyjvjjj(j(j/Dj,DjDjDu nametypes}(jDjDjwjj jzjyjj(j/DjDuh}(hhjDhjthjqjzj jzjjjvjjjj(jjjjj"jjj j jp ju jjjjjFjKjjj jj^jcjjj_jdj/j4j j j<"jA"j#j#j%j%j,Dj(jU(jZ(j)j)j+j+js-jx-j.j.j&0j+0j1j1j3j3j5j5j"8j'8j]:jb:j;j;j=j=j?j?j@j@jBjBjDj2Du footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jDKsRparse_messages]transform_messages](hsystem_message)}(hhh]h)}(hhh]h2Hyperlink target "kho-concepts" is not referenced.}hj&Esbah}(h]h ]h"]h$]h&]uh1hhj#Eubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehnjlineKuh1j!Eubj"E)}(hhh]h)}(hhh]h-Hyperlink target "kho-fdt" is not referenced.}hjAEsbah}(h]h ]h"]h$]h&]uh1hhj>Eubah}(h]h ]h"]h$]h&]levelKtypej;EsourcehnjlineKuh1j!Eubj"E)}(hhh]h)}(hhh]h1Hyperlink target "kho-scratch" is not referenced.}hj[Esbah}(h]h ]h"]h$]h&]uh1hhjXEubah}(h]h ]h"]h$]h&]levelKtypej;EsourcehnjlineK+uh1j!Eube transformerN include_log] decorationNhhub.