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/livepatch/apimodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/zh_TW/livepatch/apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/it_IT/livepatch/apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/ja_JP/livepatch/apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/ko_KR/livepatch/apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/sp_SP/livepatch/apimodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh;/var/lib/git/docbuild/linux/Documentation/livepatch/api.rsthKubhsection)}(hhh](htitle)}(hLivepatching APIsh]hLivepatching APIs}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hLivepatch Enablementh]hLivepatch Enablement}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleklp_enable_patch (C function)c.klp_enable_patchhNtauh1hhhhhhNhNubhdesc)}(hhh](hdesc_signature)}(h.int klp_enable_patch (struct klp_patch *patch)h]hdesc_signature_line)}(h-int klp_enable_patch(struct klp_patch *patch)h](hdesc_sig_keyword_type)}(hinth]hint}(hhhhhNhNubah}(h]h ]ktah"]h$]h&]uh1hhhhhhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMNubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhhhhhj hMNubh desc_name)}(hklp_enable_patchh]h desc_sig_name)}(hklp_enable_patchh]hklp_enable_patch}(hj'hhhNhNubah}(h]h ]nah"]h$]h&]uh1j%hj!ubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhhhhhj hMNubhdesc_parameterlist)}(h(struct klp_patch *patch)h]hdesc_parameter)}(hstruct klp_patch *patchh](hdesc_sig_keyword)}(hstructh]hstruct}(hjLhhhNhNubah}(h]h ]kah"]h$]h&]uh1jJhjFubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubh)}(hhh]j&)}(h klp_patchh]h klp_patch}(hjlhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjiubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjnmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jj)sbc.klp_enable_patchasbuh1hhjFubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjFubj&)}(hpatchh]hpatch}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjFubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj@ubah}(h]h ]h"]h$]h&]hhuh1j>hhhhhj hMNubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1hsphinx_line_type declaratorhhhhhj hMNubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1hhj hMNhhhhubh desc_content)}(hhh]h paragraph)}(henable the livepatchh]henable the livepatch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMBhjhhubah}(h]h ]h"]h$]h&]uh1jhhhhhj hMNubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1hhhhhhNhNubh container)}(hX**Parameters** ``struct klp_patch *patch`` patch to be enabled **Description** Initializes the data structure associated with the patch, creates the sysfs interface, performs the needed symbol lookups and code relocations, registers the patched functions with ftrace. This function is supposed to be called from the livepatch module_init() callback. **Return** 0 on success, otherwise errorh](j)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMFhjubhdefinition_list)}(hhh]hdefinition_list_item)}(h0``struct klp_patch *patch`` patch to be enabled h](hterm)}(h``struct klp_patch *patch``h]hliteral)}(hj;h]hstruct klp_patch *patch}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj9ubah}(h]h ]h"]h$]h&]uh1j7hU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMChj3ubh definition)}(hhh]j)}(hpatch to be enabledh]hpatch to be enabled}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRhMChjUubah}(h]h ]h"]h$]h&]uh1jShj3ubeh}(h]h ]h"]h$]h&]uh1j1hjRhMChj.ubah}(h]h ]h"]h$]h&]uh1j,hjubj)}(h**Description**h]j)}(hjzh]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMEhjubj)}(hInitializes the data structure associated with the patch, creates the sysfs interface, performs the needed symbol lookups and code relocations, registers the patched functions with ftrace.h]hInitializes the data structure associated with the patch, creates the sysfs interface, performs the needed symbol lookups and code relocations, registers the patched functions with ftrace.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMEhjubj)}(hQThis function is supposed to be called from the livepatch module_init() callback.h]hQThis function is supposed to be called from the livepatch module_init() callback.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMIhjubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMLhjubj)}(h0 on success, otherwise errorh]h0 on success, otherwise error}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMLhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hhhhhNhNubeh}(h]livepatch-enablementah ]h"]livepatch enablementah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hShadow Variablesh]hShadow Variables}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_shadow_get (C function)c.klp_shadow_gethNtauh1hhjhhhNhNubh)}(hhh](h)}(h3void * klp_shadow_get (void *obj, unsigned long id)h]h)}(h1void *klp_shadow_get(void *obj, unsigned long id)h](h)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj hhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKSubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhKSubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhKSubj )}(hklp_shadow_geth]j&)}(hklp_shadow_geth]hklp_shadow_get}(hj<hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj8ubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhj hhhjhKSubj?)}(h(void *obj, unsigned long id)h](jE)}(h void *objh](h)}(hvoidh]hvoid}(hjXhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjTubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj&)}(hobjh]hobj}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjTubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhjPubjE)}(hunsigned long idh](h)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj&)}(hidh]hid}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhjPubeh}(h]h ]h"]h$]h&]hhuh1j>hj hhhjhKSubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhKSubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhKShjhhubj)}(hhh]j)}(h'retrieve a shadow variable data pointerh]h'retrieve a shadow variable data pointer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKSubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjj j j uh1hhhhjhNhNubj )}(h**Parameters** ``void *obj`` pointer to parent object ``unsigned long id`` data identifier **Return** the shadow variable data element, NULL on failure.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKQhjubj-)}(hhh](j2)}(h'``void *obj`` pointer to parent object h](j8)}(h ``void *obj``h]j>)}(hj=h]h void *obj}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj;ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKNhj7ubjT)}(hhh]j)}(hpointer to parent objecth]hpointer to parent object}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRhKNhjSubah}(h]h ]h"]h$]h&]uh1jShj7ubeh}(h]h ]h"]h$]h&]uh1j1hjRhKNhj4ubj2)}(h%``unsigned long id`` data identifier h](j8)}(h``unsigned long id``h]j>)}(hjvh]hunsigned long id}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjtubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKOhjpubjT)}(hhh]j)}(hdata identifierh]hdata identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKOhjubah}(h]h ]h"]h$]h&]uh1jShjpubeh}(h]h ]h"]h$]h&]uh1j1hjhKOhj4ubeh}(h]h ]h"]h$]h&]uh1j,hjubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKQhjubj)}(h2the shadow variable data element, NULL on failure.h]h2the shadow variable data element, NULL on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKQhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_shadow_alloc (C function)c.klp_shadow_allochNtauh1hhjhhhNhNubh)}(hhh](h)}(h|void * klp_shadow_alloc (void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)h]h)}(hzvoid *klp_shadow_alloc(void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)h](h)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj )}(hklp_shadow_alloch]j&)}(hklp_shadow_alloch]hklp_shadow_alloc}(hj$hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj ubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhjhhhjhKubj?)}(hd(void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)h](jE)}(h void *objh](h)}(hvoidh]hvoid}(hj@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj<ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hjh]h*}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj&)}(hobjh]hobj}(hjihhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj8ubjE)}(hunsigned long idh](h)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj~ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubh)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj~ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj&)}(hidh]hid}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj~ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj8ubjE)}(h size_t sizeh](h)}(hhh]j&)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj&sbc.klp_shadow_allocasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj&)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj8ubjE)}(hgfp_t gfp_flagsh](h)}(hhh]j&)}(hgfp_th]hgfp_t}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj"modnameN classnameNjj)}j]jc.klp_shadow_allocasbuh1hhjubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj&)}(h gfp_flagsh]h gfp_flags}(hjLhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj8ubjE)}(hklp_shadow_ctor_t ctorh](h)}(hhh]j&)}(hklp_shadow_ctor_th]hklp_shadow_ctor_t}(hjhhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjeubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjjmodnameN classnameNjj)}j]jc.klp_shadow_allocasbuh1hhjaubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj&)}(hctorh]hctor}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjaubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj8ubjE)}(hvoid *ctor_datah](h)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj&)}(h ctor_datah]h ctor_data}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj8ubeh}(h]h ]h"]h$]h&]hhuh1j>hjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhKhjhhubj)}(hhh]j)}(h&allocate and add a new shadow variableh]h&allocate and add a new shadow variable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjj j j uh1hhhhjhNhNubj )}(hX**Parameters** ``void *obj`` pointer to parent object ``unsigned long id`` data identifier ``size_t size`` size of attached data ``gfp_t gfp_flags`` GFP mask for allocation ``klp_shadow_ctor_t ctor`` custom constructor to initialize the shadow data (optional) ``void *ctor_data`` pointer to any data needed by **ctor** (optional) **Description** Allocates **size** bytes for new shadow variable data using **gfp_flags**. The data are zeroed by default. They are further initialized by **ctor** function if it is not NULL. The new shadow variable is then added to the global hashtable. If an existing shadow variable can be found, this routine will issue a WARN, exit early and return NULL. This function guarantees that the constructor function is called only when the variable did not exist before. The cost is that **ctor** is called in atomic context under a spin lock. **Return** the shadow variable data element, NULL on duplicate or failure.h](j)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubj-)}(hhh](j2)}(h'``void *obj`` pointer to parent object h](j8)}(h ``void *obj``h]j>)}(hjAh]h void *obj}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj?ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj;ubjT)}(hhh]j)}(hpointer to parent objecth]hpointer to parent object}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVhKhjWubah}(h]h ]h"]h$]h&]uh1jShj;ubeh}(h]h ]h"]h$]h&]uh1j1hjVhKhj8ubj2)}(h%``unsigned long id`` data identifier h](j8)}(h``unsigned long id``h]j>)}(hjzh]hunsigned long id}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjxubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjtubjT)}(hhh]j)}(hdata identifierh]hdata identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jShjtubeh}(h]h ]h"]h$]h&]uh1j1hjhKhj8ubj2)}(h&``size_t size`` size of attached data h](j8)}(h``size_t size``h]j>)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjT)}(hhh]j)}(hsize of attached datah]hsize of attached data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKhj8ubj2)}(h,``gfp_t gfp_flags`` GFP mask for allocation h](j8)}(h``gfp_t gfp_flags``h]j>)}(hjh]hgfp_t gfp_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjT)}(hhh]j)}(hGFP mask for allocationh]hGFP mask for allocation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKhj8ubj2)}(hW``klp_shadow_ctor_t ctor`` custom constructor to initialize the shadow data (optional) h](j8)}(h``klp_shadow_ctor_t ctor``h]j>)}(hj%h]hklp_shadow_ctor_t ctor}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj#ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjT)}(hhh]j)}(h;custom constructor to initialize the shadow data (optional)h]h;custom constructor to initialize the shadow data (optional)}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:hKhj;ubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hj:hKhj8ubj2)}(hF``void *ctor_data`` pointer to any data needed by **ctor** (optional) h](j8)}(h``void *ctor_data``h]j>)}(hj^h]hvoid *ctor_data}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj\ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjXubjT)}(hhh]j)}(h1pointer to any data needed by **ctor** (optional)h](hpointer to any data needed by }(hjwhhhNhNubj)}(h**ctor**h]hctor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh (optional)}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjshKhjtubah}(h]h ]h"]h$]h&]uh1jShjXubeh}(h]h ]h"]h$]h&]uh1j1hjshKhj8ubeh}(h]h ]h"]h$]h&]uh1j,hjubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubj)}(hAllocates **size** bytes for new shadow variable data using **gfp_flags**. The data are zeroed by default. They are further initialized by **ctor** function if it is not NULL. The new shadow variable is then added to the global hashtable.h](h Allocates }(hjhhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh* bytes for new shadow variable data using }(hjhhhNhNubj)}(h **gfp_flags**h]h gfp_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhC. The data are zeroed by default. They are further initialized by }(hjhhhNhNubj)}(h**ctor**h]hctor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh\ function if it is not NULL. The new shadow variable is then added to the global hashtable.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubj)}(hrIf an existing shadow variable can be found, this routine will issue a WARN, exit early and return NULL.h]hrIf an existing shadow variable can be found, this routine will issue a WARN, exit early and return NULL.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubj)}(hThis function guarantees that the constructor function is called only when the variable did not exist before. The cost is that **ctor** is called in atomic context under a spin lock.h](hThis function guarantees that the constructor function is called only when the variable did not exist before. The cost is that }(hj hhhNhNubj)}(h**ctor**h]hctor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh/ is called in atomic context under a spin lock.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubj)}(h **Return**h]j)}(hj8 h]hReturn}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6 ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubj)}(h?the shadow variable data element, NULL on duplicate or failure.h]h?the shadow variable data element, NULL on duplicate or failure.}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$klp_shadow_get_or_alloc (C function)c.klp_shadow_get_or_allochNtauh1hhjhhhNhNubh)}(hhh](h)}(hvoid * klp_shadow_get_or_alloc (void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)h]h)}(hvoid *klp_shadow_get_or_alloc(void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)h](h)}(hvoidh]hvoid}(hj} hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjy hhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy hhhj hKubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy hhhj hKubj )}(hklp_shadow_get_or_alloch]j&)}(hklp_shadow_get_or_alloch]hklp_shadow_get_or_alloc}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj ubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhjy hhhj hKubj?)}(hd(void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)h](jE)}(h void *objh](h)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj&)}(hobjh]hobj}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj ubjE)}(hunsigned long idh](h)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hlongh]hlong}(hj% hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubj)}(h h]h }(hj3 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj&)}(hidh]hid}(hjA hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj ubjE)}(h size_t sizeh](h)}(hhh]j&)}(hsize_th]hsize_t}(hj] hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjZ ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj_ modnameN classnameNjj)}j]j)}jj sbc.klp_shadow_get_or_allocasbuh1hhjV ubj)}(h h]h }(hj} hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV ubj&)}(hsizeh]hsize}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjV ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj ubjE)}(hgfp_t gfp_flagsh](h)}(hhh]j&)}(hgfp_th]hgfp_t}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]jy c.klp_shadow_get_or_allocasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj&)}(h gfp_flagsh]h gfp_flags}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj ubjE)}(hklp_shadow_ctor_t ctorh](h)}(hhh]j&)}(hklp_shadow_ctor_th]hklp_shadow_ctor_t}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]jy c.klp_shadow_get_or_allocasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj&)}(hctorh]hctor}(hj hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj ubjE)}(hvoid *ctor_datah](h)}(hvoidh]hvoid}(hj4 hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj0 ubj)}(h h]h }(hjB hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0 ubj)}(hjh]h*}(hjP hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0 ubj&)}(h ctor_datah]h ctor_data}(hj] hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj0 ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj ubeh}(h]h ]h"]h$]h&]hhuh1j>hjy hhhj hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhju hhhj hKubah}(h]jp ah ](jjeh"]h$]h&]jj)jhuh1hhj hKhjr hhubj)}(hhh]j)}(h.get existing or allocate a new shadow variableh]h.get existing or allocate a new shadow variable}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj hhubah}(h]h ]h"]h$]h&]uh1jhjr hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj j j j uh1hhhhjhNhNubj )}(hXu**Parameters** ``void *obj`` pointer to parent object ``unsigned long id`` data identifier ``size_t size`` size of attached data ``gfp_t gfp_flags`` GFP mask for allocation ``klp_shadow_ctor_t ctor`` custom constructor to initialize the shadow data (optional) ``void *ctor_data`` pointer to any data needed by **ctor** (optional) **Description** Returns a pointer to existing shadow data if an shadow variable is already present. Otherwise, it creates a new shadow variable like klp_shadow_alloc(). This function guarantees that only one shadow variable exists with the given **id** for the given **obj**. It also guarantees that the constructor function will be called only when the variable did not exist before. The cost is that **ctor** is called in atomic context under a spin lock. **Return** the shadow variable data element, NULL on failure.h](j)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubj-)}(hhh](j2)}(h'``void *obj`` pointer to parent object h](j8)}(h ``void *obj``h]j>)}(hj h]h void *obj}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjT)}(hhh]j)}(hpointer to parent objecth]hpointer to parent object}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1jShj ubeh}(h]h ]h"]h$]h&]uh1j1hj hKhj ubj2)}(h%``unsigned long id`` data identifier h](j8)}(h``unsigned long id``h]j>)}(hj h]hunsigned long id}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjT)}(hhh]j)}(hdata identifierh]hdata identifier}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1jShj ubeh}(h]h ]h"]h$]h&]uh1j1hj hKhj ubj2)}(h&``size_t size`` size of attached data h](j8)}(h``size_t size``h]j>)}(hj: h]h size_t size}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj8 ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj4 ubjT)}(hhh]j)}(hsize of attached datah]hsize of attached data}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjO hKhjP ubah}(h]h ]h"]h$]h&]uh1jShj4 ubeh}(h]h ]h"]h$]h&]uh1j1hjO hKhj ubj2)}(h,``gfp_t gfp_flags`` GFP mask for allocation h](j8)}(h``gfp_t gfp_flags``h]j>)}(hjs h]hgfp_t gfp_flags}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjq ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjm ubjT)}(hhh]j)}(hGFP mask for allocationh]hGFP mask for allocation}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1jShjm ubeh}(h]h ]h"]h$]h&]uh1j1hj hKhj ubj2)}(hW``klp_shadow_ctor_t ctor`` custom constructor to initialize the shadow data (optional) h](j8)}(h``klp_shadow_ctor_t ctor``h]j>)}(hj h]hklp_shadow_ctor_t ctor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjT)}(hhh]j)}(h;custom constructor to initialize the shadow data (optional)h]h;custom constructor to initialize the shadow data (optional)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1jShj ubeh}(h]h ]h"]h$]h&]uh1j1hj hKhj ubj2)}(hF``void *ctor_data`` pointer to any data needed by **ctor** (optional) h](j8)}(h``void *ctor_data``h]j>)}(hj h]hvoid *ctor_data}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjT)}(hhh]j)}(h1pointer to any data needed by **ctor** (optional)h](hpointer to any data needed by }(hj hhhNhNubj)}(h**ctor**h]hctor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh (optional)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1jShj ubeh}(h]h ]h"]h$]h&]uh1j1hj hKhj ubeh}(h]h ]h"]h$]h&]uh1j,hj ubj)}(h**Description**h]j)}(hj2 h]h Description}(hj4 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0 ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubj)}(hReturns a pointer to existing shadow data if an shadow variable is already present. Otherwise, it creates a new shadow variable like klp_shadow_alloc().h]hReturns a pointer to existing shadow data if an shadow variable is already present. Otherwise, it creates a new shadow variable like klp_shadow_alloc().}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubj)}(hX"This function guarantees that only one shadow variable exists with the given **id** for the given **obj**. It also guarantees that the constructor function will be called only when the variable did not exist before. The cost is that **ctor** is called in atomic context under a spin lock.h](hMThis function guarantees that only one shadow variable exists with the given }(hjW hhhNhNubj)}(h**id**h]hid}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW ubh for the given }(hjW hhhNhNubj)}(h**obj**h]hobj}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW ubh. It also guarantees that the constructor function will be called only when the variable did not exist before. The cost is that }(hjW hhhNhNubj)}(h**ctor**h]hctor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW ubh/ is called in atomic context under a spin lock.}(hjW hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubj)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubj)}(h2the shadow variable data element, NULL on failure.h]h2the shadow variable data element, NULL on failure.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_shadow_free (C function)c.klp_shadow_freehNtauh1hhjhhhNhNubh)}(hhh](h)}(hJvoid klp_shadow_free (void *obj, unsigned long id, klp_shadow_dtor_t dtor)h]h)}(hIvoid klp_shadow_free(void *obj, unsigned long id, klp_shadow_dtor_t dtor)h](h)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj hhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hKubj )}(hklp_shadow_freeh]j&)}(hklp_shadow_freeh]hklp_shadow_free}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhj hhhj hKubj?)}(h5(void *obj, unsigned long id, klp_shadow_dtor_t dtor)h](jE)}(h void *objh](h)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj&)}(hobjh]hobj}(hjIhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhjubjE)}(hunsigned long idh](h)}(hunsignedh]hunsigned}(hjbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj^ubj)}(h h]h }(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubh)}(hlongh]hlong}(hj~hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj^ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj&)}(hidh]hid}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj^ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhjubjE)}(hklp_shadow_dtor_t dtorh](h)}(hhh]j&)}(hklp_shadow_dtor_th]hklp_shadow_dtor_t}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.klp_shadow_freeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj&)}(hdtorh]hdtor}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhjubeh}(h]h ]h"]h$]h&]hhuh1j>hj hhhj hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj hhhj hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1hhj hKhj hhubj)}(hhh]j)}(h+detach and free a shadow variableh]h+detach and free a shadow variable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj&jj&j j j uh1hhhhjhNhNubj )}(hX**Parameters** ``void *obj`` pointer to parent object ``unsigned long id`` data identifier ``klp_shadow_dtor_t dtor`` custom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional) **Description** This function releases the memory for this shadow variable instance, callers should stop referencing it accordingly.h](j)}(h**Parameters**h]j)}(hj0h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj*ubj-)}(hhh](j2)}(h'``void *obj`` pointer to parent object h](j8)}(h ``void *obj``h]j>)}(hjOh]h void *obj}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjMubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjIubjT)}(hhh]j)}(hpointer to parent objecth]hpointer to parent object}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdhKhjeubah}(h]h ]h"]h$]h&]uh1jShjIubeh}(h]h ]h"]h$]h&]uh1j1hjdhKhjFubj2)}(h%``unsigned long id`` data identifier h](j8)}(h``unsigned long id``h]j>)}(hjh]hunsigned long id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjT)}(hhh]j)}(hdata identifierh]hdata identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKhjFubj2)}(h``klp_shadow_dtor_t dtor`` custom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional) h](j8)}(h``klp_shadow_dtor_t dtor``h]j>)}(hjh]hklp_shadow_dtor_t dtor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjT)}(hhh]j)}(hzcustom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional)h]hzcustom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKhjFubeh}(h]h ]h"]h$]h&]uh1j,hj*ubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj*ubj)}(h~This function releases the memory for this shadow variable instance, callers should stop referencing it accordingly.h]h~This function releases the memory for this shadow variable instance, callers should stop referencing it accordingly.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h klp_shadow_free_all (C function)c.klp_shadow_free_allhNtauh1hhjhhhNhNubh)}(hhh](h)}(hCvoid klp_shadow_free_all (unsigned long id, klp_shadow_dtor_t dtor)h]h)}(hBvoid klp_shadow_free_all(unsigned long id, klp_shadow_dtor_t dtor)h](h)}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj>hhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhhjPhMubj )}(hklp_shadow_free_allh]j&)}(hklp_shadow_free_allh]hklp_shadow_free_all}(hjchhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj_ubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhj>hhhjPhMubj?)}(h*(unsigned long id, klp_shadow_dtor_t dtor)h](jE)}(hunsigned long idh](h)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubh)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj&)}(hidh]hid}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj{ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhjwubjE)}(hklp_shadow_dtor_t dtorh](h)}(hhh]j&)}(hklp_shadow_dtor_th]hklp_shadow_dtor_t}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjesbc.klp_shadow_free_allasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj&)}(hdtorh]hdtor}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhjwubeh}(h]h ]h"]h$]h&]hhuh1j>hj>hhhjPhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj:hhhjPhMubah}(h]j5ah ](jjeh"]h$]h&]jj)jhuh1hhjPhMhj7hhubj)}(hhh]j)}(h,detach and free all <_, id> shadow variablesh]h,detach and free all <_, id> shadow variables}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhj(hhubah}(h]h ]h"]h$]h&]uh1jhj7hhhjPhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjCjjCj j j uh1hhhhjhNhNubj )}(hXb**Parameters** ``unsigned long id`` data identifier ``klp_shadow_dtor_t dtor`` custom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional) **Description** This function releases the memory for all <_, id> shadow variable instances, callers should stop referencing them accordingly.h](j)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhjGubj-)}(hhh](j2)}(h%``unsigned long id`` data identifier h](j8)}(h``unsigned long id``h]j>)}(hjlh]hunsigned long id}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhjfubjT)}(hhh]j)}(hdata identifierh]hdata identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jShjfubeh}(h]h ]h"]h$]h&]uh1j1hjhMhjcubj2)}(h``klp_shadow_dtor_t dtor`` custom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional) h](j8)}(h``klp_shadow_dtor_t dtor``h]j>)}(hjh]hklp_shadow_dtor_t dtor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhjubjT)}(hhh]j)}(hzcustom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional)h]hzcustom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhMhjcubeh}(h]h ]h"]h$]h&]uh1j,hjGubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhjGubj)}(h~This function releases the memory for all <_, id> shadow variable instances, callers should stop referencing them accordingly.h]h~This function releases the memory for all <_, id> shadow variable instances, callers should stop referencing them accordingly.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubeh}(h]shadow-variablesah ]h"]shadow variablesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hSystem State Changesh]hSystem State Changes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_get_state (C function)c.klp_get_statehNtauh1hhjhhhNhNubh)}(hhh](h)}(hLstruct klp_state * klp_get_state (struct klp_patch *patch, unsigned long id)h]h)}(hJstruct klp_state *klp_get_state(struct klp_patch *patch, unsigned long id)h](jK)}(hjNh]hstruct}(hj?hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj;hhhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhjLhKubh)}(hhh]j&)}(h klp_stateh]h klp_state}(hj^hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj[ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj`modnameN classnameNjj)}j]j)}j klp_get_statesbc.klp_get_stateasbuh1hhj;hhhjLhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhjLhKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhjLhKubj )}(h klp_get_stateh]j&)}(hj|h]h klp_get_state}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhj;hhhjLhKubj?)}(h+(struct klp_patch *patch, unsigned long id)h](jE)}(hstruct klp_patch *patchh](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j&)}(h klp_patchh]h klp_patch}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jzc.klp_get_stateasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj&)}(hpatchh]hpatch}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhjubjE)}(hunsigned long idh](h)}(hunsignedh]hunsigned}(hj)hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj%ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubh)}(hlongh]hlong}(hjEhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj%ubj)}(h h]h }(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj&)}(hidh]hid}(hjahhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhjubeh}(h]h ]h"]h$]h&]hhuh1j>hj;hhhjLhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj7hhhjLhKubah}(h]j2ah ](jjeh"]h$]h&]jj)jhuh1hhjLhKhj4hhubj)}(hhh]j)}(h>get information about system state modified by the given patchh]h>get information about system state modified by the given patch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhj4hhhjLhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjj j j uh1hhhhjhNhNubj )}(hX**Parameters** ``struct klp_patch *patch`` livepatch that modifies the given system state ``unsigned long id`` custom identifier of the modified system state **Description** Checks whether the given patch modifies the given system state. The function can be called either from pre/post (un)patch callbacks or from the kernel code added by the livepatch. **Return** pointer to struct klp_state when found, otherwise NULL.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubj-)}(hhh](j2)}(hK``struct klp_patch *patch`` livepatch that modifies the given system state h](j8)}(h``struct klp_patch *patch``h]j>)}(hjh]hstruct klp_patch *patch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubjT)}(hhh]j)}(h.livepatch that modifies the given system stateh]h.livepatch that modifies the given system state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKhjubj2)}(hD``unsigned long id`` custom identifier of the modified system state h](j8)}(h``unsigned long id``h]j>)}(hjh]hunsigned long id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubjT)}(hhh]j)}(h.custom identifier of the modified system stateh]h.custom identifier of the modified system state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKhjubeh}(h]h ]h"]h$]h&]uh1j,hjubj)}(h**Description**h]j)}(hj@h]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubj)}(h?Checks whether the given patch modifies the given system state.h]h?Checks whether the given patch modifies the given system state.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubj)}(hsThe function can be called either from pre/post (un)patch callbacks or from the kernel code added by the livepatch.h]hsThe function can be called either from pre/post (un)patch callbacks or from the kernel code added by the livepatch.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubj)}(h **Return**h]j)}(hjvh]hReturn}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubj)}(h7pointer to struct klp_state when found, otherwise NULL.h]h7pointer to struct klp_state when found, otherwise NULL.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_get_prev_state (C function)c.klp_get_prev_statehNtauh1hhjhhhNhNubh)}(hhh](h)}(h8struct klp_state * klp_get_prev_state (unsigned long id)h]h)}(h6struct klp_state *klp_get_prev_state(unsigned long id)h](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjhhhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK@ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK@ubh)}(hhh]j&)}(h klp_stateh]h klp_state}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jklp_get_prev_statesbc.klp_get_prev_stateasbuh1hhjhhhjhK@ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK@ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK@ubj )}(hklp_get_prev_stateh]j&)}(hjh]hklp_get_prev_state}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhjhhhjhK@ubj?)}(h(unsigned long id)h]jE)}(hunsigned long idh](h)}(hunsignedh]hunsigned}(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj1ubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubh)}(hlongh]hlong}(hjQhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj1ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj&)}(hidh]hid}(hjmhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hj1ubeh}(h]h ]h"]h$]h&]noemphhhuh1jDhj-ubah}(h]h ]h"]h$]h&]hhuh1j>hjhhhjhK@ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhK@ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhK@hjhhubj)}(hhh]j)}(hPget information about system state modified by the already installed livepatchesh]hPget information about system state modified by the already installed livepatches}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK-hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK@ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjj j j uh1hhhhjhNhNubj )}(hX}**Parameters** ``unsigned long id`` custom identifier of the modified system state **Description** Checks whether already installed livepatches modify the given system state. The same system state can be modified by more non-cumulative livepatches. It is expected that the latest livepatch has the most up-to-date information. The function can be called only during transition when a new livepatch is being enabled or when such a transition is reverted. It is typically called only from pre/post (un)patch callbacks. **Return** pointer to the latest struct klp_state from already installed livepatches, NULL when not found.h](j),}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK1hjubj-)}(hhh]j2)}(hD``unsigned long id`` custom identifier of the modified system state h](j8)}(h``unsigned long id``h]j>)}(hjh]hunsigned long id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK/hjubjT)}(hhh]j)}(h.custom identifier of the modified system stateh]h.custom identifier of the modified system state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK/hjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhK/hjubah}(h]h ]h"]h$]h&]uh1j,hjubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK1hjubj)}(hKChecks whether already installed livepatches modify the given system state.h]hKChecks whether already installed livepatches modify the given system state.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK1hjubj)}(hThe same system state can be modified by more non-cumulative livepatches. It is expected that the latest livepatch has the most up-to-date information.h]hThe same system state can be modified by more non-cumulative livepatches. It is expected that the latest livepatch has the most up-to-date information.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK4hjubj)}(hThe function can be called only during transition when a new livepatch is being enabled or when such a transition is reverted. It is typically called only from pre/post (un)patch callbacks.h]hThe function can be called only during transition when a new livepatch is being enabled or when such a transition is reverted. It is typically called only from pre/post (un)patch callbacks.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK8hjubj)}(h **Return**h]j)}(hjXh]hReturn}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK=hjubj-)}(hhh]j2)}(h_pointer to the latest struct klp_state from already installed livepatches, NULL when not found.h](j8)}(h3pointer to the latest struct klp_state from alreadyh]h3pointer to the latest struct klp_state from already}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK=hjqubjT)}(hhh]j)}(h+installed livepatches, NULL when not found.h]h+installed livepatches, NULL when not found.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK>hjubah}(h]h ]h"]h$]h&]uh1jShjqubeh}(h]h ]h"]h$]h&]uh1j1hjhK=hjnubah}(h]h ]h"]h$]h&]uh1j,hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubeh}(h]system-state-changesah ]h"]system state changesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Object Typesh]h Object Types}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_func (C struct) c.klp_funchNtauh1hhjhhhNhNubh)}(hhh](h)}(hklp_funch]h)}(hstruct klp_funch](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj )}(hklp_funch]j&)}(hjh]hklp_func}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhKhjhhubj)}(hhh]j)}(h$function structure for live patchingh]h$function structure for live patching}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjj;jj;j j j uh1hhhhjhNhNubj )}(hX**Definition**:: struct klp_func { const char *old_name; void *new_func; unsigned long old_sympos; void *old_func; struct kobject kobj; struct list_head node; struct list_head stack_node; unsigned long old_size, new_size; bool nop; bool patched; bool transition; }; **Members** ``old_name`` name of the function to be patched ``new_func`` pointer to the patched function code ``old_sympos`` a hint indicating which symbol position the old function can be found (optional) ``old_func`` pointer to the function being patched ``kobj`` kobject for sysfs resources ``node`` list node for klp_object func_list ``stack_node`` list node for klp_ops func_stack list ``old_size`` size of the old function ``new_size`` size of the new function ``nop`` temporary patch to use the original code again; dyn. allocated ``patched`` the func has been added to the klp_ops list ``transition`` the func is currently being applied or revertedh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh:}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj?ubh literal_block)}(hX$struct klp_func { const char *old_name; void *new_func; unsigned long old_sympos; void *old_func; struct kobject kobj; struct list_head node; struct list_head stack_node; unsigned long old_size, new_size; bool nop; bool patched; bool transition; };h]hX$struct klp_func { const char *old_name; void *new_func; unsigned long old_sympos; void *old_func; struct kobject kobj; struct list_head node; struct list_head stack_node; unsigned long old_size, new_size; bool nop; bool patched; bool transition; };}hjbsbah}(h]h ]h"]h$]h&]hhuh1j`hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK hj?ubj)}(h **Members**h]j)}(hjsh]hMembers}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK.hj?ubj-)}(hhh](j2)}(h0``old_name`` name of the function to be patched h](j8)}(h ``old_name``h]j>)}(hjh]hold_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhjubjT)}(hhh]j)}(h"name of the function to be patchedh]h"name of the function to be patched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKhjubj2)}(h2``new_func`` pointer to the patched function code h](j8)}(h ``new_func``h]j>)}(hjh]hnew_func}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhjubjT)}(hhh]j)}(h$pointer to the patched function codeh]h$pointer to the patched function code}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKhjubj2)}(h```old_sympos`` a hint indicating which symbol position the old function can be found (optional) h](j8)}(h``old_sympos``h]j>)}(hjh]h old_sympos}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhjubjT)}(hhh]j)}(hPa hint indicating which symbol position the old function can be found (optional)h]hPa hint indicating which symbol position the old function can be found (optional)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKhjubj2)}(h3``old_func`` pointer to the function being patched h](j8)}(h ``old_func``h]j>)}(hj>h]hold_func}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj<ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK hj8ubjT)}(hhh]j)}(h%pointer to the function being patchedh]h%pointer to the function being patched}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjShK hjTubah}(h]h ]h"]h$]h&]uh1jShj8ubeh}(h]h ]h"]h$]h&]uh1j1hjShK hjubj2)}(h%``kobj`` kobject for sysfs resources h](j8)}(h``kobj``h]j>)}(hjwh]hkobj}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjuubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK!hjqubjT)}(hhh]j)}(hkobject for sysfs resourcesh]hkobject for sysfs resources}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK!hjubah}(h]h ]h"]h$]h&]uh1jShjqubeh}(h]h ]h"]h$]h&]uh1j1hjhK!hjubj2)}(h,``node`` list node for klp_object func_list h](j8)}(h``node``h]j>)}(hjh]hnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK"hjubjT)}(hhh]j)}(h"list node for klp_object func_listh]h"list node for klp_object func_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK"hjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhK"hjubj2)}(h5``stack_node`` list node for klp_ops func_stack list h](j8)}(h``stack_node``h]j>)}(hjh]h stack_node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK#hjubjT)}(hhh]j)}(h%list node for klp_ops func_stack listh]h%list node for klp_ops func_stack list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK#hjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhK#hjubj2)}(h&``old_size`` size of the old function h](j8)}(h ``old_size``h]j>)}(hj"h]hold_size}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK$hjubjT)}(hhh]j)}(hsize of the old functionh]hsize of the old function}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7hK$hj8ubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hj7hK$hjubj2)}(h&``new_size`` size of the new function h](j8)}(h ``new_size``h]j>)}(hj[h]hnew_size}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjYubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK%hjUubjT)}(hhh]j)}(hsize of the new functionh]hsize of the new function}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjphK%hjqubah}(h]h ]h"]h$]h&]uh1jShjUubeh}(h]h ]h"]h$]h&]uh1j1hjphK%hjubj2)}(hG``nop`` temporary patch to use the original code again; dyn. allocated h](j8)}(h``nop``h]j>)}(hjh]hnop}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK&hjubjT)}(hhh]j)}(h>temporary patch to use the original code again; dyn. allocatedh]h>temporary patch to use the original code again; dyn. allocated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK&hjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhK&hjubj2)}(h8``patched`` the func has been added to the klp_ops list h](j8)}(h ``patched``h]j>)}(hjh]hpatched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK'hjubjT)}(hhh]j)}(h+the func has been added to the klp_ops listh]h+the func has been added to the klp_ops list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK'hjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhK'hjubj2)}(h>``transition`` the func is currently being applied or revertedh](j8)}(h``transition``h]j>)}(hjh]h transition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK'hjubjT)}(hhh]j)}(h/the func is currently being applied or revertedh]h/the func is currently being applied or reverted}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK(hjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhK'hjubeh}(h]h ]h"]h$]h&]uh1j,hj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj)}(h**Description**h]j)}(hjIh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK+hjhhubj)}(hThe patched and transition variables define the func's patching state. When patching, a func is always in one of the following states:h]hThe patched and transition variables define the func’s patching state. When patching, a func is always in one of the following states:}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK)hjhhubh block_quote)}(hpatched=0 transition=0: unpatched patched=0 transition=1: unpatched, temporary starting state patched=1 transition=1: patched, may be visible to some tasks patched=1 transition=0: patched, visible to all tasks h]j)}(hpatched=0 transition=0: unpatched patched=0 transition=1: unpatched, temporary starting state patched=1 transition=1: patched, may be visible to some tasks patched=1 transition=0: patched, visible to all tasksh]hpatched=0 transition=0: unpatched patched=0 transition=1: unpatched, temporary starting state patched=1 transition=1: patched, may be visible to some tasks patched=1 transition=0: patched, visible to all tasks}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK,hjpubah}(h]h ]h"]h$]h&]uh1jnhjhK,hjhhubj)}(h2And when unpatching, it goes in the reverse order:h]h2And when unpatching, it goes in the reverse order:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK1hjhhubjo)}(hpatched=1 transition=0: patched, visible to all tasks patched=1 transition=1: patched, may be visible to some tasks patched=0 transition=1: unpatched, temporary ending state patched=0 transition=0: unpatched h]j)}(hpatched=1 transition=0: patched, visible to all tasks patched=1 transition=1: patched, may be visible to some tasks patched=0 transition=1: unpatched, temporary ending state patched=0 transition=0: unpatchedh]hpatched=1 transition=0: patched, visible to all tasks patched=1 transition=1: patched, may be visible to some tasks patched=0 transition=1: unpatched, temporary ending state patched=0 transition=0: unpatched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK3hjubah}(h]h ]h"]h$]h&]uh1jnhjhK3hjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_callbacks (C struct)c.klp_callbackshNtauh1hhjhhhNhNubh)}(hhh](h)}(h klp_callbacksh]h)}(hstruct klp_callbacksh](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK;ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK;ubj )}(h klp_callbacksh]j&)}(hjh]h klp_callbacks}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhjhhhjhK;ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhK;ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhK;hjhhubj)}(hhh]j)}(h*pre/post live-(un)patch callback structureh]h*pre/post live-(un)patch callback structure}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKShj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK;ubeh}(h]h ](jstructeh"]h$]h&]jjjj$jj$j j j uh1hhhhjhNhNubj )}(hX<**Definition**:: struct klp_callbacks { int (*pre_patch)(struct klp_object *obj); void (*post_patch)(struct klp_object *obj); void (*pre_unpatch)(struct klp_object *obj); void (*post_unpatch)(struct klp_object *obj); bool post_unpatch_enabled; }; **Members** ``pre_patch`` executed before code patching ``post_patch`` executed after code patching ``pre_unpatch`` executed before code unpatching ``post_unpatch`` executed after code unpatching ``post_unpatch_enabled`` flag indicating if post-unpatch callback should runh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh:}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKWhj(ubja)}(hstruct klp_callbacks { int (*pre_patch)(struct klp_object *obj); void (*post_patch)(struct klp_object *obj); void (*pre_unpatch)(struct klp_object *obj); void (*post_unpatch)(struct klp_object *obj); bool post_unpatch_enabled; };h]hstruct klp_callbacks { int (*pre_patch)(struct klp_object *obj); void (*post_patch)(struct klp_object *obj); void (*pre_unpatch)(struct klp_object *obj); void (*post_unpatch)(struct klp_object *obj); bool post_unpatch_enabled; };}hjIsbah}(h]h ]h"]h$]h&]hhuh1j`hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKYhj(ubj)}(h **Members**h]j)}(hjZh]hMembers}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKahj(ubj-)}(hhh](j2)}(h,``pre_patch`` executed before code patching h](j8)}(h ``pre_patch``h]j>)}(hjyh]h pre_patch}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjwubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKUhjsubjT)}(hhh]j)}(hexecuted before code patchingh]hexecuted before code patching}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKUhjubah}(h]h ]h"]h$]h&]uh1jShjsubeh}(h]h ]h"]h$]h&]uh1j1hjhKUhjpubj2)}(h,``post_patch`` executed after code patching h](j8)}(h``post_patch``h]j>)}(hjh]h post_patch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKVhjubjT)}(hhh]j)}(hexecuted after code patchingh]hexecuted after code patching}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKVhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKVhjpubj2)}(h0``pre_unpatch`` executed before code unpatching h](j8)}(h``pre_unpatch``h]j>)}(hjh]h pre_unpatch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKWhjubjT)}(hhh]j)}(hexecuted before code unpatchingh]hexecuted before code unpatching}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKWhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKWhjpubj2)}(h0``post_unpatch`` executed after code unpatching h](j8)}(h``post_unpatch``h]j>)}(hj$h]h post_unpatch}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj"ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKXhjubjT)}(hhh]j)}(hexecuted after code unpatchingh]hexecuted after code unpatching}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9hKXhj:ubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hj9hKXhjpubj2)}(hL``post_unpatch_enabled`` flag indicating if post-unpatch callback should runh](j8)}(h``post_unpatch_enabled``h]j>)}(hj]h]hpost_unpatch_enabled}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj[ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKYhjWubjT)}(hhh]j)}(h3flag indicating if post-unpatch callback should runh]h3flag indicating if post-unpatch callback should run}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrhKYhjsubah}(h]h ]h"]h$]h&]uh1jShjWubeh}(h]h ]h"]h$]h&]uh1j1hjrhKYhjpubeh}(h]h ]h"]h$]h&]uh1j,hj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK]hjhhubj)}(hXAll callbacks are optional. Only the pre-patch callback, if provided, will be unconditionally executed. If the parent klp_object fails to patch for any reason, including a non-zero error status returned from the pre-patch callback, no further callbacks will be executed.h]hXAll callbacks are optional. Only the pre-patch callback, if provided, will be unconditionally executed. If the parent klp_object fails to patch for any reason, including a non-zero error status returned from the pre-patch callback, no further callbacks will be executed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK[hjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_object (C struct) c.klp_objecthNtauh1hhjhhhNhNubh)}(hhh](h)}(h klp_objecth]h)}(hstruct klp_objecth](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKcubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKcubj )}(h klp_objecth]j&)}(hjh]h klp_object}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhjhhhjhKcubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhKcubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhKchjhhubj)}(hhh]j)}(h)kernel object structure for live patchingh]h)kernel object structure for live patching}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKihjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKcubeh}(h]h ](jstructeh"]h$]h&]jjjj7jj7j j j uh1hhhhjhNhNubj )}(hXR**Definition**:: struct klp_object { const char *name; struct klp_func *funcs; struct klp_callbacks callbacks; struct kobject kobj; struct list_head func_list; struct list_head node; struct module *mod; bool dynamic; bool patched; }; **Members** ``name`` module name (or NULL for vmlinux) ``funcs`` function entries for functions to be patched in the object ``callbacks`` functions to be executed pre/post (un)patching ``kobj`` kobject for sysfs resources ``func_list`` dynamic list of the function entries ``node`` list node for klp_patch obj_list ``mod`` kernel module associated with the patched object (NULL for vmlinux) ``dynamic`` temporary object for nop functions; dynamically allocated ``patched`` the object's funcs have been added to the klp_ops listh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh:}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKmhj;ubja)}(hstruct klp_object { const char *name; struct klp_func *funcs; struct klp_callbacks callbacks; struct kobject kobj; struct list_head func_list; struct list_head node; struct module *mod; bool dynamic; bool patched; };h]hstruct klp_object { const char *name; struct klp_func *funcs; struct klp_callbacks callbacks; struct kobject kobj; struct list_head func_list; struct list_head node; struct module *mod; bool dynamic; bool patched; };}hj\sbah}(h]h ]h"]h$]h&]hhuh1j`hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKohj;ubj)}(h **Members**h]j)}(hjmh]hMembers}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK{hj;ubj-)}(hhh](j2)}(h+``name`` module name (or NULL for vmlinux) h](j8)}(h``name``h]j>)}(hjh]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKkhjubjT)}(hhh]j)}(h!module name (or NULL for vmlinux)h]h!module name (or NULL for vmlinux)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKkhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKkhjubj2)}(hE``funcs`` function entries for functions to be patched in the object h](j8)}(h ``funcs``h]j>)}(hjh]hfuncs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKlhjubjT)}(hhh]j)}(h:function entries for functions to be patched in the objecth]h:function entries for functions to be patched in the object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKlhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKlhjubj2)}(h=``callbacks`` functions to be executed pre/post (un)patching h](j8)}(h ``callbacks``h]j>)}(hjh]h callbacks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKmhjubjT)}(hhh]j)}(h.functions to be executed pre/post (un)patchingh]h.functions to be executed pre/post (un)patching}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKmhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKmhjubj2)}(h%``kobj`` kobject for sysfs resources h](j8)}(h``kobj``h]j>)}(hj7h]hkobj}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj5ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKnhj1ubjT)}(hhh]j)}(hkobject for sysfs resourcesh]hkobject for sysfs resources}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLhKnhjMubah}(h]h ]h"]h$]h&]uh1jShj1ubeh}(h]h ]h"]h$]h&]uh1j1hjLhKnhjubj2)}(h3``func_list`` dynamic list of the function entries h](j8)}(h ``func_list``h]j>)}(hjph]h func_list}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjnubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKohjjubjT)}(hhh]j)}(h$dynamic list of the function entriesh]h$dynamic list of the function entries}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKohjubah}(h]h ]h"]h$]h&]uh1jShjjubeh}(h]h ]h"]h$]h&]uh1j1hjhKohjubj2)}(h*``node`` list node for klp_patch obj_list h](j8)}(h``node``h]j>)}(hjh]hnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKphjubjT)}(hhh]j)}(h list node for klp_patch obj_listh]h list node for klp_patch obj_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKphjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKphjubj2)}(hL``mod`` kernel module associated with the patched object (NULL for vmlinux) h](j8)}(h``mod``h]j>)}(hjh]hmod}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKrhjubjT)}(hhh]j)}(hCkernel module associated with the patched object (NULL for vmlinux)h]hCkernel module associated with the patched object (NULL for vmlinux)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKqhjubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hjhKrhjubj2)}(hF``dynamic`` temporary object for nop functions; dynamically allocated h](j8)}(h ``dynamic``h]j>)}(hjh]hdynamic}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKshjubjT)}(hhh]j)}(h9temporary object for nop functions; dynamically allocatedh]h9temporary object for nop functions; dynamically allocated}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1hKshj2ubah}(h]h ]h"]h$]h&]uh1jShjubeh}(h]h ]h"]h$]h&]uh1j1hj1hKshjubj2)}(hB``patched`` the object's funcs have been added to the klp_ops listh](j8)}(h ``patched``h]j>)}(hjUh]hpatched}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjSubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKshjOubjT)}(hhh]j)}(h6the object's funcs have been added to the klp_ops listh]h8the object’s funcs have been added to the klp_ops list}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKthjkubah}(h]h ]h"]h$]h&]uh1jShjOubeh}(h]h ]h"]h$]h&]uh1j1hjjhKshjubeh}(h]h ]h"]h$]h&]uh1j,hj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_state (C struct) c.klp_statehNtauh1hhjhhhNhNubh)}(hhh](h)}(h klp_stateh]h)}(hstruct klp_stateh](jK)}(hjNh]hstruct}(hjhhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKzubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKzubj )}(h klp_stateh]j&)}(hjh]h klp_state}(hjhhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhjhhhjhKzubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhKzubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhKzhjhhubj)}(hhh]j)}(h-state of the system modified by the livepatchh]h-state of the system modified by the livepatch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKzubeh}(h]h ](jstructeh"]h$]h&]jjjj jj j j j uh1hhhhjhNhNubj )}(h**Definition**:: struct klp_state { unsigned long id; unsigned int version; void *data; }; **Members** ``id`` system state identifier (non-zero) ``version`` version of the change ``data`` custom datah](j)}(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&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj ubja)}(hUstruct klp_state { unsigned long id; unsigned int version; void *data; };h]hUstruct klp_state { unsigned long id; unsigned int version; void *data; };}hj. sbah}(h]h ]h"]h$]h&]hhuh1j`hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj ubj)}(h **Members**h]j)}(hj? h]hMembers}(hjA hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj= ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj ubj-)}(hhh](j2)}(h*``id`` system state identifier (non-zero) h](j8)}(h``id``h]j>)}(hj^ h]hid}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj\ ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhjX ubjT)}(hhh]j)}(h"system state identifier (non-zero)h]h"system state identifier (non-zero)}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs hKhjt ubah}(h]h ]h"]h$]h&]uh1jShjX ubeh}(h]h ]h"]h$]h&]uh1j1hjs hKhjU ubj2)}(h"``version`` version of the change h](j8)}(h ``version``h]j>)}(hj h]hversion}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj ubjT)}(hhh]j)}(hversion of the changeh]hversion of the change}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1jShj ubeh}(h]h ]h"]h$]h&]uh1j1hj hKhjU ubj2)}(h``data`` custom datah](j8)}(h``data``h]j>)}(hj h]hdata}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj ubjT)}(hhh]j)}(h custom datah]h custom data}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj ubah}(h]h ]h"]h$]h&]uh1jShj ubeh}(h]h ]h"]h$]h&]uh1j1hj hKhjU ubeh}(h]h ]h"]h$]h&]uh1j,hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_patch (C struct) c.klp_patchhNtauh1hhjhhhNhNubh)}(hhh](h)}(h klp_patchh]h)}(hstruct klp_patchh](jK)}(hjNh]hstruct}(hj*!hhhNhNubah}(h]h ]jWah"]h$]h&]uh1jJhj&!hhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKubj)}(h h]h }(hj8!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&!hhhj7!hKubj )}(h klp_patchh]j&)}(hj$!h]h klp_patch}(hjJ!hhhNhNubah}(h]h ]j2ah"]h$]h&]uh1j%hjF!ubah}(h]h ](j9j:eh"]h$]h&]hhuh1jhj&!hhhj7!hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj"!hhhj7!hKubah}(h]j!ah ](jjeh"]h$]h&]jj)jhuh1hhj7!hKhj!hhubj)}(hhh]j)}(h!patch structure for live patchingh]h!patch structure for live patching}(hjl!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhji!hhubah}(h]h ]h"]h$]h&]uh1jhj!hhhj7!hKubeh}(h]h ](jstructeh"]h$]h&]jjjj!jj!j j j uh1hhhhjhNhNubj )}(hX**Definition**:: struct klp_patch { struct module *mod; struct klp_object *objs; struct klp_state *states; bool replace; struct list_head list; struct kobject kobj; struct list_head obj_list; bool enabled; bool forced; struct work_struct free_work; struct completion finish; }; **Members** ``mod`` reference to the live patch module ``objs`` object entries for kernel objects to be patched ``states`` system states that can get modified ``replace`` replace all actively used patches ``list`` list node for global list of actively used patches ``kobj`` kobject for sysfs resources ``obj_list`` dynamic list of the object entries ``enabled`` the patch is enabled (but operation may be incomplete) ``forced`` was involved in a forced transition ``free_work`` patch cleanup from workqueue-context ``finish`` for waiting till it is safe to remove the patch moduleh](j)}(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&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj!ubja)}(hX0struct klp_patch { struct module *mod; struct klp_object *objs; struct klp_state *states; bool replace; struct list_head list; struct kobject kobj; struct list_head obj_list; bool enabled; bool forced; struct work_struct free_work; struct completion finish; };h]hX0struct klp_patch { struct module *mod; struct klp_object *objs; struct klp_state *states; bool replace; struct list_head list; struct kobject kobj; struct list_head obj_list; bool enabled; bool forced; struct work_struct free_work; struct completion finish; };}hj!sbah}(h]h ]h"]h$]h&]hhuh1j`hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj!ubj)}(h **Members**h]j)}(hj!h]hMembers}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj!ubj-)}(hhh](j2)}(h+``mod`` reference to the live patch module h](j8)}(h``mod``h]j>)}(hj!h]hmod}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj!ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj!ubjT)}(hhh]j)}(h"reference to the live patch moduleh]h"reference to the live patch module}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!hKhj!ubah}(h]h ]h"]h$]h&]uh1jShj!ubeh}(h]h ]h"]h$]h&]uh1j1hj!hKhj!ubj2)}(h9``objs`` object entries for kernel objects to be patched h](j8)}(h``objs``h]j>)}(hj"h]hobjs}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj"ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj "ubjT)}(hhh]j)}(h/object entries for kernel objects to be patchedh]h/object entries for kernel objects to be patched}(hj+"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'"hKhj("ubah}(h]h ]h"]h$]h&]uh1jShj "ubeh}(h]h ]h"]h$]h&]uh1j1hj'"hKhj!ubj2)}(h/``states`` system states that can get modified h](j8)}(h ``states``h]j>)}(hjK"h]hstates}(hjM"hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjI"ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhjE"ubjT)}(hhh]j)}(h#system states that can get modifiedh]h#system states that can get modified}(hjd"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`"hKhja"ubah}(h]h ]h"]h$]h&]uh1jShjE"ubeh}(h]h ]h"]h$]h&]uh1j1hj`"hKhj!ubj2)}(h.``replace`` replace all actively used patches h](j8)}(h ``replace``h]j>)}(hj"h]hreplace}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj"ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj~"ubjT)}(hhh]j)}(h!replace all actively used patchesh]h!replace all actively used patches}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"hKhj"ubah}(h]h ]h"]h$]h&]uh1jShj~"ubeh}(h]h ]h"]h$]h&]uh1j1hj"hKhj!ubj2)}(h<``list`` list node for global list of actively used patches h](j8)}(h``list``h]j>)}(hj"h]hlist}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj"ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj"ubjT)}(hhh]j)}(h2list node for global list of actively used patchesh]h2list node for global list of actively used patches}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"hKhj"ubah}(h]h ]h"]h$]h&]uh1jShj"ubeh}(h]h ]h"]h$]h&]uh1j1hj"hKhj!ubj2)}(h%``kobj`` kobject for sysfs resources h](j8)}(h``kobj``h]j>)}(hj"h]hkobj}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj"ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj"ubjT)}(hhh]j)}(hkobject for sysfs resourcesh]hkobject for sysfs resources}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj #hKhj #ubah}(h]h ]h"]h$]h&]uh1jShj"ubeh}(h]h ]h"]h$]h&]uh1j1hj #hKhj!ubj2)}(h0``obj_list`` dynamic list of the object entries h](j8)}(h ``obj_list``h]j>)}(hj/#h]hobj_list}(hj1#hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj-#ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj)#ubjT)}(hhh]j)}(h"dynamic list of the object entriesh]h"dynamic list of the object entries}(hjH#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD#hKhjE#ubah}(h]h ]h"]h$]h&]uh1jShj)#ubeh}(h]h ]h"]h$]h&]uh1j1hjD#hKhj!ubj2)}(hC``enabled`` the patch is enabled (but operation may be incomplete) h](j8)}(h ``enabled``h]j>)}(hjh#h]henabled}(hjj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hjf#ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhjb#ubjT)}(hhh]j)}(h6the patch is enabled (but operation may be incomplete)h]h6the patch is enabled (but operation may be incomplete)}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}#hKhj~#ubah}(h]h ]h"]h$]h&]uh1jShjb#ubeh}(h]h ]h"]h$]h&]uh1j1hj}#hKhj!ubj2)}(h/``forced`` was involved in a forced transition h](j8)}(h ``forced``h]j>)}(hj#h]hforced}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj#ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj#ubjT)}(hhh]j)}(h#was involved in a forced transitionh]h#was involved in a forced transition}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#hKhj#ubah}(h]h ]h"]h$]h&]uh1jShj#ubeh}(h]h ]h"]h$]h&]uh1j1hj#hKhj!ubj2)}(h3``free_work`` patch cleanup from workqueue-context h](j8)}(h ``free_work``h]j>)}(hj#h]h free_work}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj#ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj#ubjT)}(hhh]j)}(h$patch cleanup from workqueue-contexth]h$patch cleanup from workqueue-context}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#hKhj#ubah}(h]h ]h"]h$]h&]uh1jShj#ubeh}(h]h ]h"]h$]h&]uh1j1hj#hKhj!ubj2)}(hA``finish`` for waiting till it is safe to remove the patch moduleh](j8)}(h ``finish``h]j>)}(hj$h]hfinish}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j=hj$ubah}(h]h ]h"]h$]h&]uh1j7hW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj $ubjT)}(hhh]j)}(h6for waiting till it is safe to remove the patch moduleh]h6for waiting till it is safe to remove the patch module}(hj,$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj)$ubah}(h]h ]h"]h$]h&]uh1jShj $ubeh}(h]h ]h"]h$]h&]uh1j1hj($hKhj!ubeh}(h]h ]h"]h$]h&]uh1j,hj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubeh}(h] object-typesah ]h"] object typesah$]h&]uh1hhhhhhhhKubeh}(h]livepatching-apisah ]h"]livepatching apisah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj$error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _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}nameids}(ja$j^$jjjjjjjY$jV$u nametypes}(ja$jjjjY$uh}(j^$hjhhhjjjjjjjp ju j j j5j:jjj2j7jjjV$jjjjjjjjjj!j"!u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.