€•ÝŒ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´MbubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1j"hj h²hh³j!h´MbubhŒ 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´MbubhŒ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´Mbubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1j Œsphinx_line_type”Œ declarator”hjh²hh³j!h´Mbubah}”(h]”hýah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1jh³j!h´Mbhjh²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´Mbhjùh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j÷hjh²hh³j!h´Mbubeh}”(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´Mfhj"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´MchjGubhŒ 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´Mchjiubah}”(h]”h ]”h"]”h$]”h&]”uh1jghjGubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³jfh´MchjBubah}”(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´Mehj"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´Mdhj"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´Mhhj"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´Mkhj"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´Mlhj"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 old function”h]”hŒsize of the old 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Œ&``new_size`` size of the new function ”h]”(jL)�”}”(hŒ ``new_size``”h]”jR)�”}”(hj}h]”hŒnew_size”…”�”}”(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Œsize of the new function”h]”hŒsize of the new function”…”�”}”(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ŒG``nop`` temporary patch to use the original code again; dyn. allocated ”h]”(jL)�”}”(hŒ``nop``”h]”jR)�”}”(hj¶h]”hŒnop”…”�”}”(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Œ>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&]”uh1jghj°ubeh}”(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”…”�”}”(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)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”…”�”}”(hjAh²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>ubah}”(h]”h ]”h"]”h$]”h&]”uh1jghj"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³j=h´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+)�”}”(hjkh]”hŒ Description”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjiubah}”(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:”…”�”}”(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*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-hj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³j¤h´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:”…”�”}”(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´K2hj h²hubj‘)�”}”(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´K4hjºubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³jÌh´K4hj 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!h]”hŒkobj”…”�”}”(hj@!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj