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]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget!/translations/pt_BR/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}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhj hhhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMHubhdesc_sig_space)}(h h]h }(hj$hhhNhNubah}(h]h ]wah"]h$]h&]uh1j"hj hhhj!hMHubh desc_name)}(hklp_enable_patchh]h desc_sig_name)}(hklp_enable_patchh]hklp_enable_patch}(hj;hhhNhNubah}(h]h ]nah"]h$]h&]uh1j9hj5ubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1j3hj hhhj!hMHubhdesc_parameterlist)}(h(struct klp_patch *patch)h]hdesc_parameter)}(hstruct klp_patch *patchh](hdesc_sig_keyword)}(hstructh]hstruct}(hj`hhhNhNubah}(h]h ]kah"]h$]h&]uh1j^hjZubj#)}(h h]h }(hjohhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjZubh)}(hhh]j:)}(h klp_patchh]h klp_patch}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj}ubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jj=sbc.klp_enable_patchasbuh1hhjZubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjZubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjZubj:)}(hpatchh]hpatch}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjZubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjTubah}(h]h ]h"]h$]h&]hhuh1jRhj hhhj!hMHubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1j sphinx_line_type declaratorhjhhhj!hMHubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhj!hMHhjhhubh 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.chMHhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj!hMHubeh}(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)}(hj(h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hj&ubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMLhj"ubhdefinition_list)}(hhh]hdefinition_list_item)}(h0``struct klp_patch *patch`` patch to be enabled h](hterm)}(h``struct klp_patch *patch``h]hliteral)}(hjOh]hstruct klp_patch *patch}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjMubah}(h]h ]h"]h$]h&]uh1jKhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMIhjGubh definition)}(hhh]j)}(hpatch to be enabledh]hpatch to be enabled}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfhMIhjiubah}(h]h ]h"]h$]h&]uh1jghjGubeh}(h]h ]h"]h$]h&]uh1jEhjfhMIhjBubah}(h]h ]h"]h$]h&]uh1j@hj"ubj)}(h**Description**h]j+)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMKhj"ubj)}(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.chMJhj"ubj)}(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.chMNhj"ubj)}(h **Return**h]j+)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubah}(h]h ]h"]h$]h&]uh1jhU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.chMQhj"ubj)}(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.chMRhj"ubeh}(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_gethNtauh1hhjhhhNhNubj)}(hhh](j)}(h3void * klp_shadow_get (void *obj, unsigned long id)h]j )}(h1void *klp_shadow_get(void *obj, unsigned long id)h](j)}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKMubj#)}(h h]h }(hj1hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjhhhj0hKMubj)}(hjh]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj0hKMubj4)}(hklp_shadow_geth]j:)}(hklp_shadow_geth]hklp_shadow_get}(hjPhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjLubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hjhhhj0hKMubjS)}(h(void *obj, unsigned long id)h](jY)}(h void *objh](j)}(hvoidh]hvoid}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj#)}(h h]h }(hjzhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjhubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj:)}(hobjh]hobj}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjhubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjdubjY)}(hunsigned long idh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj:)}(hidh]hid}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjdubeh}(h]h ]h"]h$]h&]hhuh1jRhjhhhj0hKMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhj0hKMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj0hKMhjhhubj)}(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.chKMhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj0hKMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj(jj(jjjuh1hhhhjhNhNubj!)}(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+)}(hj2h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hj0ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKQhj,ubjA)}(hhh](jF)}(h'``void *obj`` pointer to parent object h](jL)}(h ``void *obj``h]jR)}(hjQh]h void *obj}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjOubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKNhjKubjh)}(hhh]j)}(hpointer to parent objecth]hpointer to parent object}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfhKNhjgubah}(h]h ]h"]h$]h&]uh1jghjKubeh}(h]h ]h"]h$]h&]uh1jEhjfhKNhjHubjF)}(h%``unsigned long id`` data identifier h](jL)}(h``unsigned long id``h]jR)}(hjh]hunsigned long id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKOhjubjh)}(hhh]j)}(hdata identifierh]hdata identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKOhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKOhjHubeh}(h]h ]h"]h$]h&]uh1j@hj,ubj)}(h **Return**h]j+)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKQhj,ubj)}(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.chKQhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_shadow_alloc (C function)c.klp_shadow_allochNtauh1hhjhhhNhNubj)}(hhh](j)}(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]j )}(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](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjhhhjhKubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj4)}(hklp_shadow_alloch]j:)}(hklp_shadow_alloch]hklp_shadow_alloc}(hj8hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj4ubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hjhhhjhKubjS)}(hd(void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)h](jY)}(h void *objh](j)}(hvoidh]hvoid}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj#)}(h h]h }(hjbhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjPubj)}(hjh]h*}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj:)}(hobjh]hobj}(hj}hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjPubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjLubjY)}(hunsigned long idh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj:)}(hidh]hid}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjLubjY)}(h size_t sizeh](h)}(hhh]j:)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj:sbc.klp_shadow_allocasbuh1hhjubj#)}(h h]h }(hj hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj:)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjLubjY)}(hgfp_t gfp_flagsh](h)}(hhh]j:)}(hgfp_th]hgfp_t}(hj4hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj1ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj6modnameN classnameNjj)}j]jc.klp_shadow_allocasbuh1hhj-ubj#)}(h h]h }(hjRhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj-ubj:)}(h gfp_flagsh]h gfp_flags}(hj`hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj-ubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjLubjY)}(hklp_shadow_ctor_t ctorh](h)}(hhh]j:)}(hklp_shadow_ctor_th]hklp_shadow_ctor_t}(hj|hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjyubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj~modnameN classnameNjj)}j]jc.klp_shadow_allocasbuh1hhjuubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjuubj:)}(hctorh]hctor}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjuubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjLubjY)}(hvoid *ctor_datah](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj:)}(h ctor_datah]h ctor_data}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjLubeh}(h]h ]h"]h$]h&]hhuh1jRhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(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&]jjjj,jj,jjjuh1hhhhjhNhNubj!)}(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+)}(hj6h]h Parameters}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hj4ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj0ubjA)}(hhh](jF)}(h'``void *obj`` pointer to parent object h](jL)}(h ``void *obj``h]jR)}(hjUh]h void *obj}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjSubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjOubjh)}(hhh]j)}(hpointer to parent objecth]hpointer to parent object}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjhKhjkubah}(h]h ]h"]h$]h&]uh1jghjOubeh}(h]h ]h"]h$]h&]uh1jEhjjhKhjLubjF)}(h%``unsigned long id`` data identifier h](jL)}(h``unsigned long id``h]jR)}(hjh]hunsigned long id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjh)}(hhh]j)}(hdata identifierh]hdata identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKhjLubjF)}(h&``size_t size`` size of attached data h](jL)}(h``size_t size``h]jR)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjh)}(hhh]j)}(hsize of attached datah]hsize of attached data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKhjLubjF)}(h,``gfp_t gfp_flags`` GFP mask for allocation h](jL)}(h``gfp_t gfp_flags``h]jR)}(hjh]hgfp_t gfp_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjh)}(hhh]j)}(hGFP mask for allocationh]hGFP mask for allocation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKhjLubjF)}(hW``klp_shadow_ctor_t ctor`` custom constructor to initialize the shadow data (optional) h](jL)}(h``klp_shadow_ctor_t ctor``h]jR)}(hj9h]hklp_shadow_ctor_t ctor}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj7ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj3ubjh)}(hhh]j)}(h;custom constructor to initialize the shadow data (optional)h]h;custom constructor to initialize the shadow data (optional)}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNhKhjOubah}(h]h ]h"]h$]h&]uh1jghj3ubeh}(h]h ]h"]h$]h&]uh1jEhjNhKhjLubjF)}(hF``void *ctor_data`` pointer to any data needed by **ctor** (optional) h](jL)}(h``void *ctor_data``h]jR)}(hjrh]hvoid *ctor_data}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjpubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjlubjh)}(hhh]j)}(h1pointer to any data needed by **ctor** (optional)h](hpointer to any data needed by }(hjhhhNhNubj+)}(h**ctor**h]hctor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubh (optional)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jghjlubeh}(h]h ]h"]h$]h&]uh1jEhjhKhjLubeh}(h]h ]h"]h$]h&]uh1j@hj0ubj)}(h**Description**h]j+)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj0ubj)}(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&]uh1j*hjubh* bytes for new shadow variable data using }(hjhhhNhNubj+)}(h **gfp_flags**h]h gfp_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubhC. The data are zeroed by default. They are further initialized by }(hjhhhNhNubj+)}(h**ctor**h]hctor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubh\ 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.chKhj0ubj)}(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.chKhj0ubj)}(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}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hj) 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.chKhj0ubj)}(h **Return**h]j+)}(hjL h]hReturn}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjJ ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj0ubj)}(h?the shadow variable data element, NULL on duplicate or failure.h]h?the shadow variable data element, NULL on duplicate or failure.}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj0ubeh}(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_allochNtauh1hhjhhhNhNubj)}(hhh](j)}(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]j )}(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](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKubj#)}(h h]h }(hj hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj hhhj hKubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hKubj4)}(hklp_shadow_get_or_alloch]j:)}(hklp_shadow_get_or_alloch]hklp_shadow_get_or_alloc}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hj hhhj hKubjS)}(hd(void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)h](jY)}(h void *objh](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj#)}(h h]h }(hj hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj:)}(hobjh]hobj}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhj ubjY)}(hunsigned long idh](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj#)}(h h]h }(hj+ hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj ubj)}(hlongh]hlong}(hj9 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj#)}(h h]h }(hjG hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj ubj:)}(hidh]hid}(hjU hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhj ubjY)}(h size_t sizeh](h)}(hhh]j:)}(hsize_th]hsize_t}(hjq hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjn ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjs modnameN classnameNjj)}j]j)}jj sbc.klp_shadow_get_or_allocasbuh1hhjj ubj#)}(h h]h }(hj hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjj ubj:)}(hsizeh]hsize}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhj ubjY)}(hgfp_t gfp_flagsh](h)}(hhh]j:)}(hgfp_th]hgfp_t}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j c.klp_shadow_get_or_allocasbuh1hhj ubj#)}(h h]h }(hj hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj ubj:)}(h gfp_flagsh]h gfp_flags}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhj ubjY)}(hklp_shadow_ctor_t ctorh](h)}(hhh]j:)}(hklp_shadow_ctor_th]hklp_shadow_ctor_t}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j c.klp_shadow_get_or_allocasbuh1hhj ubj#)}(h h]h }(hj! hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj ubj:)}(hctorh]hctor}(hj/ hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhj ubjY)}(hvoid *ctor_datah](j)}(hvoidh]hvoid}(hjH hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD ubj#)}(h h]h }(hjV hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjD ubj)}(hjh]h*}(hjd hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD ubj:)}(h ctor_datah]h ctor_data}(hjq hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjD ubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhj ubeh}(h]h ]h"]h$]h&]hhuh1jRhj hhhj hKubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj hhhj hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hKhj 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&]uh1jhj hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1hhhhjhNhNubj!)}(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&]uh1j*hj ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjA)}(hhh](jF)}(h'``void *obj`` pointer to parent object h](jL)}(h ``void *obj``h]jR)}(hj h]h void *obj}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjh)}(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&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj hKhj ubjF)}(h%``unsigned long id`` data identifier h](jL)}(h``unsigned long id``h]jR)}(hj h]hunsigned long id}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjh)}(hhh]j)}(hdata identifierh]hdata identifier}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj* hKhj+ ubah}(h]h ]h"]h$]h&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj* hKhj ubjF)}(h&``size_t size`` size of attached data h](jL)}(h``size_t size``h]jR)}(hjN h]h size_t size}(hjP hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjL ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjH ubjh)}(hhh]j)}(hsize of attached datah]hsize of attached data}(hjg hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc hKhjd ubah}(h]h ]h"]h$]h&]uh1jghjH ubeh}(h]h ]h"]h$]h&]uh1jEhjc hKhj ubjF)}(h,``gfp_t gfp_flags`` GFP mask for allocation h](jL)}(h``gfp_t gfp_flags``h]jR)}(hj h]hgfp_t gfp_flags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjh)}(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&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj hKhj ubjF)}(hW``klp_shadow_ctor_t ctor`` custom constructor to initialize the shadow data (optional) h](jL)}(h``klp_shadow_ctor_t ctor``h]jR)}(hj h]hklp_shadow_ctor_t ctor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjh)}(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&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj hKhj ubjF)}(hF``void *ctor_data`` pointer to any data needed by **ctor** (optional) h](jL)}(h``void *ctor_data``h]jR)}(hj h]hvoid *ctor_data}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj ubjh)}(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&]uh1j*hj ubh (optional)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj hKhj ubeh}(h]h ]h"]h$]h&]uh1j@hj ubj)}(h**Description**h]j+)}(hjF h]h Description}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjD 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().}(hj\ 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 }(hjk hhhNhNubj+)}(h**id**h]hid}(hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjk ubh for the given }(hjk hhhNhNubj+)}(h**obj**h]hobj}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjk ubh. It also guarantees that the constructor function will be called only when the variable did not exist before. The cost is that }(hjk hhhNhNubj+)}(h**ctor**h]hctor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjk ubh/ is called in atomic context under a spin lock.}(hjk 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&]uh1j*hj 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_freehNtauh1hhjhhhNhNubj)}(hhh](j)}(hJvoid klp_shadow_free (void *obj, unsigned long id, klp_shadow_dtor_t dtor)h]j )}(hIvoid klp_shadow_free(void *obj, unsigned long id, klp_shadow_dtor_t dtor)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj hhhjhKubj4)}(hklp_shadow_freeh]j:)}(hklp_shadow_freeh]hklp_shadow_free}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hj hhhjhKubjS)}(h5(void *obj, unsigned long id, klp_shadow_dtor_t dtor)h](jY)}(h void *objh](j)}(hvoidh]hvoid}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj#)}(h h]h }(hjBhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj0ubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj:)}(hobjh]hobj}(hj]hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj0ubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhj,ubjY)}(hunsigned long idh](j)}(hunsignedh]hunsigned}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjrubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjrubj:)}(hidh]hid}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjrubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhj,ubjY)}(hklp_shadow_dtor_t dtorh](h)}(hhh]j:)}(hklp_shadow_dtor_th]hklp_shadow_dtor_t}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.klp_shadow_freeasbuh1hhjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj:)}(hdtorh]hdtor}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhj,ubeh}(h]h ]h"]h$]h&]hhuh1jRhj hhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj hhhjhKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhjhKhj hhubj)}(hhh]j)}(h+detach and free a shadow variableh]h+detach and free a shadow variable}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj:jj:jjjuh1hhhhjhNhNubj!)}(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+)}(hjDh]h Parameters}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjBubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj>ubjA)}(hhh](jF)}(h'``void *obj`` pointer to parent object h](jL)}(h ``void *obj``h]jR)}(hjch]h void *obj}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjaubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhj]ubjh)}(hhh]j)}(hpointer to parent objecth]hpointer to parent object}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxhKhjyubah}(h]h ]h"]h$]h&]uh1jghj]ubeh}(h]h ]h"]h$]h&]uh1jEhjxhKhjZubjF)}(h%``unsigned long id`` data identifier h](jL)}(h``unsigned long id``h]jR)}(hjh]hunsigned long id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjh)}(hhh]j)}(hdata identifierh]hdata identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKhjZubjF)}(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](jL)}(h``klp_shadow_dtor_t dtor``h]jR)}(hjh]hklp_shadow_dtor_t dtor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chKhjubjh)}(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&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKhjZubeh}(h]h ]h"]h$]h&]uh1j@hj>ubj)}(h**Description**h]j+)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubah}(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.}(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](h klp_shadow_free_all (C function)c.klp_shadow_free_allhNtauh1hhjhhhNhNubj)}(hhh](j)}(hCvoid klp_shadow_free_all (unsigned long id, klp_shadow_dtor_t dtor)h]j )}(hBvoid klp_shadow_free_all(unsigned long id, klp_shadow_dtor_t dtor)h](j)}(hvoidh]hvoid}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMubj#)}(h h]h }(hjehhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjRhhhjdhMubj4)}(hklp_shadow_free_allh]j:)}(hklp_shadow_free_allh]hklp_shadow_free_all}(hjwhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjsubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hjRhhhjdhMubjS)}(h*(unsigned long id, klp_shadow_dtor_t dtor)h](jY)}(hunsigned long idh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj:)}(hidh]hid}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjubjY)}(hklp_shadow_dtor_t dtorh](h)}(hhh]j:)}(hklp_shadow_dtor_th]hklp_shadow_dtor_t}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjysbc.klp_shadow_free_allasbuh1hhjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj:)}(hdtorh]hdtor}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjubeh}(h]h ]h"]h$]h&]hhuh1jRhjRhhhjdhMubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjNhhhjdhMubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1jhjdhMhjKhhubj)}(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&]uh1jhjKhhhjdhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjWjjWjjjuh1hhhhjhNhNubj!)}(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+)}(hjah]h Parameters}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1j*hj_ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhj[ubjA)}(hhh](jF)}(h%``unsigned long id`` data identifier h](jL)}(h``unsigned long id``h]jR)}(hjh]hunsigned long id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj~ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhjzubjh)}(hhh]j)}(hdata identifierh]hdata identifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jghjzubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjwubjF)}(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](jL)}(h``klp_shadow_dtor_t dtor``h]jR)}(hjh]hklp_shadow_dtor_t dtor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhjubjh)}(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&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjwubeh}(h]h ]h"]h$]h&]uh1j@hj[ubj)}(h**Description**h]j+)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhj[ubj)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.chMhj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubeh}(h]shadow-variablesah ]h"]shadow variablesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hSystem State Changesh]hSystem State Changes}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_get_state (C function)c.klp_get_statehNtauh1hhj)hhhNhNubj)}(hhh](j)}(hLstruct klp_state * klp_get_state (struct klp_patch *patch, unsigned long id)h]j )}(hJstruct klp_state *klp_get_state(struct klp_patch *patch, unsigned long id)h](j_)}(hjbh]hstruct}(hjShhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjOhhhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKubj#)}(h h]h }(hjahhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjOhhhj`hKubh)}(hhh]j:)}(h klp_stateh]h klp_state}(hjrhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjoubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjtmodnameN classnameNjj)}j]j)}j klp_get_statesbc.klp_get_stateasbuh1hhjOhhhj`hKubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjOhhhj`hKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhj`hKubj4)}(h klp_get_stateh]j:)}(hjh]h klp_get_state}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hjOhhhj`hKubjS)}(h+(struct klp_patch *patch, unsigned long id)h](jY)}(hstruct klp_patch *patchh](j_)}(hjbh]hstruct}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubh)}(hhh]j:)}(h klp_patchh]h klp_patch}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.klp_get_stateasbuh1hhjubj#)}(h h]h }(hj hhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj:)}(hpatchh]hpatch}(hj$hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjubjY)}(hunsigned long idh](j)}(hunsignedh]hunsigned}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj#)}(h h]h }(hjKhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj9ubj)}(hlongh]hlong}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj#)}(h h]h }(hjghhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hj9ubj:)}(hidh]hid}(hjuhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj9ubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjubeh}(h]h ]h"]h$]h&]hhuh1jRhjOhhhj`hKubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjKhhhj`hKubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1jhj`hKhjHhhubj)}(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&]uh1jhjHhhhj`hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1hhhhj)hNhNubj!)}(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&]uh1j*hjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubjA)}(hhh](jF)}(hK``struct klp_patch *patch`` livepatch that modifies the given system state h](jL)}(h``struct klp_patch *patch``h]jR)}(hjh]hstruct klp_patch *patch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubjh)}(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&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKhjubjF)}(hD``unsigned long id`` custom identifier of the modified system state h](jL)}(h``unsigned long id``h]jR)}(hjh]hunsigned long id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubjh)}(hhh]j)}(h.custom identifier of the modified system stateh]h.custom identifier of the modified system state}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.hKhj/ubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhj.hKhjubeh}(h]h ]h"]h$]h&]uh1j@hjubj)}(h**Description**h]j+)}(hjTh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjRubah}(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.}(hjjhhhNhNubah}(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.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKhjubj)}(h **Return**h]j+)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubah}(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 hj)hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_get_prev_state (C function)c.klp_get_prev_statehNtauh1hhj)hhhNhNubj)}(hhh](j)}(h8struct klp_state * klp_get_prev_state (unsigned long id)h]j )}(h6struct klp_state *klp_get_prev_state(unsigned long id)h](j_)}(hjbh]hstruct}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhhhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK-ubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjhhhjhK-ubh)}(hhh]j:)}(h klp_stateh]h klp_state}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(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 ]j/ah"]h$]h&]uh1j"hjhhhjhK-ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK-ubj4)}(hklp_get_prev_stateh]j:)}(hj h]hklp_get_prev_state}(hj.hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj*ubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hjhhhjhK-ubjS)}(h(unsigned long id)h]jY)}(hunsigned long idh](j)}(hunsignedh]hunsigned}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj#)}(h h]h }(hjWhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjEubj)}(hlongh]hlong}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj#)}(h h]h }(hjshhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjEubj:)}(hidh]hid}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjEubeh}(h]h ]h"]h$]h&]noemphhhuh1jXhjAubah}(h]h ]h"]h$]h&]hhuh1jRhjhhhjhK-ubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhK-ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK-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&]jjjjjjjjjuh1hhhhj)hNhNubj!)}(hXx**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&]uh1j*hjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK1hjubjA)}(hhh]jF)}(hD``unsigned long id`` custom identifier of the modified system state h](jL)}(h``unsigned long id``h]jR)}(hjh]hunsigned long id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK/hjubjh)}(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&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhK/hjubah}(h]h ]h"]h$]h&]uh1j@hjubj)}(h**Description**h]j+)}(hj'h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hj%ubah}(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.chK0hjubj)}(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.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK3hjubj)}(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.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chK7hjubj)}(h **Return**h]j+)}(hjlh]hReturn}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjjubah}(h]h ]h"]h$]h&]uh1jhV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.chKubjh)}(hhh]j)}(hsize of the new functionh]hsize of the new function}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYhK&hjZubah}(h]h ]h"]h$]h&]uh1jghj>ubeh}(h]h ]h"]h$]h&]uh1jEhjYhK&hjrubjF)}(hG``nop`` temporary patch to use the original code again; dyn. allocated h](jL)}(h``nop``h]jR)}(hj}h]hnop}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj{ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK'hjwubjh)}(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&]uh1jghjwubeh}(h]h ]h"]h$]h&]uh1jEhjhK'hjrubjF)}(h8``patched`` the func has been added to the klp_ops list h](jL)}(h ``patched``h]jR)}(hjh]hpatched}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK(hjubjh)}(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&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhK(hjrubjF)}(h>``transition`` the func is currently being applied or revertedh](jL)}(h``transition``h]jR)}(hjh]h transition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK(hjubjh)}(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&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhK(hjrubeh}(h]h ]h"]h$]h&]uh1j@hj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj)}(h**Description**h]j+)}(hj2h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j*hj0ubah}(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:}(hjHhhhNhNubah}(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}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK,hjYubah}(h]h ]h"]h$]h&]uh1jWhjkhK,hjhhubj)}(h2And when unpatching, it goes in the reverse order:h]h2And when unpatching, it goes in the reverse order:}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK1hjhhubjX)}(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&]uh1jWhjhK3hjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_object (C struct) c.klp_objecthNtauh1hhjhhhNhNubj)}(hhh](j)}(h klp_objecth]j )}(hstruct klp_objecth](j_)}(hjbh]hstruct}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK;ubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjhhhjhK;ubj4)}(h klp_objecth]j:)}(hjh]h klp_object}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hjhhhjhK;ubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhjhK;ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK;hjhhubj)}(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.hhKRhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK;ubeh}(h]h ](jstructeh"]h$]h&]jjjj jj jjjuh1hhhhjhNhNubj!)}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKVhjubjJ)}(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; };}hj2sbah}(h]h ]h"]h$]h&]hhuh1jIhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKXhjubj)}(h **Members**h]j+)}(hjCh]hMembers}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjAubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKdhjubjA)}(hhh](jF)}(h+``name`` module name (or NULL for vmlinux) h](jL)}(h``name``h]jR)}(hjbh]hname}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj`ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKThj\ubjh)}(hhh]j)}(h!module name (or NULL for vmlinux)h]h!module name (or NULL for vmlinux)}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwhKThjxubah}(h]h ]h"]h$]h&]uh1jghj\ubeh}(h]h ]h"]h$]h&]uh1jEhjwhKThjYubjF)}(hE``funcs`` function entries for functions to be patched in the object h](jL)}(h ``funcs``h]jR)}(hjh]hfuncs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKUhjubjh)}(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&]uh1jhjhKUhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKUhjYubjF)}(h=``callbacks`` functions to be executed pre/post (un)patching h](jL)}(h ``callbacks``h]jR)}(hjh]h callbacks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKVhjubjh)}(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&]uh1jhjhKVhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKVhjYubjF)}(h%``kobj`` kobject for sysfs resources h](jL)}(h``kobj``h]jR)}(hj h]hkobj}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKWhjubjh)}(hhh]j)}(hkobject for sysfs resourcesh]hkobject for sysfs resources}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"hKWhj#ubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhj"hKWhjYubjF)}(h3``func_list`` dynamic list of the function entries h](jL)}(h ``func_list``h]jR)}(hjFh]h func_list}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjDubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKXhj@ubjh)}(hhh]j)}(h$dynamic list of the function entriesh]h$dynamic list of the function entries}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[hKXhj\ubah}(h]h ]h"]h$]h&]uh1jghj@ubeh}(h]h ]h"]h$]h&]uh1jEhj[hKXhjYubjF)}(h*``node`` list node for klp_patch obj_list h](jL)}(h``node``h]jR)}(hjh]hnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj}ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKYhjyubjh)}(hhh]j)}(h list node for klp_patch obj_listh]h list node for klp_patch obj_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKYhjubah}(h]h ]h"]h$]h&]uh1jghjyubeh}(h]h ]h"]h$]h&]uh1jEhjhKYhjYubjF)}(hL``mod`` kernel module associated with the patched object (NULL for vmlinux) h](jL)}(h``mod``h]jR)}(hjh]hmod}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK[hjubjh)}(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.hhKZhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhK[hjYubjF)}(hF``dynamic`` temporary object for nop functions; dynamically allocated h](jL)}(h ``dynamic``h]jR)}(hjh]hdynamic}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK\hjubjh)}(hhh]j)}(h9temporary object for nop functions; dynamically allocatedh]h9temporary object for nop functions; dynamically allocated}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK\hjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhK\hjYubjF)}(hB``patched`` the object's funcs have been added to the klp_ops listh](jL)}(h ``patched``h]jR)}(hj+h]hpatched}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj)ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK\hj%ubjh)}(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}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK]hjAubah}(h]h ]h"]h$]h&]uh1jghj%ubeh}(h]h ]h"]h$]h&]uh1jEhj@hK\hjYubeh}(h]h ]h"]h$]h&]uh1j@hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_state (C struct) c.klp_statehNtauh1hhjhhhNhNubj)}(hhh](j)}(h klp_stateh]j )}(hstruct klp_stateh](j_)}(hjbh]hstruct}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKcubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjhhhjhKcubj4)}(h klp_stateh]j:)}(hjh]h klp_state}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hjhhhjhKcubeh}(h]h ]h"]h$]h&]hhjuh1j jjhj}hhhjhKcubah}(h]jxah ](jjeh"]h$]h&]jj)jhuh1jhjhKchjzhhubj)}(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.hhKnhjhhubah}(h]h ]h"]h$]h&]uh1jhjzhhhjhKcubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1hhhhjhNhNubj!)}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKrhjubjJ)}(hUstruct klp_state { unsigned long id; unsigned int version; void *data; };h]hUstruct klp_state { unsigned long id; unsigned int version; void *data; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jIhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKthjubj)}(h **Members**h]j+)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKzhjubjA)}(hhh](jF)}(h*``id`` system state identifier (non-zero) h](jL)}(h``id``h]jR)}(hj4h]hid}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj2ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKphj.ubjh)}(hhh]j)}(h"system state identifier (non-zero)h]h"system state identifier (non-zero)}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIhKphjJubah}(h]h ]h"]h$]h&]uh1jghj.ubeh}(h]h ]h"]h$]h&]uh1jEhjIhKphj+ubjF)}(h"``version`` version of the change h](jL)}(h ``version``h]jR)}(hjmh]hversion}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjkubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKqhjgubjh)}(hhh]j)}(hversion of the changeh]hversion of the change}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKqhjubah}(h]h ]h"]h$]h&]uh1jghjgubeh}(h]h ]h"]h$]h&]uh1jEhjhKqhj+ubjF)}(h``data`` custom datah](jL)}(h``data``h]jR)}(hjh]hdata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKqhjubjh)}(hhh]j)}(h custom datah]h custom data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKrhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKqhj+ubeh}(h]h ]h"]h$]h&]uh1j@hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hklp_patch (C struct) c.klp_patchhNtauh1hhjhhhNhNubj)}(hhh](j)}(h klp_patchh]j )}(hstruct klp_patchh](j_)}(hjbh]hstruct}(hjhhhNhNubah}(h]h ]jkah"]h$]h&]uh1j^hjhhhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKxubj#)}(h h]h }(hjhhhNhNubah}(h]h ]j/ah"]h$]h&]uh1j"hjhhhj hKxubj4)}(h klp_patchh]j:)}(hjh]h klp_patch}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubah}(h]h ](jMjNeh"]h$]h&]hhuh1j3hjhhhj hKxubeh}(h]h ]h"]h$]h&]hhjuh1j jjhjhhhj hKxubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hKxhjhhubj)}(hhh]j)}(h!patch structure for live patchingh]h!patch structure for live patching}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKzhj?hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hKxubeh}(h]h ](jstructeh"]h$]h&]jjjjZjjZjjjuh1hhhhjhNhNubj!)}(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}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjbubh:}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK~hj^ubjJ)}(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; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jIhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj^ubj)}(h **Members**h]j+)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j*hjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj^ubjA)}(hhh](jF)}(h+``mod`` reference to the live patch module h](jL)}(h``mod``h]jR)}(hjh]hmod}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK|hjubjh)}(hhh]j)}(h"reference to the live patch moduleh]h"reference to the live patch module}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK|hjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhK|hjubjF)}(h9``objs`` object entries for kernel objects to be patched h](jL)}(h``objs``h]jR)}(hjh]hobjs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK}hjubjh)}(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&]uh1jhjhK}hjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhK}hjubjF)}(h/``states`` system states that can get modified h](jL)}(h ``states``h]jR)}(hj! h]hstates}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhK~hj ubjh)}(hhh]j)}(h#system states that can get modifiedh]h#system states that can get modified}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6 hK~hj7 ubah}(h]h ]h"]h$]h&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj6 hK~hjubjF)}(h.``replace`` replace all actively used patches h](jL)}(h ``replace``h]jR)}(hjZ h]hreplace}(hj\ hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjX ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhjT ubjh)}(hhh]j)}(h!replace all actively used patchesh]h!replace all actively used patches}(hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo hKhjp ubah}(h]h ]h"]h$]h&]uh1jghjT ubeh}(h]h ]h"]h$]h&]uh1jEhjo hKhjubjF)}(h<``list`` list node for global list of actively used patches h](jL)}(h``list``h]jR)}(hj h]hlist}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj ubjh)}(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&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj hKhjubjF)}(h%``kobj`` kobject for sysfs resources h](jL)}(h``kobj``h]jR)}(hj h]hkobj}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj ubjh)}(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&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj hKhjubjF)}(h0``obj_list`` dynamic list of the object entries h](jL)}(h ``obj_list``h]jR)}(hj!h]hobj_list}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj!ubah}(h]h ]h"]h$]h&]uh1jKhW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.hhKhj ubjh)}(hhh]j)}(h"dynamic list of the object entriesh]h"dynamic list of the object entries}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!hKhj!ubah}(h]h ]h"]h$]h&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj!hKhjubjF)}(hC``enabled`` the patch is enabled (but operation may be incomplete) h](jL)}(h ``enabled``h]jR)}(hj>!h]henabled}(hj@!hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj