€•ÝŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ!/translations/zh_CN/livepatch/api”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/zh_TW/livepatch/api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/it_IT/livepatch/api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/ja_JP/livepatch/api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/ko_KR/livepatch/api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/pt_BR/livepatch/api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/sp_SP/livepatch/api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ;/var/lib/git/docbuild/linux/Documentation/livepatch/api.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒLivepatching APIs”h]”hŒLivepatching APIs”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒLivepatch Enablement”h]”hŒLivepatch Enablement”…”�”}”(hhàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÝh²hh³hÇh´KubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œklp_enable_patch (C function)”Œc.klp_enable_patch”hNt”auh1hîhhÝh²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒ.int klp_enable_patch (struct klp_patch *patch)”h]”hŒdesc_signature_line”“”)�”}”(hŒ-int klp_enable_patch(struct klp_patch *patch)”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒint”h]”hŒint”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1jhj h²hh³ŒU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.c”h´MXubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1j"hj h²hh³j!h´MXubhŒ desc_name”“”)�”}”(hŒklp_enable_patch”h]”hŒ desc_sig_name”“”)�”}”(hŒklp_enable_patch”h]”hŒklp_enable_patch”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1j9hj5ubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1j3hj h²hh³j!h´MXubhŒdesc_parameterlist”“”)�”}”(hŒ(struct klp_patch *patch)”h]”hŒdesc_parameter”“”)�”}”(hŒstruct klp_patch *patch”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1j^hjZubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjZubh)�”}”(hhh]”j:)�”}”(hŒ klp_patch”h]”hŒ klp_patch”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj}ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”Œc”Œreftype”Œ identifier”Œ reftarget”j‚Œmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”jœŒ ASTIdentifier”“”)�”}”j—j=sbŒc.klp_enable_patch”†”asbuh1hhjZubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjZubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1j·hjZubj:)�”}”(hŒpatch”h]”hŒpatch”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjZubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjTubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jRhj h²hh³j!h´MXubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1j Œsphinx_line_type”Œ declarator”hjh²hh³j!h´MXubah}”(h]”hýah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1jh³j!h´MXhjh²hubhŒ desc_content”“”)�”}”(hhh]”hŒ paragraph”“”)�”}”(hŒenable the livepatch”h]”hŒenable the livepatch”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.c”h´MXhjùh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjh²hh³j!h´MXubeh}”(h]”h ]”(j•Œfunction”eh"]”h$]”h&]”Œdomain”j•Œobjtype”jŒdesctype”jŒnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1hÿh²hhhÝh³Nh´NubhŒ 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 error”h]”(jý)�”}”(hŒ**Parameters**”h]”hŒstrong”“”)�”}”(hj(h]”hŒ Parameters”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.c”h´M\hj"ubhŒdefinition_list”“”)�”}”(hhh]”hŒdefinition_list_item”“”)�”}”(hŒ0``struct klp_patch *patch`` patch to be enabled ”h]”(hŒterm”“”)�”}”(hŒ``struct klp_patch *patch``”h]”hŒliteral”“”)�”}”(hjOh]”hŒstruct klp_patch *patch”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.c”h´MYhjGubhŒ definition”“”)�”}”(hhh]”jý)�”}”(hŒpatch to be enabled”h]”hŒpatch to be enabled”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jfh´MYhjiubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjGubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jfh´MYhjBubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj"ubjý)�”}”(hŒ**Description**”h]”j+)�”}”(hjŽh]”hŒ Description”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.c”h´M[hj"ubjý)�”}”(hŒ¼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.”h]”hŒ¼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.”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.c”h´MZhj"ubjý)�”}”(hŒQThis function is supposed to be called from the livepatch module_init() callback.”h]”hŒQThis function is supposed to be called from the livepatch module_init() callback.”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.c”h´M^hj"ubjý)�”}”(hŒ **Return**”h]”j+)�”}”(hjÄh]”hŒReturn”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.c”h´Mahj"ubjý)�”}”(hŒ0 on success, otherwise error”h]”hŒ0 on success, otherwise error”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒU/var/lib/git/docbuild/linux/Documentation/livepatch/api:10: ./kernel/livepatch/core.c”h´Mbhj"ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hhÝh²hh³Nh´Nubeh}”(h]”Œlivepatch-enablement”ah ]”h"]”Œlivepatch enablement”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒShadow Variables”h]”hŒShadow Variables”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjøh²hh³hÇh´Kubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒklp_shadow_get (C function)”Œc.klp_shadow_get”hNt”auh1hîhjøh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒ3void * klp_shadow_get (void *obj, unsigned long id)”h]”j )�”}”(hŒ1void *klp_shadow_get(void *obj, unsigned long id)”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjh²hh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KMubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjh²hh³j0h´KMubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hjh²hh³j0h´KMubj4)�”}”(hŒklp_shadow_get”h]”j:)�”}”(hŒklp_shadow_get”h]”hŒklp_shadow_get”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjLubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hjh²hh³j0h´KMubjS)�”}”(hŒ(void *obj, unsigned long id)”h]”(jY)�”}”(hŒ void *obj”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjhubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjhubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hjhubj:)�”}”(hŒobj”h]”hŒobj”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjhubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjdubjY)�”}”(hŒunsigned long id”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjªubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjªubj)�”}”(hŒlong”h]”hŒlong”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjªubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjªubj:)�”}”(hŒid”h]”hŒid”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjªubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjdubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jRhjh²hh³j0h´KMubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhjh²hh³j0h´KMubah}”(h]”jah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³j0h´KMhjh²hubjø)�”}”(hhh]”jý)�”}”(hŒ'retrieve a shadow variable data pointer”h]”hŒ'retrieve a shadow variable data pointer”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KMhj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjh²hh³j0h´KMubeh}”(h]”h ]”(j•Œfunction”eh"]”h$]”h&]”jj•jj(jj(j‰j‰j‰uh1hÿh²hhjøh³Nh´Nubj!)�”}”(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”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KQhj,ubjA)�”}”(hhh]”(jF)�”}”(hŒ'``void *obj`` pointer to parent object ”h]”(jL)�”}”(hŒ ``void *obj``”h]”jR)�”}”(hjQh]”hŒ void *obj”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KNhjKubjh)�”}”(hhh]”jý)�”}”(hŒpointer to parent object”h]”hŒpointer to parent object”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jfh´KNhjgubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjKubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jfh´KNhjHubjF)�”}”(hŒ%``unsigned long id`` data identifier ”h]”(jL)�”}”(hŒ``unsigned long id``”h]”jR)�”}”(hjŠh]”hŒunsigned long id”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KOhj„ubjh)�”}”(hhh]”jý)�”}”(hŒdata identifier”h]”hŒdata identifier”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jŸh´KOhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj„ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jŸh´KOhjHubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hj,ubjý)�”}”(hŒ **Return**”h]”j+)�”}”(hjÅh]”hŒReturn”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KQhj,ubjý)�”}”(hŒ2the shadow variable data element, NULL on failure.”h]”hŒ2the shadow variable data element, NULL on failure.”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KQhj,ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hjøh²hh³Nh´Nubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒklp_shadow_alloc (C function)”Œc.klp_shadow_alloc”hNt”auh1hîhjøh²hh³Nh´Nubj)�”}”(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 )�”}”(hŒzvoid *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)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjh²hh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K­ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjh²hh³jh´K­ubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hjh²hh³jh´K­ubj4)�”}”(hŒklp_shadow_alloc”h]”j:)�”}”(hŒklp_shadow_alloc”h]”hŒklp_shadow_alloc”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj4ubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hjh²hh³jh´K­ubjS)�”}”(hŒd(void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)”h]”(jY)�”}”(hŒ void *obj”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjPubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjPubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hjPubj:)�”}”(hŒobj”h]”hŒobj”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjPubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjLubjY)�”}”(hŒunsigned long id”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj’ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj’ubj)�”}”(hŒlong”h]”hŒlong”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj’ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj’ubj:)�”}”(hŒid”h]”hŒid”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj’ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjLubjY)�”}”(hŒ size_t size”h]”(h)�”}”(hhh]”j:)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjçubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”jìŒmodname”NŒ classname”Nj›jž)�”}”j¡]”j¤)�”}”j—j:sbŒc.klp_shadow_alloc”†”asbuh1hhjãubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjãubj:)�”}”(hŒsize”h]”hŒsize”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjãubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjLubjY)�”}”(hŒgfp_t gfp_flags”h]”(h)�”}”(hhh]”j:)�”}”(hŒgfp_t”h]”hŒgfp_t”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj1ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”j6Œmodname”NŒ classname”Nj›jž)�”}”j¡]”jŒc.klp_shadow_alloc”†”asbuh1hhj-ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj-ubj:)�”}”(hŒ gfp_flags”h]”hŒ gfp_flags”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj-ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjLubjY)�”}”(hŒklp_shadow_ctor_t ctor”h]”(h)�”}”(hhh]”j:)�”}”(hŒklp_shadow_ctor_t”h]”hŒklp_shadow_ctor_t”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjyubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”j~Œmodname”NŒ classname”Nj›jž)�”}”j¡]”jŒc.klp_shadow_alloc”†”asbuh1hhjuubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjuubj:)�”}”(hŒctor”h]”hŒctor”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjuubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjLubjY)�”}”(hŒvoid *ctor_data”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj½ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj½ubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hj½ubj:)�”}”(hŒ ctor_data”h]”hŒ ctor_data”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj½ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjLubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jRhjh²hh³jh´K­ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhjh²hh³jh´K­ubah}”(h]”jýah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³jh´K­hjÿh²hubjø)�”}”(hhh]”jý)�”}”(hŒ&allocate and add a new shadow variable”h]”hŒ&allocate and add a new shadow variable”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K­hjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjÿh²hh³jh´K­ubeh}”(h]”h ]”(j•Œfunction”eh"]”h$]”h&]”jj•jj,jj,j‰j‰j‰uh1hÿh²hhjøh³Nh´Nubj!)�”}”(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”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K±hj0ubjA)�”}”(hhh]”(jF)�”}”(hŒ'``void *obj`` pointer to parent object ”h]”(jL)�”}”(hŒ ``void *obj``”h]”jR)�”}”(hjUh]”hŒ void *obj”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K®hjOubjh)�”}”(hhh]”jý)�”}”(hŒpointer to parent object”h]”hŒpointer to parent object”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jjh´K®hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjOubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jjh´K®hjLubjF)�”}”(hŒ%``unsigned long id`` data identifier ”h]”(jL)�”}”(hŒ``unsigned long id``”h]”jR)�”}”(hjŽh]”hŒunsigned long id”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K¯hjˆubjh)�”}”(hhh]”jý)�”}”(hŒdata identifier”h]”hŒdata identifier”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j£h´K¯hj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j£h´K¯hjLubjF)�”}”(hŒ&``size_t size`` size of attached data ”h]”(jL)�”}”(hŒ``size_t size``”h]”jR)�”}”(hjÇh]”hŒ size_t size”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÅubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K°hjÁubjh)�”}”(hhh]”jý)�”}”(hŒsize of attached data”h]”hŒsize of attached data”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jÜh´K°hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÁubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jÜh´K°hjLubjF)�”}”(hŒ,``gfp_t gfp_flags`` GFP mask for allocation ”h]”(jL)�”}”(hŒ``gfp_t gfp_flags``”h]”jR)�”}”(hjh]”hŒgfp_t gfp_flags”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K±hjúubjh)�”}”(hhh]”jý)�”}”(hŒGFP mask for allocation”h]”hŒGFP mask for allocation”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jh´K±hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjúubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jh´K±hjLubjF)�”}”(hŒW``klp_shadow_ctor_t ctor`` custom constructor to initialize the shadow data (optional) ”h]”(jL)�”}”(hŒ``klp_shadow_ctor_t ctor``”h]”jR)�”}”(hj9h]”hŒklp_shadow_ctor_t ctor”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K²hj3ubjh)�”}”(hhh]”jý)�”}”(hŒ;custom constructor to initialize the shadow data (optional)”h]”hŒ;custom constructor to initialize the shadow data (optional)”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jNh´K²hjOubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jNh´K²hjLubjF)�”}”(hŒF``void *ctor_data`` pointer to any data needed by **ctor** (optional) ”h]”(jL)�”}”(hŒ``void *ctor_data``”h]”jR)�”}”(hjrh]”hŒvoid *ctor_data”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjpubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K³hjlubjh)�”}”(hhh]”jý)�”}”(hŒ1pointer to any data needed by **ctor** (optional)”h]”(hŒpointer to any data needed by ”…”�”}”(hj‹h²hh³Nh´Nubj+)�”}”(hŒ**ctor**”h]”hŒctor”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj‹ubhŒ (optional)”…”�”}”(hj‹h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j‡h´K³hjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjlubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j‡h´K³hjLubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hj0ubjý)�”}”(hŒ**Description**”h]”j+)�”}”(hj¿h]”hŒ Description”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Kµhj0ubjý)�”}”(hŒð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.”h]”(hŒ Allocates ”…”�”}”(hjÕh²hh³Nh´Nubj+)�”}”(hŒ**size**”h]”hŒsize”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjÕubhŒ* bytes for new shadow variable data using ”…”�”}”(hjÕh²hh³Nh´Nubj+)�”}”(hŒ **gfp_flags**”h]”hŒ gfp_flags”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjÕubhŒC. The data are zeroed by default. They are further initialized by ”…”�”}”(hjÕh²hh³Nh´Nubj+)�”}”(hŒ**ctor**”h]”hŒctor”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjÕubhŒ\ function if it is not NULL. The new shadow variable is then added to the global hashtable.”…”�”}”(hjÕh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K´hj0ubjý)�”}”(hŒrIf an existing shadow variable can be found, this routine will issue a WARN, exit early and return NULL.”h]”hŒrIf an existing shadow variable can be found, this routine will issue a WARN, exit early and return NULL.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K¹hj0ubjý)�”}”(hŒ·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.”h]”(hŒ€This function guarantees that the constructor function is called only when the variable did not exist before. The cost is that ”…”�”}”(hj) h²hh³Nh´Nubj+)�”}”(hŒ**ctor**”h]”hŒctor”…”�”}”(hj1 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj) ubhŒ/ is called in atomic context under a spin lock.”…”�”}”(hj) h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K¼hj0ubjý)�”}”(hŒ **Return**”h]”j+)�”}”(hjL h]”hŒReturn”…”�”}”(hjN h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjJ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÀhj0ubjý)�”}”(hŒ?the shadow variable data element, NULL on duplicate or failure.”h]”hŒ?the shadow variable data element, NULL on duplicate or failure.”…”�”}”(hjb h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÁhj0ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hjøh²hh³Nh´Nubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒ$klp_shadow_get_or_alloc (C function)”Œc.klp_shadow_get_or_alloc”hNt”auh1hîhjøh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒƒvoid * 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 )�”}”(hŒ�void *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)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj‘ h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj� h²hh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÎubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj  h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj� h²hh³jŸ h´KÎubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hj® h²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hj� h²hh³jŸ h´KÎubj4)�”}”(hŒklp_shadow_get_or_alloc”h]”j:)�”}”(hŒklp_shadow_get_or_alloc”h]”hŒklp_shadow_get_or_alloc”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj» ubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hj� h²hh³jŸ h´KÎubjS)�”}”(hŒd(void *obj, unsigned long id, size_t size, gfp_t gfp_flags, klp_shadow_ctor_t ctor, void *ctor_data)”h]”(jY)�”}”(hŒ void *obj”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÛ h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj× ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjé h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj× ubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hj× ubj:)�”}”(hŒobj”h]”hŒobj”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj× ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjÓ ubjY)�”}”(hŒunsigned long id”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj+ h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj ubj)�”}”(hŒlong”h]”hŒlong”…”�”}”(hj9 h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj ubj:)�”}”(hŒid”h]”hŒid”…”�”}”(hjU h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjÓ ubjY)�”}”(hŒ size_t size”h]”(h)�”}”(hhh]”j:)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjn ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”js Œmodname”NŒ classname”Nj›jž)�”}”j¡]”j¤)�”}”j—jÁ sbŒc.klp_shadow_get_or_alloc”†”asbuh1hhjj ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‘ h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjj ubj:)�”}”(hŒsize”h]”hŒsize”…”�”}”(hjŸ h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjj ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjÓ ubjY)�”}”(hŒgfp_t gfp_flags”h]”(h)�”}”(hhh]”j:)�”}”(hŒgfp_t”h]”hŒgfp_t”…”�”}”(hj» h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj¸ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”j½ Œmodname”NŒ classname”Nj›jž)�”}”j¡]”j� Œc.klp_shadow_get_or_alloc”†”asbuh1hhj´ ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÙ h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj´ ubj:)�”}”(hŒ gfp_flags”h]”hŒ gfp_flags”…”�”}”(hjç h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj´ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjÓ ubjY)�”}”(hŒklp_shadow_ctor_t ctor”h]”(h)�”}”(hhh]”j:)�”}”(hŒklp_shadow_ctor_t”h]”hŒklp_shadow_ctor_t”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”j Œmodname”NŒ classname”Nj›jž)�”}”j¡]”j� Œc.klp_shadow_get_or_alloc”†”asbuh1hhjü ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj! h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjü ubj:)�”}”(hŒctor”h]”hŒctor”…”�”}”(hj/ h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjü ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjÓ ubjY)�”}”(hŒvoid *ctor_data”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjD ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjV h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjD ubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hjd h²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hjD ubj:)�”}”(hŒ ctor_data”h]”hŒ ctor_data”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjD ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjÓ ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jRhj� h²hh³jŸ h´KÎubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhj‰ h²hh³jŸ h´KÎubah}”(h]”j„ ah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³jŸ h´KÎhj† h²hubjø)�”}”(hhh]”jý)�”}”(hŒ.get existing or allocate a new shadow variable”h]”hŒ.get existing or allocate a new shadow variable”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÎhj˜ h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hj† h²hh³jŸ h´KÎubeh}”(h]”h ]”(j•Œfunction”eh"]”h$]”h&]”jj•jj³ jj³ j‰j‰j‰uh1hÿh²hhjøh³Nh´Nubj!)�”}”(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¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj» ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÒhj· ubjA)�”}”(hhh]”(jF)�”}”(hŒ'``void *obj`` pointer to parent object ”h]”(jL)�”}”(hŒ ``void *obj``”h]”jR)�”}”(hjÜ h]”hŒ void *obj”…”�”}”(hjÞ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÚ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÏhjÖ ubjh)�”}”(hhh]”jý)�”}”(hŒpointer to parent object”h]”hŒpointer to parent object”…”�”}”(hjõ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jñ h´KÏhjò ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÖ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jñ h´KÏhjÓ ubjF)�”}”(hŒ%``unsigned long id`` data identifier ”h]”(jL)�”}”(hŒ``unsigned long id``”h]”jR)�”}”(hj h]”hŒunsigned long id”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÐhj ubjh)�”}”(hhh]”jý)�”}”(hŒdata identifier”h]”hŒdata identifier”…”�”}”(hj. h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j* h´KÐhj+ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j* h´KÐhjÓ ubjF)�”}”(hŒ&``size_t size`` size of attached data ”h]”(jL)�”}”(hŒ``size_t size``”h]”jR)�”}”(hjN h]”hŒ size_t size”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjL ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÑhjH ubjh)�”}”(hhh]”jý)�”}”(hŒsize of attached data”h]”hŒsize of attached data”…”�”}”(hjg h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jc h´KÑhjd ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjH ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jc h´KÑhjÓ ubjF)�”}”(hŒ,``gfp_t gfp_flags`` GFP mask for allocation ”h]”(jL)�”}”(hŒ``gfp_t gfp_flags``”h]”jR)�”}”(hj‡ h]”hŒgfp_t gfp_flags”…”�”}”(hj‰ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj… ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÒhj� ubjh)�”}”(hhh]”jý)�”}”(hŒGFP mask for allocation”h]”hŒGFP mask for allocation”…”�”}”(hj  h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jœ h´KÒhj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj� ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jœ h´KÒhjÓ ubjF)�”}”(hŒW``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]”hŒklp_shadow_ctor_t ctor”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj¾ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÓhjº ubjh)�”}”(hhh]”jý)�”}”(hŒ;custom constructor to initialize the shadow data (optional)”h]”hŒ;custom constructor to initialize the shadow data (optional)”…”�”}”(hjÙ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jÕ h´KÓhjÖ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjº ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jÕ h´KÓhjÓ ubjF)�”}”(hŒF``void *ctor_data`` pointer to any data needed by **ctor** (optional) ”h]”(jL)�”}”(hŒ``void *ctor_data``”h]”jR)�”}”(hjù h]”hŒvoid *ctor_data”…”�”}”(hjû h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj÷ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÔhjó ubjh)�”}”(hhh]”jý)�”}”(hŒ1pointer to any data needed by **ctor** (optional)”h]”(hŒpointer to any data needed by ”…”�”}”(hj h²hh³Nh´Nubj+)�”}”(hŒ**ctor**”h]”hŒctor”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj ubhŒ (optional)”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j h´KÔhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjó ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j h´KÔhjÓ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hj· ubjý)�”}”(hŒ**Description**”h]”j+)�”}”(hjF h]”hŒ Description”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjD ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÖhj· ubjý)�”}”(hŒ£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().”h]”hŒ£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().”…”�”}”(hj\ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÕhj· 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]”(hŒMThis function guarantees that only one shadow variable exists with the given ”…”�”}”(hjk h²hh³Nh´Nubj+)�”}”(hŒ**id**”h]”hŒid”…”�”}”(hjs h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjk ubhŒ for the given ”…”�”}”(hjk h²hh³Nh´Nubj+)�”}”(hŒ**obj**”h]”hŒobj”…”�”}”(hj… h²hh³Nh´Nubah}”(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 h²hh³Nh´Nubj+)�”}”(hŒ**ctor**”h]”hŒctor”…”�”}”(hj— h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjk ubhŒ/ is called in atomic context under a spin lock.”…”�”}”(hjk h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÙhj· ubjý)�”}”(hŒ **Return**”h]”j+)�”}”(hj² h]”hŒReturn”…”�”}”(hj´ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj° ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KÞhj· ubjý)�”}”(hŒ2the shadow variable data element, NULL on failure.”h]”hŒ2the shadow variable data element, NULL on failure.”…”�”}”(hjÈ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Kßhj· ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hjøh²hh³Nh´Nubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒklp_shadow_free (C function)”Œc.klp_shadow_free”hNt”auh1hîhjøh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒJvoid klp_shadow_free (void *obj, unsigned long id, klp_shadow_dtor_t dtor)”h]”j )�”}”(hŒIvoid klp_shadow_free(void *obj, unsigned long id, klp_shadow_dtor_t dtor)”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjó h²hh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Kôubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjó h²hh³jh´Kôubj4)�”}”(hŒklp_shadow_free”h]”j:)�”}”(hŒklp_shadow_free”h]”hŒklp_shadow_free”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hjó h²hh³jh´KôubjS)�”}”(hŒ5(void *obj, unsigned long id, klp_shadow_dtor_t dtor)”h]”(jY)�”}”(hŒ void *obj”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj0ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj0ubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hj0ubj:)�”}”(hŒobj”h]”hŒobj”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj0ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhj,ubjY)�”}”(hŒunsigned long id”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjrubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjrubj)�”}”(hŒlong”h]”hŒlong”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjrubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjrubj:)�”}”(hŒid”h]”hŒid”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjrubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhj,ubjY)�”}”(hŒklp_shadow_dtor_t dtor”h]”(h)�”}”(hhh]”j:)�”}”(hŒklp_shadow_dtor_t”h]”hŒklp_shadow_dtor_t”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjÇubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”jÌŒmodname”NŒ classname”Nj›jž)�”}”j¡]”j¤)�”}”j—jsbŒc.klp_shadow_free”†”asbuh1hhjÃubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjÃubj:)�”}”(hŒdtor”h]”hŒdtor”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjÃubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhj,ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jRhjó h²hh³jh´Kôubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhjï h²hh³jh´Kôubah}”(h]”jê ah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³jh´Kôhjì h²hubjø)�”}”(hhh]”jý)�”}”(hŒ+detach and free a shadow variable”h]”hŒ+detach and free a shadow variable”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Kôhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjì h²hh³jh´Kôubeh}”(h]”h ]”(j•Œfunction”eh"]”h$]”h&]”jj•jj:jj:j‰j‰j‰uh1hÿh²hhjøh³Nh´Nubj!)�”}”(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”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjBubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Køhj>ubjA)�”}”(hhh]”(jF)�”}”(hŒ'``void *obj`` pointer to parent object ”h]”(jL)�”}”(hŒ ``void *obj``”h]”jR)�”}”(hjch]”hŒ void *obj”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjaubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Kõhj]ubjh)�”}”(hhh]”jý)�”}”(hŒpointer to parent object”h]”hŒpointer to parent object”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jxh´Kõhjyubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj]ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jxh´KõhjZubjF)�”}”(hŒ%``unsigned long id`` data identifier ”h]”(jL)�”}”(hŒ``unsigned long id``”h]”jR)�”}”(hjœh]”hŒunsigned long id”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjšubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Köhj–ubjh)�”}”(hhh]”jý)�”}”(hŒdata identifier”h]”hŒdata identifier”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j±h´Köhj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj–ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j±h´KöhjZubjF)�”}”(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)�”}”(hjÕh]”hŒklp_shadow_dtor_t dtor”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´KøhjÏubjh)�”}”(hhh]”jý)�”}”(hŒzcustom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional)”h]”hŒzcustom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional)”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´K÷hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÏubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jêh´KøhjZubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hj>ubjý)�”}”(hŒ**Description**”h]”j+)�”}”(hjh]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Kúhj>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'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Kùhj>ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hjøh²hh³Nh´Nubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒ klp_shadow_free_all (C function)”Œc.klp_shadow_free_all”hNt”auh1hîhjøh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒCvoid klp_shadow_free_all (unsigned long id, klp_shadow_dtor_t dtor)”h]”j )�”}”(hŒBvoid klp_shadow_free_all(unsigned long id, klp_shadow_dtor_t dtor)”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjRh²hh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Mubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjRh²hh³jdh´Mubj4)�”}”(hŒklp_shadow_free_all”h]”j:)�”}”(hŒklp_shadow_free_all”h]”hŒklp_shadow_free_all”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjsubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hjRh²hh³jdh´MubjS)�”}”(hŒ*(unsigned long id, klp_shadow_dtor_t dtor)”h]”(jY)�”}”(hŒunsigned long id”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj�ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj�ubj)�”}”(hŒlong”h]”hŒlong”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj�ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj�ubj:)�”}”(hŒid”h]”hŒid”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj�ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhj‹ubjY)�”}”(hŒklp_shadow_dtor_t dtor”h]”(h)�”}”(hhh]”j:)�”}”(hŒklp_shadow_dtor_t”h]”hŒklp_shadow_dtor_t”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjäubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”jéŒmodname”NŒ classname”Nj›jž)�”}”j¡]”j¤)�”}”j—jysbŒc.klp_shadow_free_all”†”asbuh1hhjàubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjàubj:)�”}”(hŒdtor”h]”hŒdtor”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjàubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhj‹ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jRhjRh²hh³jdh´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhjNh²hh³jdh´Mubah}”(h]”jIah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³jdh´MhjKh²hubjø)�”}”(hhh]”jý)�”}”(hŒ,detach and free all <_, id> shadow variables”h]”hŒ,detach and free all <_, id> shadow variables”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Mhj<h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjKh²hh³jdh´Mubeh}”(h]”h ]”(j•Œfunction”eh"]”h$]”h&]”jj•jjWjjWj‰j‰j‰uh1hÿh²hhjøh³Nh´Nubj!)�”}”(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”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Mhj[ubjA)�”}”(hhh]”(jF)�”}”(hŒ%``unsigned long id`` data identifier ”h]”(jL)�”}”(hŒ``unsigned long id``”h]”jR)�”}”(hj€h]”hŒunsigned long id”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Mhjzubjh)�”}”(hhh]”jý)�”}”(hŒdata identifier”h]”hŒdata identifier”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j•h´Mhj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjzubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j•h´MhjwubjF)�”}”(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)�”}”(hj¹h]”hŒklp_shadow_dtor_t dtor”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj·ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Mhj³ubjh)�”}”(hhh]”jý)�”}”(hŒzcustom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional)”h]”hŒzcustom callback that can be used to unregister the variable and/or free data that the shadow variable points to (optional)”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´MhjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj³ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jÎh´Mhjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hj[ubjý)�”}”(hŒ**Description**”h]”j+)�”}”(hjõh]”hŒ Description”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjóubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Mhj[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 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:17: ./kernel/livepatch/shadow.c”h´Mhj[ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hjøh²hh³Nh´Nubeh}”(h]”Œshadow-variables”ah ]”h"]”Œshadow variables”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSystem State Changes”h]”hŒSystem State Changes”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj)h²hh³hÇh´Kubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒklp_get_state (C function)”Œc.klp_get_state”hNt”auh1hîhj)h²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒLstruct klp_state * klp_get_state (struct klp_patch *patch, unsigned long id)”h]”j )�”}”(hŒJstruct klp_state *klp_get_state(struct klp_patch *patch, unsigned long id)”h]”(j_)�”}”(hjbh]”hŒstruct”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hjOh²hh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Kubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjOh²hh³j`h´Kubh)�”}”(hhh]”j:)�”}”(hŒ klp_state”h]”hŒ klp_state”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjoubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”jtŒmodname”NŒ classname”Nj›jž)�”}”j¡]”j¤)�”}”j—Œ klp_get_state”sbŒc.klp_get_state”†”asbuh1hhjOh²hh³j`h´Kubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjOh²hh³j`h´Kubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hjOh²hh³j`h´Kubj4)�”}”(hŒ klp_get_state”h]”j:)�”}”(hj�h]”hŒ klp_get_state”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj®ubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hjOh²hh³j`h´KubjS)�”}”(hŒ+(struct klp_patch *patch, unsigned long id)”h]”(jY)�”}”(hŒstruct klp_patch *patch”h]”(j_)�”}”(hjbh]”hŒstruct”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hjÉubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjÉubh)�”}”(hhh]”j:)�”}”(hŒ klp_patch”h]”hŒ klp_patch”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjèubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”jíŒmodname”NŒ classname”Nj›jž)�”}”j¡]”jŽŒc.klp_get_state”†”asbuh1hhjÉubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjÉubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hjÉubj:)�”}”(hŒpatch”h]”hŒpatch”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjÉubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjÅubjY)�”}”(hŒunsigned long id”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj9ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj9ubj)�”}”(hŒlong”h]”hŒlong”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj9ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj9ubj:)�”}”(hŒid”h]”hŒid”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj9ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjÅubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jRhjOh²hh³j`h´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhjKh²hh³j`h´Kubah}”(h]”jFah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³j`h´KhjHh²hubjø)�”}”(hhh]”jý)�”}”(hŒ>get information about system state modified by the given patch”h]”hŒ>get information about system state modified by the given patch”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Khjœh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjHh²hh³j`h´Kubeh}”(h]”h ]”(j•Œfunction”eh"]”h$]”h&]”jj•jj·jj·j‰j‰j‰uh1hÿh²hhj)h³Nh´Nubj!)�”}”(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+)�”}”(hjÁh]”hŒ Parameters”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Khj»ubjA)�”}”(hhh]”(jF)�”}”(hŒK``struct klp_patch *patch`` livepatch that modifies the given system state ”h]”(jL)�”}”(hŒ``struct klp_patch *patch``”h]”jR)�”}”(hjàh]”hŒstruct klp_patch *patch”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´KhjÚubjh)�”}”(hhh]”jý)�”}”(hŒ.livepatch that modifies the given system state”h]”hŒ.livepatch that modifies the given system state”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jõh´Khjöubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÚubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jõh´Khj×ubjF)�”}”(hŒD``unsigned long id`` custom identifier of the modified system state ”h]”(jL)�”}”(hŒ``unsigned long id``”h]”jR)�”}”(hjh]”hŒunsigned long id”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Khjubjh)�”}”(hhh]”jý)�”}”(hŒ.custom identifier of the modified system state”h]”hŒ.custom identifier of the modified system state”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j.h´Khj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j.h´Khj×ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hj»ubjý)�”}”(hŒ**Description**”h]”j+)�”}”(hjTh]”hŒ Description”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjRubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Khj»ubjý)�”}”(hŒ?Checks whether the given patch modifies the given system state.”h]”hŒ?Checks whether the given patch modifies the given system state.”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Khj»ubjý)�”}”(hŒsThe function can be called either from pre/post (un)patch callbacks or from the kernel code added by the livepatch.”h]”hŒsThe function can be called either from pre/post (un)patch callbacks or from the kernel code added by the livepatch.”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Khj»ubjý)�”}”(hŒ **Return**”h]”j+)�”}”(hjŠh]”hŒReturn”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Khj»ubjý)�”}”(hŒ7pointer to struct klp_state when found, otherwise NULL.”h]”hŒ7pointer to struct klp_state when found, otherwise NULL.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Khj»ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hj)h²hh³Nh´Nubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒklp_get_prev_state (C function)”Œc.klp_get_prev_state”hNt”auh1hîhj)h²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒ8struct klp_state * klp_get_prev_state (unsigned long id)”h]”j )�”}”(hŒ6struct klp_state *klp_get_prev_state(unsigned long id)”h]”(j_)�”}”(hjbh]”hŒstruct”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hjËh²hh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´K-ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjËh²hh³jÜh´K-ubh)�”}”(hhh]”j:)�”}”(hŒ klp_state”h]”hŒ klp_state”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjëubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j•Œreftype”j—Œ reftarget”jðŒmodname”NŒ classname”Nj›jž)�”}”j¡]”j¤)�”}”j—Œklp_get_prev_state”sbŒc.klp_get_prev_state”†”asbuh1hhjËh²hh³jÜh´K-ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjËh²hh³jÜh´K-ubj¸)�”}”(hj»h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jÄah"]”h$]”h&]”uh1j·hjËh²hh³jÜh´K-ubj4)�”}”(hŒklp_get_prev_state”h]”j:)�”}”(hj h]”hŒklp_get_prev_state”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj*ubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hjËh²hh³jÜh´K-ubjS)�”}”(hŒ(unsigned long id)”h]”jY)�”}”(hŒunsigned long id”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjEubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjEubj)�”}”(hŒlong”h]”hŒlong”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjEubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjEubj:)�”}”(hŒid”h]”hŒid”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjEubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jXhjAubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jRhjËh²hh³jÜh´K-ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhjÇh²hh³jÜh´K-ubah}”(h]”jÂah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³jÜh´K-hjÄh²hubjø)�”}”(hhh]”jý)�”}”(hŒPget information about system state modified by the already installed livepatches”h]”hŒPget information about system state modified by the already installed livepatches”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´K-hj¨h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjÄh²hh³jÜh´K-ubeh}”(h]”h ]”(j•Œfunction”eh"]”h$]”h&]”jj•jjÃjjÃj‰j‰j‰uh1hÿh²hhj)h³Nh´Nubj!)�”}”(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+)�”}”(hjÍh]”hŒ Parameters”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjËubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´K1hjÇubjA)�”}”(hhh]”jF)�”}”(hŒD``unsigned long id`` custom identifier of the modified system state ”h]”(jL)�”}”(hŒ``unsigned long id``”h]”jR)�”}”(hjìh]”hŒunsigned long id”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjêubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´K/hjæubjh)�”}”(hhh]”jý)�”}”(hŒ.custom identifier of the modified system state”h]”hŒ.custom identifier of the modified system state”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jh´K/hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjæubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jh´K/hjãubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjÇubjý)�”}”(hŒ**Description**”h]”j+)�”}”(hj'h]”hŒ Description”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´K1hjÇubjý)�”}”(hŒKChecks whether already installed livepatches modify the given system state.”h]”hŒKChecks whether already installed livepatches modify the given system state.”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´K0hjÇubjý)�”}”(hŒ—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.”h]”hŒ—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.”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´K3hjÇubjý)�”}”(hŒ½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.”h]”hŒ½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.”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´K7hjÇubjý)�”}”(hŒ **Return**”h]”j+)�”}”(hjlh]”hŒReturn”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjjubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒV/var/lib/git/docbuild/linux/Documentation/livepatch/api:23: ./kernel/livepatch/state.c”h´Kubjh)�”}”(hhh]”jý)�”}”(hŒsize of the new function”h]”hŒsize of the new function”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jYh´K&hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj>ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jYh´K&hjrubjF)�”}”(hŒG``nop`` temporary patch to use the original code again; dyn. allocated ”h]”(jL)�”}”(hŒ``nop``”h]”jR)�”}”(hj}h]”hŒnop”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K'hjwubjh)�”}”(hhh]”jý)�”}”(hŒ>temporary patch to use the original code again; dyn. allocated”h]”hŒ>temporary patch to use the original code again; dyn. allocated”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j’h´K'hj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j’h´K'hjrubjF)�”}”(hŒ8``patched`` the func has been added to the klp_ops list ”h]”(jL)�”}”(hŒ ``patched``”h]”jR)�”}”(hj¶h]”hŒpatched”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K(hj°ubjh)�”}”(hhh]”jý)�”}”(hŒ+the func has been added to the klp_ops list”h]”hŒ+the func has been added to the klp_ops list”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jËh´K(hjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj°ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jËh´K(hjrubjF)�”}”(hŒ>``transition`` the func is currently being applied or reverted”h]”(jL)�”}”(hŒ``transition``”h]”jR)�”}”(hjïh]”hŒ transition”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjíubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K(hjéubjh)�”}”(hhh]”jý)�”}”(hŒ/the func is currently being applied or reverted”h]”hŒ/the func is currently being applied or reverted”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K)hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjéubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jh´K(hjrubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hj(ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hj h²hh³Nh´Nubjý)�”}”(hŒ**Description**”h]”j+)�”}”(hj2h]”hŒ Description”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K,hj h²hubjý)�”}”(hŒ‡The patched and transition variables define the func's patching state. When patching, a func is always in one of the following states:”h]”hŒ‰The patched and transition variables define the func’s patching state. When patching, a func is always in one of the following states:”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K)hj h²hubhŒ block_quote”“”)�”}”(hŒÒpatched=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ý)�”}”(hŒÑpatched=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]”hŒÑpatched=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]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K,hjYubah}”(h]”h ]”h"]”h$]”h&]”uh1jWh³jkh´K,hj h²hubjý)�”}”(hŒ2And when unpatching, it goes in the reverse order:”h]”hŒ2And when unpatching, it goes in the reverse order:”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K1hj h²hubjX)�”}”(hŒÓpatched=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ý)�”}”(hŒÏpatched=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]”hŒÏpatched=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”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K3hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jWh³j“h´K3hj h²hubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒklp_object (C struct)”Œ c.klp_object”hNt”auh1hîhj h²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒ klp_object”h]”j )�”}”(hŒstruct klp_object”h]”(j_)�”}”(hjbh]”hŒstruct”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hj¯h²hh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K;ubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj¯h²hh³jÀh´K;ubj4)�”}”(hŒ klp_object”h]”j:)�”}”(hj­h]”hŒ klp_object”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjÏubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hj¯h²hh³jÀh´K;ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhj«h²hh³jÀh´K;ubah}”(h]”j¦ah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³jÀh´K;hj¨h²hubjø)�”}”(hhh]”jý)�”}”(hŒ)kernel object structure for live patching”h]”hŒ)kernel object structure for live patching”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KRhjòh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hj¨h²hh³jÀh´K;ubeh}”(h]”h ]”(j•Œstruct”eh"]”h$]”h&]”jj•jj jj j‰j‰j‰uh1hÿh²hhj h³Nh´Nubj!)�”}”(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 list”h]”(jý)�”}”(hŒ**Definition**::”h]”(j+)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjubhŒ:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KVhjubjJ)�”}”(hŒü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; };”h]”hŒü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; };”…”�”}”hj2sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jIh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KXhjubjý)�”}”(hŒ **Members**”h]”j+)�”}”(hjCh]”hŒMembers”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjAubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KdhjubjA)�”}”(hhh]”(jF)�”}”(hŒ+``name`` module name (or NULL for vmlinux) ”h]”(jL)�”}”(hŒ``name``”h]”jR)�”}”(hjbh]”hŒname”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KThj\ubjh)�”}”(hhh]”jý)�”}”(hŒ!module name (or NULL for vmlinux)”h]”hŒ!module name (or NULL for vmlinux)”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jwh´KThjxubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj\ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jwh´KThjYubjF)�”}”(hŒE``funcs`` function entries for functions to be patched in the object ”h]”(jL)�”}”(hŒ ``funcs``”h]”jR)�”}”(hj›h]”hŒfuncs”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj™ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KUhj•ubjh)�”}”(hhh]”jý)�”}”(hŒ:function entries for functions to be patched in the object”h]”hŒ:function entries for functions to be patched in the object”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j°h´KUhj±ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j°h´KUhjYubjF)�”}”(hŒ=``callbacks`` functions to be executed pre/post (un)patching ”h]”(jL)�”}”(hŒ ``callbacks``”h]”jR)�”}”(hjÔh]”hŒ callbacks”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÒubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KVhjÎubjh)�”}”(hhh]”jý)�”}”(hŒ.functions to be executed pre/post (un)patching”h]”hŒ.functions to be executed pre/post (un)patching”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jéh´KVhjêubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÎubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jéh´KVhjYubjF)�”}”(hŒ%``kobj`` kobject for sysfs resources ”h]”(jL)�”}”(hŒ``kobj``”h]”jR)�”}”(hj h]”hŒkobj”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KWhjubjh)�”}”(hhh]”jý)�”}”(hŒkobject for sysfs resources”h]”hŒkobject for sysfs resources”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j"h´KWhj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j"h´KWhjYubjF)�”}”(hŒ3``func_list`` dynamic list of the function entries ”h]”(jL)�”}”(hŒ ``func_list``”h]”jR)�”}”(hjFh]”hŒ func_list”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjDubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KXhj@ubjh)�”}”(hhh]”jý)�”}”(hŒ$dynamic list of the function entries”h]”hŒ$dynamic list of the function entries”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j[h´KXhj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj@ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j[h´KXhjYubjF)�”}”(hŒ*``node`` list node for klp_patch obj_list ”h]”(jL)�”}”(hŒ``node``”h]”jR)�”}”(hjh]”hŒnode”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KYhjyubjh)�”}”(hhh]”jý)�”}”(hŒ list node for klp_patch obj_list”h]”hŒ list node for klp_patch obj_list”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j”h´KYhj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjyubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j”h´KYhjYubjF)�”}”(hŒL``mod`` kernel module associated with the patched object (NULL for vmlinux) ”h]”(jL)�”}”(hŒ``mod``”h]”jR)�”}”(hj¸h]”hŒmod”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj¶ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K[hj²ubjh)�”}”(hhh]”jý)�”}”(hŒCkernel module associated with the patched object (NULL for vmlinux)”h]”hŒCkernel module associated with the patched object (NULL for vmlinux)”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KZhjÎubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj²ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jÍh´K[hjYubjF)�”}”(hŒF``dynamic`` temporary object for nop functions; dynamically allocated ”h]”(jL)�”}”(hŒ ``dynamic``”h]”jR)�”}”(hjòh]”hŒdynamic”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K\hjìubjh)�”}”(hhh]”jý)�”}”(hŒ9temporary object for nop functions; dynamically allocated”h]”hŒ9temporary object for nop functions; dynamically allocated”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jh´K\hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjìubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jh´K\hjYubjF)�”}”(hŒB``patched`` the object's funcs have been added to the klp_ops list”h]”(jL)�”}”(hŒ ``patched``”h]”jR)�”}”(hj+h]”hŒpatched”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K\hj%ubjh)�”}”(hhh]”jý)�”}”(hŒ6the object's funcs have been added to the klp_ops list”h]”hŒ8the object’s funcs have been added to the klp_ops list”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K]hjAubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j@h´K\hjYubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hj h²hh³Nh´Nubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒklp_state (C struct)”Œ c.klp_state”hNt”auh1hîhj h²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒ klp_state”h]”j )�”}”(hŒstruct klp_state”h]”(j_)�”}”(hjbh]”hŒstruct”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hj�h²hh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´Kcubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hj�h²hh³j’h´Kcubj4)�”}”(hŒ klp_state”h]”j:)�”}”(hjh]”hŒ klp_state”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hj¡ubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hj�h²hh³j’h´Kcubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhj}h²hh³j’h´Kcubah}”(h]”jxah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³j’h´Kchjzh²hubjø)�”}”(hhh]”jý)�”}”(hŒ-state of the system modified by the livepatch”h]”hŒ-state of the system modified by the livepatch”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KnhjÄh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjzh²hh³j’h´Kcubeh}”(h]”h ]”(j•Œstruct”eh"]”h$]”h&]”jj•jjßjjßj‰j‰j‰uh1hÿh²hhj h³Nh´Nubj!)�”}”(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 data”h]”(jý)�”}”(hŒ**Definition**::”h]”(j+)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjçubhŒ:”…”�”}”(hjçh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KrhjãubjJ)�”}”(hŒUstruct klp_state { unsigned long id; unsigned int version; void *data; };”h]”hŒUstruct klp_state { unsigned long id; unsigned int version; void *data; };”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jIh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´Kthjãubjý)�”}”(hŒ **Members**”h]”j+)�”}”(hjh]”hŒMembers”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KzhjãubjA)�”}”(hhh]”(jF)�”}”(hŒ*``id`` system state identifier (non-zero) ”h]”(jL)�”}”(hŒ``id``”h]”jR)�”}”(hj4h]”hŒid”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´Kphj.ubjh)�”}”(hhh]”jý)�”}”(hŒ"system state identifier (non-zero)”h]”hŒ"system state identifier (non-zero)”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jIh´KphjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj.ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jIh´Kphj+ubjF)�”}”(hŒ"``version`` version of the change ”h]”(jL)�”}”(hŒ ``version``”h]”jR)�”}”(hjmh]”hŒversion”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjkubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´Kqhjgubjh)�”}”(hhh]”jý)�”}”(hŒversion of the change”h]”hŒversion of the change”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j‚h´Kqhjƒubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjgubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j‚h´Kqhj+ubjF)�”}”(hŒ``data`` custom data”h]”(jL)�”}”(hŒ``data``”h]”jR)�”}”(hj¦h]”hŒdata”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´Kqhj ubjh)�”}”(hhh]”jý)�”}”(hŒ custom data”h]”hŒ custom data”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´Krhj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j»h´Kqhj+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hjãubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hj h²hh³Nh´Nubhï)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(hûŒklp_patch (C struct)”Œ c.klp_patch”hNt”auh1hîhj h²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒ klp_patch”h]”j )�”}”(hŒstruct klp_patch”h]”(j_)�”}”(hjbh]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hjüh²hh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´Kxubj#)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j/ah"]”h$]”h&]”uh1j"hjüh²hh³j h´Kxubj4)�”}”(hŒ klp_patch”h]”j:)�”}”(hjúh]”hŒ klp_patch”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jFah"]”h$]”h&]”uh1j9hjubah}”(h]”h ]”(jMjNeh"]”h$]”h&]”hÅhÆuh1j3hjüh²hh³j h´Kxubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjéˆuh1j jêjëhjøh²hh³j h´Kxubah}”(h]”jóah ]”(jïjðeh"]”h$]”h&]”jôˆjõ)jöhuh1jh³j h´Kxhjõh²hubjø)�”}”(hhh]”jý)�”}”(hŒ!patch structure for live patching”h]”hŒ!patch structure for live patching”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´Kzhj?h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjõh²hh³j h´Kxubeh}”(h]”h ]”(j•Œstruct”eh"]”h$]”h&]”jj•jjZjjZj‰j‰j‰uh1hÿh²hhj h³Nh´Nubj!)�”}”(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 module”h]”(jý)�”}”(hŒ**Definition**::”h]”(j+)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjbubhŒ:”…”�”}”(hjbh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K~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&]”hÅhÆuh1jIh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K€hj^ubjý)�”}”(hŒ **Members**”h]”j+)�”}”(hj�h]”hŒMembers”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KŽhj^ubjA)�”}”(hhh]”(jF)�”}”(hŒ+``mod`` reference to the live patch module ”h]”(jL)�”}”(hŒ``mod``”h]”jR)�”}”(hj¯h]”hŒmod”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K|hj©ubjh)�”}”(hhh]”jý)�”}”(hŒ"reference to the live patch module”h]”hŒ"reference to the live patch module”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jÄh´K|hjÅubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj©ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jÄh´K|hj¦ubjF)�”}”(hŒ9``objs`` object entries for kernel objects to be patched ”h]”(jL)�”}”(hŒ``objs``”h]”jR)�”}”(hjèh]”hŒobjs”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjæubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K}hjâubjh)�”}”(hhh]”jý)�”}”(hŒ/object entries for kernel objects to be patched”h]”hŒ/object entries for kernel objects to be patched”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jýh´K}hjþubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjâubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jýh´K}hj¦ubjF)�”}”(hŒ/``states`` system states that can get modified ”h]”(jL)�”}”(hŒ ``states``”h]”jR)�”}”(hj! h]”hŒstates”…”�”}”(hj# h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K~hj ubjh)�”}”(hhh]”jý)�”}”(hŒ#system states that can get modified”h]”hŒ#system states that can get modified”…”�”}”(hj: h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j6 h´K~hj7 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j6 h´K~hj¦ubjF)�”}”(hŒ.``replace`` replace all actively used patches ”h]”(jL)�”}”(hŒ ``replace``”h]”jR)�”}”(hjZ h]”hŒreplace”…”�”}”(hj\ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjX ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´KhjT ubjh)�”}”(hhh]”jý)�”}”(hŒ!replace all actively used patches”h]”hŒ!replace all actively used patches”…”�”}”(hjs h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³jo h´Khjp ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjT ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jo h´Khj¦ubjF)�”}”(hŒ<``list`` list node for global list of actively used patches ”h]”(jL)�”}”(hŒ``list``”h]”jR)�”}”(hj“ h]”hŒlist”…”�”}”(hj• h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj‘ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K€hj� ubjh)�”}”(hhh]”jý)�”}”(hŒ2list node for global list of actively used patches”h]”hŒ2list node for global list of actively used patches”…”�”}”(hj¬ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j¨ h´K€hj© ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj� ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j¨ h´K€hj¦ubjF)�”}”(hŒ%``kobj`` kobject for sysfs resources ”h]”(jL)�”}”(hŒ``kobj``”h]”jR)�”}”(hjÌ h]”hŒkobj”…”�”}”(hjÎ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÊ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K�hjÆ ubjh)�”}”(hhh]”jý)�”}”(hŒkobject for sysfs resources”h]”hŒkobject for sysfs resources”…”�”}”(hjå h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³já h´K�hjâ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÆ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³já h´K�hj¦ubjF)�”}”(hŒ0``obj_list`` dynamic list of the object entries ”h]”(jL)�”}”(hŒ ``obj_list``”h]”jR)�”}”(hj!h]”hŒobj_list”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³ŒW/var/lib/git/docbuild/linux/Documentation/livepatch/api:29: ./include/linux/livepatch.h”h´K‚hjÿ ubjh)�”}”(hhh]”jý)�”}”(hŒ"dynamic list of the object entries”h]”hŒ"dynamic list of the object entries”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jüh³j!h´K‚hj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjÿ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j!h´K‚hj¦ubjF)�”}”(hŒC``enabled`` the patch is enabled (but operation may be incomplete) ”h]”(jL)�”}”(hŒ ``enabled``”h]”jR)�”}”(hj>!h]”hŒenabled”…”�”}”(hj@!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj