€• Œ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/core-api/debug-objects”Œ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/core-api/debug-objects”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ*/translations/it_IT/core-api/debug-objects”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ*/translations/ja_JP/core-api/debug-objects”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ*/translations/ko_KR/core-api/debug-objects”Œ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/core-api/debug-objects”Œ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/core-api/debug-objects”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ,The object-lifetime debugging infrastructure”h]”hŒ,The object-lifetime debugging infrastructure”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒD/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects.rst”h´KubhŒ field_list”“”)�”}”(hhh]”hŒfield”“”)�”}”(hhh]”(hŒ field_name”“”)�”}”(hŒAuthor”h]”hŒAuthor”…”�”}”(hh×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÕhhÒh³hÊh´KubhŒ field_body”“”)�”}”(hŒThomas Gleixner ”h]”hŒ paragraph”“”)�”}”(hŒThomas Gleixner”h]”hŒThomas Gleixner”…”�”}”(hhíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khhçubah}”(h]”h ]”h"]”h$]”h&]”uh1håhhÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KhhÍh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒ Introduction”h]”hŒ Introduction”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj h²hh³hÊh´Kubhì)�”}”(hŒwdebugobjects is a generic infrastructure to track the life time of kernel objects and validate the operations on those.”h]”hŒwdebugobjects is a generic infrastructure to track the life time of kernel objects and validate the operations on those.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K hj h²hubhì)�”}”(hŒAdebugobjects is useful to check for the following error patterns:”h]”hŒAdebugobjects is useful to check for the following error patterns:”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K hj h²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ$Activation of uninitialized objects ”h]”hì)�”}”(hŒ#Activation of uninitialized objects”h]”hŒ#Activation of uninitialized objects”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KhjAubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hj<h²hh³hÊh´Nubj@)�”}”(hŒ!Initialization of active objects ”h]”hì)�”}”(hŒ Initialization of active objects”h]”hŒ Initialization of active objects”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KhjYubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hj<h²hh³hÊh´Nubj@)�”}”(hŒ!Usage of freed/destroyed objects ”h]”hì)�”}”(hŒ Usage of freed/destroyed objects”h]”hŒ Usage of freed/destroyed objects”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khjqubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hj<h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j:h³hÊh´Khj h²hubhì)�”}”(hŒ²debugobjects is not changing the data structure of the real object so it can be compiled in with a minimal runtime impact and enabled on demand with a kernel command line option.”h]”hŒ²debugobjects is not changing the data structure of the real object so it can be compiled in with a minimal runtime impact and enabled on demand with a kernel command line option.”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khj h²hubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒHowto use debugobjects”h]”hŒHowto use debugobjects”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj§h²hh³hÊh´Kubhì)�”}”(hXöA kernel subsystem needs to provide a data structure which describes the object type and add calls into the debug code at appropriate places. The data structure to describe the object type needs at minimum the name of the object type. Optional functions can and should be provided to fixup detected problems so the kernel can continue to work and the debug information can be retrieved from a live system instead of hard core debugging with serial consoles and stack trace transcripts from the monitor.”h]”hXöA kernel subsystem needs to provide a data structure which describes the object type and add calls into the debug code at appropriate places. The data structure to describe the object type needs at minimum the name of the object type. Optional functions can and should be provided to fixup detected problems so the kernel can continue to work and the debug information can be retrieved from a live system instead of hard core debugging with serial consoles and stack trace transcripts from the monitor.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khj§h²hubhì)�”}”(hŒ-The debug calls provided by debugobjects are:”h]”hŒ-The debug calls provided by debugobjects are:”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K%hj§h²hubj;)�”}”(hhh]”(j@)�”}”(hŒdebug_object_init ”h]”hì)�”}”(hŒdebug_object_init”h]”hŒdebug_object_init”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K'hj×ubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjÔh²hh³hÊh´Nubj@)�”}”(hŒdebug_object_init_on_stack ”h]”hì)�”}”(hŒdebug_object_init_on_stack”h]”hŒdebug_object_init_on_stack”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K)hjïubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjÔh²hh³hÊh´Nubj@)�”}”(hŒdebug_object_activate ”h]”hì)�”}”(hŒdebug_object_activate”h]”hŒdebug_object_activate”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K+hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjÔh²hh³hÊh´Nubj@)�”}”(hŒdebug_object_deactivate ”h]”hì)�”}”(hŒdebug_object_deactivate”h]”hŒdebug_object_deactivate”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K-hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjÔh²hh³hÊh´Nubj@)�”}”(hŒdebug_object_destroy ”h]”hì)�”}”(hŒdebug_object_destroy”h]”hŒdebug_object_destroy”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K/hj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjÔh²hh³hÊh´Nubj@)�”}”(hŒdebug_object_free ”h]”hì)�”}”(hŒdebug_object_free”h]”hŒdebug_object_free”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K1hjOubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjÔh²hh³hÊh´Nubj@)�”}”(hŒdebug_object_assert_init ”h]”hì)�”}”(hŒdebug_object_assert_init”h]”hŒdebug_object_assert_init”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K3hjgubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjÔh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j�j�uh1j:h³hÊh´K'hj§h²hubhì)�”}”(hŒƒEach of these functions takes the address of the real object and a pointer to the object type specific debug description structure.”h]”hŒƒEach of these functions takes the address of the real object and a pointer to the object type specific debug description structure.”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K5hj§h²hubhì)�”}”(hŒ|Each detected error is reported in the statistics and a limited number of errors are printk'ed including a full stack trace.”h]”hŒ~Each detected error is reported in the statistics and a limited number of errors are printk’ed including a full stack trace.”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K8hj§h²hubhì)�”}”(hXThe statistics are available via /sys/kernel/debug/debug_objects/stats. They provide information about the number of warnings and the number of successful fixups along with information about the usage of the internal tracking objects and the state of the internal tracking objects pool.”h]”hXThe statistics are available via /sys/kernel/debug/debug_objects/stats. They provide information about the number of warnings and the number of successful fixups along with information about the usage of the internal tracking objects and the state of the internal tracking objects pool.”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K;hj§h²hubeh}”(h]”Œhowto-use-debugobjects”ah ]”h"]”Œhowto use debugobjects”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒDebug functions”h]”hŒDebug functions”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj·h²hh³hÊh´KAubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œdebug_object_init (C function)”Œc.debug_object_init”hNt”auh1jÈhj·h²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒHvoid debug_object_init (void *addr, const struct debug_obj_descr *descr)”h]”hŒdesc_signature_line”“”)�”}”(hŒGvoid debug_object_init(void *addr, const struct debug_obj_descr *descr)”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1jêhjæh²hh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:67: ./lib/debugobjects.c”h´M9ubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jühjæh²hh³jûh´M9ubhŒ desc_name”“”)�”}”(hŒdebug_object_init”h]”hŒ desc_sig_name”“”)�”}”(hŒdebug_object_init”h]”hŒdebug_object_init”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jhjubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j hjæh²hh³jûh´M9ubhŒdesc_parameterlist”“”)�”}”(hŒ1(void *addr, const struct debug_obj_descr *descr)”h]”(hŒdesc_parameter”“”)�”}”(hŒ void *addr”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhj6ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj6ubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1jVhj6ubj)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj6ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hj0ubj5)�”}”(hŒ#const struct debug_obj_descr *descr”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒconst”h]”hŒconst”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1j€hj|ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj|ubj�)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”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Œdebug_obj_descr”h]”hŒdebug_obj_descr”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj»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ÕjsbŒc.debug_object_init”†”asbuh1hhj|ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj|ubjW)�”}”(hjZh]”hŒ*”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhj|ubj)�”}”(hŒdescr”h]”hŒdescr”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj|ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hj0ubeh}”(h]”h ]”h"]”h$]”h&]”j,j-uh1j.hjæh²hh³jûh´M9ubeh}”(h]”h ]”h"]”h$]”h&]”j,j-Œ add_permalink”ˆuh1jäŒsphinx_line_type”Œ declarator”hjàh²hh³jûh´M9ubah}”(h]”j×ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1jÞh³jûh´M9hjÛh²hubhŒ desc_content”“”)�”}”(hhh]”hì)�”}”(hŒ*debug checks when an object is initialized”h]”hŒ*debug checks when an object is initialized”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:67: ./lib/debugobjects.c”h´M9hj3h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjÛh²hh³jûh´M9ubeh}”(h]”h ]”(jÓŒfunction”eh"]”h$]”h&]”Œdomain”jÓŒobjtype”jNŒdesctype”jNŒnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1jÙh²hhj·h³Nh´NubhŒ container”“”)�”}”(hŒ›**Parameters** ``void *addr`` address of the object ``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(hì)�”}”(hŒ**Parameters**”h]”hŒstrong”“”)�”}”(hj`h]”hŒ Parameters”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:67: ./lib/debugobjects.c”h´M=hjZubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ%``void *addr`` address of the object ”h]”(hŒterm”“”)�”}”(hŒ``void *addr``”h]”hŒliteral”“”)�”}”(hj‡h]”hŒ void *addr”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj…ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:67: ./lib/debugobjects.c”h´M:hjubhŒ definition”“”)�”}”(hhh]”hì)�”}”(hŒaddress of the object”h]”hŒaddress of the object”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jžh´M:hj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jžh´M:hjzubj~)�”}”(hŒa``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(j„)�”}”(hŒ'``const struct debug_obj_descr *descr``”h]”jŠ)�”}”(hjÄh]”hŒ#const struct debug_obj_descr *descr”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:67: ./lib/debugobjects.c”h´M<hj¾ubj )�”}”(hhh]”hì)�”}”(hŒ9pointer to an object specific debug description structure”h]”hŒ9pointer to an object specific debug description structure”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:67: ./lib/debugobjects.c”h´M;hjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jÙh´M<hjzubeh}”(h]”h ]”h"]”h$]”h&]”uh1jxhjZubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jXhj·h²hh³Nh´Nubhì)�”}”(hŒXThis function is called whenever the initialization function of a real object is called.”h]”hŒXThis function is called whenever the initialization function of a real object is called.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KFhj·h²hubhì)�”}”(hXïWhen the real object is already tracked by debugobjects it is checked, whether the object can be initialized. Initializing is not allowed for active and destroyed objects. When debugobjects detects an error, then it calls the fixup_init function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real initialization of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”h]”hXïWhen the real object is already tracked by debugobjects it is checked, whether the object can be initialized. Initializing is not allowed for active and destroyed objects. When debugobjects detects an error, then it calls the fixup_init function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real initialization of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KIhj·h²hubhì)�”}”(hXßWhen the real object is not yet tracked by debugobjects, debugobjects allocates a tracker object for the real object and sets the tracker object state to ODEBUG_STATE_INIT. It verifies that the object is not on the callers stack. If it is on the callers stack then a limited number of warnings including a full stack trace is printk'ed. The calling code must use debug_object_init_on_stack() and remove the object before leaving the function which allocated it. See next section.”h]”hXáWhen the real object is not yet tracked by debugobjects, debugobjects allocates a tracker object for the real object and sets the tracker object state to ODEBUG_STATE_INIT. It verifies that the object is not on the callers stack. If it is on the callers stack then a limited number of warnings including a full stack trace is printk’ed. The calling code must use debug_object_init_on_stack() and remove the object before leaving the function which allocated it. See next section.”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KRhj·h²hubjÉ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÕŒ'debug_object_init_on_stack (C function)”Œc.debug_object_init_on_stack”hNt”auh1jÈhj·h²hh³Nh´NubjÚ)�”}”(hhh]”(jß)�”}”(hŒQvoid debug_object_init_on_stack (void *addr, const struct debug_obj_descr *descr)”h]”jå)�”}”(hŒPvoid debug_object_init_on_stack(void *addr, const struct debug_obj_descr *descr)”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhjDh²hh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:90: ./lib/debugobjects.c”h´MGubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjDh²hh³jVh´MGubj)�”}”(hŒdebug_object_init_on_stack”h]”j)�”}”(hŒdebug_object_init_on_stack”h]”hŒdebug_object_init_on_stack”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjeubah}”(h]”h ]”(j'j(eh"]”h$]”h&]”j,j-uh1j hjDh²hh³jVh´MGubj/)�”}”(hŒ1(void *addr, const struct debug_obj_descr *descr)”h]”(j5)�”}”(hŒ void *addr”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhj�ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj�ubjW)�”}”(hjZh]”hŒ*”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhj�ubj)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj�ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hj}ubj5)�”}”(hŒ#const struct debug_obj_descr *descr”h]”(j�)�”}”(hj„h]”hŒconst”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hjÃubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjÃubj�)�”}”(hj¡h]”hŒstruct”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”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Œdebug_obj_descr”h]”hŒdebug_obj_descr”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjýubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jÓŒreftype”jÕŒ reftarget”jŒmodname”NŒ classname”NjÙjÜ)�”}”jß]”jâ)�”}”jÕjksbŒc.debug_object_init_on_stack”†”asbuh1hhjÃubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjÃubjW)�”}”(hjZh]”hŒ*”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjÃubj)�”}”(hŒdescr”h]”hŒdescr”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjÃubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hj}ubeh}”(h]”h ]”h"]”h$]”h&]”j,j-uh1j.hjDh²hh³jVh´MGubeh}”(h]”h ]”h"]”h$]”h&]”j,j-j#ˆuh1jäj$j%hj@h²hh³jVh´MGubah}”(h]”j;ah ]”(j)j*eh"]”h$]”h&]”j.ˆj/)j0huh1jÞh³jVh´MGhj=h²hubj2)�”}”(hhh]”hì)�”}”(hŒ3debug checks when an object on stack is initialized”h]”hŒ3debug checks when an object on stack is initialized”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:90: ./lib/debugobjects.c”h´MGhjbh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj=h²hh³jVh´MGubeh}”(h]”h ]”(jÓŒfunction”eh"]”h$]”h&]”jRjÓjSj}jTj}jU‰jV‰jW‰uh1jÙh²hhj·h³Nh´NubjY)�”}”(hŒ›**Parameters** ``void *addr`` address of the object ``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(hì)�”}”(hŒ**Parameters**”h]”jc)�”}”(hj‡h]”hŒ Parameters”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj…ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:90: ./lib/debugobjects.c”h´MKhj�ubjy)�”}”(hhh]”(j~)�”}”(hŒ%``void *addr`` address of the object ”h]”(j„)�”}”(hŒ``void *addr``”h]”jŠ)�”}”(hj¦h]”hŒ void *addr”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:90: ./lib/debugobjects.c”h´MIhj ubj )�”}”(hhh]”hì)�”}”(hŒaddress of the object”h]”hŒaddress of the object”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j»h´MIhj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j»h´MIhj�ubj~)�”}”(hŒa``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(j„)�”}”(hŒ'``const struct debug_obj_descr *descr``”h]”jŠ)�”}”(hjßh]”hŒ#const struct debug_obj_descr *descr”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:90: ./lib/debugobjects.c”h´MKhjÙubj )�”}”(hhh]”hì)�”}”(hŒ9pointer to an object specific debug description structure”h]”hŒ9pointer to an object specific debug description structure”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒY/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:90: ./lib/debugobjects.c”h´MJhjõubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjÙubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jôh´MKhj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jxhj�ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jXhj·h²hh³Nh´Nubhì)�”}”(hŒsThis function is called whenever the initialization function of a real object which resides on the stack is called.”h]”hŒsThis function is called whenever the initialization function of a real object which resides on the stack is called.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K]hj·h²hubhì)�”}”(hXïWhen the real object is already tracked by debugobjects it is checked, whether the object can be initialized. Initializing is not allowed for active and destroyed objects. When debugobjects detects an error, then it calls the fixup_init function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real initialization of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”h]”hXïWhen the real object is already tracked by debugobjects it is checked, whether the object can be initialized. Initializing is not allowed for active and destroyed objects. When debugobjects detects an error, then it calls the fixup_init function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real initialization of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K`hj·h²hubhì)�”}”(hŒàWhen the real object is not yet tracked by debugobjects debugobjects allocates a tracker object for the real object and sets the tracker object state to ODEBUG_STATE_INIT. It verifies that the object is on the callers stack.”h]”hŒàWhen the real object is not yet tracked by debugobjects debugobjects allocates a tracker object for the real object and sets the tracker object state to ODEBUG_STATE_INIT. It verifies that the object is on the callers stack.”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kihj·h²hubhì)�”}”(hŒÁAn object which is on the stack must be removed from the tracker by calling debug_object_free() before the function which allocates the object returns. Otherwise we keep track of stale objects.”h]”hŒÁAn object which is on the stack must be removed from the tracker by calling debug_object_free() before the function which allocates the object returns. Otherwise we keep track of stale objects.”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Knhj·h²hubjÉ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÕŒ"debug_object_activate (C function)”Œc.debug_object_activate”hNt”auh1jÈhj·h²hh³Nh´NubjÚ)�”}”(hhh]”(jß)�”}”(hŒKint debug_object_activate (void *addr, const struct debug_obj_descr *descr)”h]”jå)�”}”(hŒJint debug_object_activate(void *addr, const struct debug_obj_descr *descr)”h]”(jë)�”}”(hŒint”h]”hŒint”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhjmh²hh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:114: ./lib/debugobjects.c”h´MVubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjmh²hh³jh´MVubj)�”}”(hŒdebug_object_activate”h]”j)�”}”(hŒdebug_object_activate”h]”hŒdebug_object_activate”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjŽubah}”(h]”h ]”(j'j(eh"]”h$]”h&]”j,j-uh1j hjmh²hh³jh´MVubj/)�”}”(hŒ1(void *addr, const struct debug_obj_descr *descr)”h]”(j5)�”}”(hŒ void *addr”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhjªubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjªubjW)�”}”(hjZh]”hŒ*”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjªubj)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjªubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hj¦ubj5)�”}”(hŒ#const struct debug_obj_descr *descr”h]”(j�)�”}”(hj„h]”hŒconst”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hjìubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjìubj�)�”}”(hj¡h]”hŒstruct”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hjìubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjìubh)�”}”(hhh]”j)�”}”(hŒdebug_obj_descr”h]”hŒdebug_obj_descr”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj&ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jÓŒreftype”jÕŒ reftarget”j+Œmodname”NŒ classname”NjÙjÜ)�”}”jß]”jâ)�”}”jÕj”sbŒc.debug_object_activate”†”asbuh1hhjìubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjìubjW)�”}”(hjZh]”hŒ*”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjìubj)�”}”(hŒdescr”h]”hŒdescr”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjìubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hj¦ubeh}”(h]”h ]”h"]”h$]”h&]”j,j-uh1j.hjmh²hh³jh´MVubeh}”(h]”h ]”h"]”h$]”h&]”j,j-j#ˆuh1jäj$j%hjih²hh³jh´MVubah}”(h]”jdah ]”(j)j*eh"]”h$]”h&]”j.ˆj/)j0huh1jÞh³jh´MVhjfh²hubj2)�”}”(hhh]”hì)�”}”(hŒ(debug checks when an object is activated”h]”hŒ(debug checks when an object is activated”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:114: ./lib/debugobjects.c”h´MVhj‹h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjfh²hh³jh´MVubeh}”(h]”h ]”(jÓŒfunction”eh"]”h$]”h&]”jRjÓjSj¦jTj¦jU‰jV‰jW‰uh1jÙh²hhj·h³Nh´NubjY)�”}”(hŒÎ**Parameters** ``void *addr`` address of the object ``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure Returns 0 for success, -EINVAL for check failed.”h]”(hì)�”}”(hŒ**Parameters**”h]”jc)�”}”(hj°h]”hŒ Parameters”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj®ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:114: ./lib/debugobjects.c”h´MZhjªubjy)�”}”(hhh]”(j~)�”}”(hŒ%``void *addr`` address of the object ”h]”(j„)�”}”(hŒ``void *addr``”h]”jŠ)�”}”(hjÏh]”hŒ void *addr”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:114: ./lib/debugobjects.c”h´MWhjÉubj )�”}”(hhh]”hì)�”}”(hŒaddress of the object”h]”hŒaddress of the object”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jäh´MWhjåubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjÉubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jäh´MWhjÆubj~)�”}”(hŒ’``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure Returns 0 for success, -EINVAL for check failed.”h]”(j„)�”}”(hŒ'``const struct debug_obj_descr *descr``”h]”jŠ)�”}”(hj h]”hŒ#const struct debug_obj_descr *descr”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:114: ./lib/debugobjects.c”h´MXhj ubj )�”}”(hhh]”hì)�”}”(hŒjpointer to an object specific debug description structure Returns 0 for success, -EINVAL for check failed.”h]”hŒjpointer to an object specific debug description structure Returns 0 for success, -EINVAL for check failed.”…”�”}”(hj! h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j h´MXhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j h´MXhjÆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jxhjªubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jXhj·h²hh³Nh´Nubhì)�”}”(hŒTThis function is called whenever the activation function of a real object is called.”h]”hŒTThis function is called whenever the activation function of a real object is called.”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kuhj·h²hubhì)�”}”(hXëWhen the real object is already tracked by debugobjects it is checked, whether the object can be activated. Activating is not allowed for active and destroyed objects. When debugobjects detects an error, then it calls the fixup_activate function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real activation of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”h]”hXëWhen the real object is already tracked by debugobjects it is checked, whether the object can be activated. Activating is not allowed for active and destroyed objects. When debugobjects detects an error, then it calls the fixup_activate function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real activation of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”…”�”}”(hjV h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kxhj·h²hubhì)�”}”(hXcWhen the real object is not yet tracked by debugobjects then the fixup_activate function is called if available. This is necessary to allow the legitimate activation of statically allocated and initialized objects. The fixup function checks whether the object is valid and calls the debug_objects_init() function to initialize the tracking of this object.”h]”hXcWhen the real object is not yet tracked by debugobjects then the fixup_activate function is called if available. This is necessary to allow the legitimate activation of statically allocated and initialized objects. The fixup function checks whether the object is valid and calls the debug_objects_init() function to initialize the tracking of this object.”…”�”}”(hjd h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K€hj·h²hubhì)�”}”(hŒqWhen the activation is legitimate, then the state of the associated tracker object is set to ODEBUG_STATE_ACTIVE.”h]”hŒqWhen the activation is legitimate, then the state of the associated tracker object is set to ODEBUG_STATE_ACTIVE.”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K‡hj·h²hubjÉ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÕŒ$debug_object_deactivate (C function)”Œc.debug_object_deactivate”hNt”auh1jÈhj·h²hh³Nh´NubjÚ)�”}”(hhh]”(jß)�”}”(hŒNvoid debug_object_deactivate (void *addr, const struct debug_obj_descr *descr)”h]”jå)�”}”(hŒMvoid debug_object_deactivate(void *addr, const struct debug_obj_descr *descr)”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj™ h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhj• h²hh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:139: ./lib/debugobjects.c”h´M˜ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¨ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj• h²hh³j§ h´M˜ubj)�”}”(hŒdebug_object_deactivate”h]”j)�”}”(hŒdebug_object_deactivate”h]”hŒdebug_object_deactivate”…”�”}”(hjº h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj¶ ubah}”(h]”h ]”(j'j(eh"]”h$]”h&]”j,j-uh1j hj• h²hh³j§ h´M˜ubj/)�”}”(hŒ1(void *addr, const struct debug_obj_descr *descr)”h]”(j5)�”}”(hŒ void *addr”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÖ h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhjÒ ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjä h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjÒ ubjW)�”}”(hjZh]”hŒ*”…”�”}”(hjò h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjÒ ubj)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hjÿ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjÒ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hjÎ ubj5)�”}”(hŒ#const struct debug_obj_descr *descr”h]”(j�)�”}”(hj„h]”hŒconst”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hj ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj% h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj ubj�)�”}”(hj¡h]”hŒstruct”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”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Œdebug_obj_descr”h]”hŒdebug_obj_descr”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjN ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jÓŒreftype”jÕŒ reftarget”jS Œmodname”NŒ classname”NjÙjÜ)�”}”jß]”jâ)�”}”jÕj¼ sbŒc.debug_object_deactivate”†”asbuh1hhj ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj ubjW)�”}”(hjZh]”hŒ*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhj ubj)�”}”(hŒdescr”h]”hŒdescr”…”�”}”(hjŒ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hjÎ ubeh}”(h]”h ]”h"]”h$]”h&]”j,j-uh1j.hj• h²hh³j§ h´M˜ubeh}”(h]”h ]”h"]”h$]”h&]”j,j-j#ˆuh1jäj$j%hj‘ h²hh³j§ h´M˜ubah}”(h]”jŒ ah ]”(j)j*eh"]”h$]”h&]”j.ˆj/)j0huh1jÞh³j§ h´M˜hjŽ h²hubj2)�”}”(hhh]”hì)�”}”(hŒ*debug checks when an object is deactivated”h]”hŒ*debug checks when an object is deactivated”…”�”}”(hj¶ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:139: ./lib/debugobjects.c”h´M˜hj³ h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjŽ h²hh³j§ h´M˜ubeh}”(h]”h ]”(jÓŒfunction”eh"]”h$]”h&]”jRjÓjSjÎ jTjÎ jU‰jV‰jW‰uh1jÙh²hhj·h³Nh´NubjY)�”}”(hŒ›**Parameters** ``void *addr`` address of the object ``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(hì)�”}”(hŒ**Parameters**”h]”jc)�”}”(hjØ h]”hŒ Parameters”…”�”}”(hjÚ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjÖ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:139: ./lib/debugobjects.c”h´MœhjÒ ubjy)�”}”(hhh]”(j~)�”}”(hŒ%``void *addr`` address of the object ”h]”(j„)�”}”(hŒ``void *addr``”h]”jŠ)�”}”(hj÷ h]”hŒ void *addr”…”�”}”(hjù h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjõ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:139: ./lib/debugobjects.c”h´M™hjñ ubj )�”}”(hhh]”hì)�”}”(hŒaddress of the object”h]”hŒaddress of the object”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j h´M™hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjñ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j h´M™hjî ubj~)�”}”(hŒa``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(j„)�”}”(hŒ'``const struct debug_obj_descr *descr``”h]”jŠ)�”}”(hj0 h]”hŒ#const struct debug_obj_descr *descr”…”�”}”(hj2 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj. ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:139: ./lib/debugobjects.c”h´M›hj* ubj )�”}”(hhh]”hì)�”}”(hŒ9pointer to an object specific debug description structure”h]”hŒ9pointer to an object specific debug description structure”…”�”}”(hjI h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:139: ./lib/debugobjects.c”h´MšhjF ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj* ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jE h´M›hjî ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jxhjÒ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jXhj·h²hh³Nh´Nubhì)�”}”(hŒVThis function is called whenever the deactivation function of a real object is called.”h]”hŒVThis function is called whenever the deactivation function of a real object is called.”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KŽhj·h²hubhì)�”}”(hŒ¥When the real object is tracked by debugobjects it is checked, whether the object can be deactivated. Deactivating is not allowed for untracked or destroyed objects.”h]”hŒ¥When the real object is tracked by debugobjects it is checked, whether the object can be deactivated. Deactivating is not allowed for untracked or destroyed objects.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K‘hj·h²hubhì)�”}”(hŒuWhen the deactivation is legitimate, then the state of the associated tracker object is set to ODEBUG_STATE_INACTIVE.”h]”hŒuWhen the deactivation is legitimate, then the state of the associated tracker object is set to ODEBUG_STATE_INACTIVE.”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K•hj·h²hubjÉ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÕŒ!debug_object_destroy (C function)”Œc.debug_object_destroy”hNt”auh1jÈhj·h²hh³Nh´NubjÚ)�”}”(hhh]”(jß)�”}”(hŒKvoid debug_object_destroy (void *addr, const struct debug_obj_descr *descr)”h]”jå)�”}”(hŒJvoid debug_object_destroy(void *addr, const struct debug_obj_descr *descr)”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj´ h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhj° h²hh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:152: ./lib/debugobjects.c”h´MÃubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj° h²hh³j h´MÃubj)�”}”(hŒdebug_object_destroy”h]”j)�”}”(hŒdebug_object_destroy”h]”hŒdebug_object_destroy”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjÑ ubah}”(h]”h ]”(j'j(eh"]”h$]”h&]”j,j-uh1j hj° h²hh³j h´MÃubj/)�”}”(hŒ1(void *addr, const struct debug_obj_descr *descr)”h]”(j5)�”}”(hŒ void *addr”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjñ h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhjí ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÿ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjí ubjW)�”}”(hjZh]”hŒ*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjí ubj)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjí ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hjé ubj5)�”}”(hŒ#const struct debug_obj_descr *descr”h]”(j�)�”}”(hj„h]”hŒconst”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hj/ ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj@ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj/ ubj�)�”}”(hj¡h]”hŒstruct”…”�”}”(hjN h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”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Œdebug_obj_descr”h]”hŒdebug_obj_descr”…”�”}”(hjl h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhji ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jÓŒreftype”jÕŒ reftarget”jn Œmodname”NŒ classname”NjÙjÜ)�”}”jß]”jâ)�”}”jÕj× sbŒc.debug_object_destroy”†”asbuh1hhj/ ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjŒ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj/ ubjW)�”}”(hjZh]”hŒ*”…”�”}”(hjš h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhj/ ubj)�”}”(hŒdescr”h]”hŒdescr”…”�”}”(hj§ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj/ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hjé ubeh}”(h]”h ]”h"]”h$]”h&]”j,j-uh1j.hj° h²hh³j h´MÃubeh}”(h]”h ]”h"]”h$]”h&]”j,j-j#ˆuh1jäj$j%hj¬ h²hh³j h´MÃubah}”(h]”j§ ah ]”(j)j*eh"]”h$]”h&]”j.ˆj/)j0huh1jÞh³j h´MÃhj© h²hubj2)�”}”(hhh]”hì)�”}”(hŒ(debug checks when an object is destroyed”h]”hŒ(debug checks when an object is destroyed”…”�”}”(hjÑ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:152: ./lib/debugobjects.c”h´MÃhjÎ h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj© h²hh³j h´MÃubeh}”(h]”h ]”(jÓŒfunction”eh"]”h$]”h&]”jRjÓjSjé jTjé jU‰jV‰jW‰uh1jÙh²hhj·h³Nh´NubjY)�”}”(hŒ›**Parameters** ``void *addr`` address of the object ``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(hì)�”}”(hŒ**Parameters**”h]”jc)�”}”(hjó h]”hŒ Parameters”…”�”}”(hjõ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjñ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:152: ./lib/debugobjects.c”h´MÇhjí ubjy)�”}”(hhh]”(j~)�”}”(hŒ%``void *addr`` address of the object ”h]”(j„)�”}”(hŒ``void *addr``”h]”jŠ)�”}”(hj h]”hŒ void *addr”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:152: ./lib/debugobjects.c”h´MÄhj ubj )�”}”(hhh]”hì)�”}”(hŒaddress of the object”h]”hŒaddress of the object”…”�”}”(hj+ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j' h´MÄhj( ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j' h´MÄhj ubj~)�”}”(hŒa``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(j„)�”}”(hŒ'``const struct debug_obj_descr *descr``”h]”jŠ)�”}”(hjK h]”hŒ#const struct debug_obj_descr *descr”…”�”}”(hjM h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjI ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:152: ./lib/debugobjects.c”h´MÆhjE ubj )�”}”(hhh]”hì)�”}”(hŒ9pointer to an object specific debug description structure”h]”hŒ9pointer to an object specific debug description structure”…”�”}”(hjd h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:152: ./lib/debugobjects.c”h´MÅhja ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjE ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j` h´MÆhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jxhjí ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jXhj·h²hh³Nh´Nubhì)�”}”(hŒ×This function is called to mark an object destroyed. This is useful to prevent the usage of invalid objects, which are still available in memory: either statically allocated objects or objects which are freed later.”h]”hŒ×This function is called to mark an object destroyed. This is useful to prevent the usage of invalid objects, which are still available in memory: either statically allocated objects or objects which are freed later.”…”�”}”(hjŒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K›hj·h²hubhì)�”}”(hXäWhen the real object is tracked by debugobjects it is checked, whether the object can be destroyed. Destruction is not allowed for active and destroyed objects. When debugobjects detects an error, then it calls the fixup_destroy function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real destruction of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”h]”hXäWhen the real object is tracked by debugobjects it is checked, whether the object can be destroyed. Destruction is not allowed for active and destroyed objects. When debugobjects detects an error, then it calls the fixup_destroy function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real destruction of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”…”�”}”(hjš h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K hj·h²hubhì)�”}”(hŒuWhen the destruction is legitimate, then the state of the associated tracker object is set to ODEBUG_STATE_DESTROYED.”h]”hŒuWhen the destruction is legitimate, then the state of the associated tracker object is set to ODEBUG_STATE_DESTROYED.”…”�”}”(hj¨ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¨hj·h²hubjÉ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÕŒdebug_object_free (C function)”Œc.debug_object_free”hNt”auh1jÈhj·h²hh³Nh´NubjÚ)�”}”(hhh]”(jß)�”}”(hŒHvoid debug_object_free (void *addr, const struct debug_obj_descr *descr)”h]”jå)�”}”(hŒGvoid debug_object_free(void *addr, const struct debug_obj_descr *descr)”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÏ h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhjË h²hh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:171: ./lib/debugobjects.c”h´Mòubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÞ h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjË h²hh³jÝ h´Mòubj)�”}”(hŒdebug_object_free”h]”j)�”}”(hŒdebug_object_free”h]”hŒdebug_object_free”…”�”}”(hjð h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjì ubah}”(h]”h ]”(j'j(eh"]”h$]”h&]”j,j-uh1j hjË h²hh³jÝ h´Mòubj/)�”}”(hŒ1(void *addr, const struct debug_obj_descr *descr)”h]”(j5)�”}”(hŒ void *addr”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhjubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjubjW)�”}”(hjZh]”hŒ*”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjubj)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hjubj5)�”}”(hŒ#const struct debug_obj_descr *descr”h]”(j�)�”}”(hj„h]”hŒconst”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hjJubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjJubj�)�”}”(hj¡h]”hŒstruct”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hjJubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjJubh)�”}”(hhh]”j)�”}”(hŒdebug_obj_descr”h]”hŒdebug_obj_descr”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj„ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jÓŒreftype”jÕŒ reftarget”j‰Œmodname”NŒ classname”NjÙjÜ)�”}”jß]”jâ)�”}”jÕjò sbŒc.debug_object_free”†”asbuh1hhjJubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjJubjW)�”}”(hjZh]”hŒ*”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjJubj)�”}”(hŒdescr”h]”hŒdescr”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjJubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hjubeh}”(h]”h ]”h"]”h$]”h&]”j,j-uh1j.hjË h²hh³jÝ h´Mòubeh}”(h]”h ]”h"]”h$]”h&]”j,j-j#ˆuh1jäj$j%hjÇ h²hh³jÝ h´Mòubah}”(h]”j ah ]”(j)j*eh"]”h$]”h&]”j.ˆj/)j0huh1jÞh³jÝ h´MòhjÄ h²hubj2)�”}”(hhh]”hì)�”}”(hŒ$debug checks when an object is freed”h]”hŒ$debug checks when an object is freed”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:171: ./lib/debugobjects.c”h´Mòhjéh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjÄ h²hh³jÝ h´Mòubeh}”(h]”h ]”(jÓŒfunction”eh"]”h$]”h&]”jRjÓjSjjTjjU‰jV‰jW‰uh1jÙh²hhj·h³Nh´NubjY)�”}”(hŒ›**Parameters** ``void *addr`` address of the object ``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(hì)�”}”(hŒ**Parameters**”h]”jc)�”}”(hjh]”hŒ Parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:171: ./lib/debugobjects.c”h´Möhjubjy)�”}”(hhh]”(j~)�”}”(hŒ%``void *addr`` address of the object ”h]”(j„)�”}”(hŒ``void *addr``”h]”jŠ)�”}”(hj-h]”hŒ void *addr”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:171: ./lib/debugobjects.c”h´Móhj'ubj )�”}”(hhh]”hì)�”}”(hŒaddress of the object”h]”hŒaddress of the object”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jBh´MóhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jBh´Móhj$ubj~)�”}”(hŒa``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(j„)�”}”(hŒ'``const struct debug_obj_descr *descr``”h]”jŠ)�”}”(hjfh]”hŒ#const struct debug_obj_descr *descr”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjdubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:171: ./lib/debugobjects.c”h´Mõhj`ubj )�”}”(hhh]”hì)�”}”(hŒ9pointer to an object specific debug description structure”h]”hŒ9pointer to an object specific debug description structure”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:171: ./lib/debugobjects.c”h´Môhj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j{h´Mõhj$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jxhjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jXhj·h²hh³Nh´Nubhì)�”}”(hŒ2This function is called before an object is freed.”h]”hŒ2This function is called before an object is freed.”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K®hj·h²hubhì)�”}”(hXÁWhen the real object is tracked by debugobjects it is checked, whether the object can be freed. Free is not allowed for active objects. When debugobjects detects an error, then it calls the fixup_free function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real free of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”h]”hXÁWhen the real object is tracked by debugobjects it is checked, whether the object can be freed. Free is not allowed for active objects. When debugobjects detects an error, then it calls the fixup_free function of the object type description structure if provided by the caller. The fixup function can correct the problem before the real free of the object happens. E.g. it can deactivate an active object in order to prevent damage to the subsystem.”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K°hj·h²hubhì)�”}”(hŒ�Note that debug_object_free removes the object from the tracker. Later usage of the object is detected by the other debug checks.”h]”hŒ�Note that debug_object_free removes the object from the tracker. Later usage of the object is detected by the other debug checks.”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¸hj·h²hubjÉ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÕŒ%debug_object_assert_init (C function)”Œc.debug_object_assert_init”hNt”auh1jÈhj·h²hh³Nh´NubjÚ)�”}”(hhh]”(jß)�”}”(hŒOvoid debug_object_assert_init (void *addr, const struct debug_obj_descr *descr)”h]”jå)�”}”(hŒNvoid debug_object_assert_init(void *addr, const struct debug_obj_descr *descr)”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhjæh²hh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:188: ./lib/debugobjects.c”h´Mubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjæh²hh³jøh´Mubj)�”}”(hŒdebug_object_assert_init”h]”j)�”}”(hŒdebug_object_assert_init”h]”hŒdebug_object_assert_init”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjubah}”(h]”h ]”(j'j(eh"]”h$]”h&]”j,j-uh1j hjæh²hh³jøh´Mubj/)�”}”(hŒ1(void *addr, const struct debug_obj_descr *descr)”h]”(j5)�”}”(hŒ void *addr”h]”(jë)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”j÷ah"]”h$]”h&]”uh1jêhj#ubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj#ubjW)�”}”(hjZh]”hŒ*”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhj#ubj)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj#ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hjubj5)�”}”(hŒ#const struct debug_obj_descr *descr”h]”(j�)�”}”(hj„h]”hŒconst”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hjeubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjeubj�)�”}”(hj¡h]”hŒstruct”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hjeubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjeubh)�”}”(hhh]”j)�”}”(hŒdebug_obj_descr”h]”hŒdebug_obj_descr”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjŸubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jÓŒreftype”jÕŒ reftarget”j¤Œmodname”NŒ classname”NjÙjÜ)�”}”jß]”jâ)�”}”jÕj sbŒc.debug_object_assert_init”†”asbuh1hhjeubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühjeubjW)�”}”(hjZh]”hŒ*”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjeubj)�”}”(hŒdescr”h]”hŒdescr”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjeubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj,j-uh1j4hjubeh}”(h]”h ]”h"]”h$]”h&]”j,j-uh1j.hjæh²hh³jøh´Mubeh}”(h]”h ]”h"]”h$]”h&]”j,j-j#ˆuh1jäj$j%hjâh²hh³jøh´Mubah}”(h]”jÝah ]”(j)j*eh"]”h$]”h&]”j.ˆj/)j0huh1jÞh³jøh´Mhjßh²hubj2)�”}”(hhh]”hì)�”}”(hŒ*debug checks when object should be init-ed”h]”hŒ*debug checks when object should be init-ed”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:188: ./lib/debugobjects.c”h´Mhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hjßh²hh³jøh´Mubeh}”(h]”h ]”(jÓŒfunction”eh"]”h$]”h&]”jRjÓjSjjTjjU‰jV‰jW‰uh1jÙh²hhj·h³Nh´NubjY)�”}”(hŒ›**Parameters** ``void *addr`` address of the object ``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(hì)�”}”(hŒ**Parameters**”h]”jc)�”}”(hj)h]”hŒ Parameters”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:188: ./lib/debugobjects.c”h´M hj#ubjy)�”}”(hhh]”(j~)�”}”(hŒ%``void *addr`` address of the object ”h]”(j„)�”}”(hŒ``void *addr``”h]”jŠ)�”}”(hjHh]”hŒ void *addr”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjFubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:188: ./lib/debugobjects.c”h´MhjBubj )�”}”(hhh]”hì)�”}”(hŒaddress of the object”h]”hŒaddress of the object”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j]h´Mhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjBubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j]h´Mhj?ubj~)�”}”(hŒa``const struct debug_obj_descr *descr`` pointer to an object specific debug description structure”h]”(j„)�”}”(hŒ'``const struct debug_obj_descr *descr``”h]”jŠ)�”}”(hj�h]”hŒ#const struct debug_obj_descr *descr”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:188: ./lib/debugobjects.c”h´Mhj{ubj )�”}”(hhh]”hì)�”}”(hŒ9pointer to an object specific debug description structure”h]”hŒ9pointer to an object specific debug description structure”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒZ/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:188: ./lib/debugobjects.c”h´Mhj—ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j–h´Mhj?ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jxhj#ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jXhj·h²hh³Nh´Nubhì)�”}”(hŒFThis function is called to assert that an object has been initialized.”h]”hŒFThis function is called to assert that an object has been initialized.”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¿hj·h²hubhì)�”}”(hX9When the real object is not tracked by debugobjects, it calls fixup_assert_init of the object type description structure provided by the caller, with the hardcoded object state ODEBUG_NOT_AVAILABLE. The fixup function can correct the problem by calling debug_object_init and other specific initializing functions.”h]”hX9When the real object is not tracked by debugobjects, it calls fixup_assert_init of the object type description structure provided by the caller, with the hardcoded object state ODEBUG_NOT_AVAILABLE. The fixup function can correct the problem by calling debug_object_init and other specific initializing functions.”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÁhj·h²hubhì)�”}”(hŒFWhen the real object is already tracked by debugobjects it is ignored.”h]”hŒFWhen the real object is already tracked by debugobjects it is ignored.”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÇhj·h²hubeh}”(h]”Œdebug-functions”ah ]”h"]”Œdebug functions”ah$]”h&]”uh1hµhh·h²hh³hÊh´KAubh¶)�”}”(hhh]”(h»)�”}”(hŒFixup functions”h]”hŒFixup functions”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjôh²hh³hÊh´KÊubh¶)�”}”(hhh]”(h»)�”}”(hŒ'Debug object type description structure”h]”hŒ'Debug object type description structure”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KÍubjÉ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÕŒdebug_obj (C struct)”Œ c.debug_obj”hNt”auh1jÈhjh²hh³Nh´NubjÚ)�”}”(hhh]”(jß)�”}”(hŒ debug_obj”h]”jå)�”}”(hŒstruct debug_obj”h]”(j�)�”}”(hj¡h]”hŒstruct”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hj+h²hh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´Kubjý)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jühj+h²hh³j<h´Kubj)�”}”(hŒ debug_obj”h]”j)�”}”(hj)h]”hŒ debug_obj”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhjKubah}”(h]”h ]”(j'j(eh"]”h$]”h&]”j,j-uh1j hj+h²hh³j<h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j,j-j#ˆuh1jäj$j%hj'h²hh³j<h´Kubah}”(h]”j"ah ]”(j)j*eh"]”h$]”h&]”j.ˆj/)j0huh1jÞh³j<h´Khj$h²hubj2)�”}”(hhh]”hì)�”}”(hŒ#representation of an tracked object”h]”hŒ#representation of an tracked object”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´Khjnh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj$h²hh³j<h´Kubeh}”(h]”h ]”(jÓŒstruct”eh"]”h$]”h&]”jRjÓjSj‰jTj‰jU‰jV‰jW‰uh1jÙh²hhjh³Nh´NubjY)�”}”(hXŸ**Definition**:: struct debug_obj { struct hlist_node node; enum debug_obj_state state; unsigned int astate; union { void *object; struct hlist_node *batch_last; }; const struct debug_obj_descr *descr; }; **Members** ``node`` hlist node to link the object into the tracker list ``state`` tracked object state ``astate`` current active state ``{unnamed_union}`` anonymous ``object`` pointer to the real object ``batch_last`` pointer to the last hlist node in a batch ``descr`` pointer to an object type specific debug description structure”h]”(hì)�”}”(hŒ**Definition**::”h]”(jc)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj‘ubhŒ:”…”�”}”(hj‘h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´Khj�ubhŒ literal_block”“”)�”}”(hXstruct debug_obj { struct hlist_node node; enum debug_obj_state state; unsigned int astate; union { void *object; struct hlist_node *batch_last; }; const struct debug_obj_descr *descr; };”h]”hXstruct debug_obj { struct hlist_node node; enum debug_obj_state state; unsigned int astate; union { void *object; struct hlist_node *batch_last; }; const struct debug_obj_descr *descr; };”…”�”}”hj°sbah}”(h]”h ]”h"]”h$]”h&]”j,j-uh1j®h³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´Khj�ubhì)�”}”(hŒ **Members**”•Auh]”jc)�”}”(hjÁh]”hŒMembers”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K&hj�ubjy)�”}”(hhh]”(j~)�”}”(hŒ=``node`` hlist node to link the object into the tracker list ”h]”(j„)�”}”(hŒ``node``”h]”jŠ)�”}”(hjàh]”hŒnode”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´KhjÚubj )�”}”(hhh]”hì)�”}”(hŒ3hlist node to link the object into the tracker list”h]”hŒ3hlist node to link the object into the tracker list”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jõh´Khjöubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjÚubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jõh´Khj×ubj~)�”}”(hŒ``state`` tracked object state ”h]”(j„)�”}”(hŒ ``state``”h]”jŠ)�”}”(hjh]”hŒstate”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´Khjubj )�”}”(hhh]”hì)�”}”(hŒtracked object state”h]”hŒtracked object state”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j.h´Khj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j.h´Khj×ubj~)�”}”(hŒ ``astate`` current active state ”h]”(j„)�”}”(hŒ ``astate``”h]”jŠ)�”}”(hjRh]”hŒastate”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjPubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´KhjLubj )�”}”(hhh]”hì)�”}”(hŒcurrent active state”h]”hŒcurrent active state”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jgh´Khjhubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjLubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jgh´Khj×ubj~)�”}”(hŒ``{unnamed_union}`` anonymous ”h]”(j„)�”}”(hŒ``{unnamed_union}``”h]”jŠ)�”}”(hj‹h]”hŒ{unnamed_union}”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´Khj…ubj )�”}”(hhh]”hì)�”}”(hŒ anonymous”h]”hŒ anonymous”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j h´Khj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj…ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j h´Khj×ubj~)�”}”(hŒ&``object`` pointer to the real object ”h]”(j„)�”}”(hŒ ``object``”h]”jŠ)�”}”(hjÄh]”hŒobject”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´Khj¾ubj )�”}”(hhh]”hì)�”}”(hŒpointer to the real object”h]”hŒpointer to the real object”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÙh´KhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jÙh´Khj×ubj~)�”}”(hŒ9``batch_last`` pointer to the last hlist node in a batch ”h]”(j„)�”}”(hŒ``batch_last``”h]”jŠ)�”}”(hjýh]”hŒ batch_last”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjûubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´Khj÷ubj )�”}”(hhh]”hì)�”}”(hŒ)pointer to the last hlist node in a batch”h]”hŒ)pointer to the last hlist node in a batch”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jh´Khj×ubj~)�”}”(hŒH``descr`` pointer to an object type specific debug description structure”h]”(j„)�”}”(hŒ ``descr``”h]”jŠ)�”}”(hj6h]”hŒdescr”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´Khj0ubj )�”}”(hhh]”hì)�”}”(hŒ>pointer to an object type specific debug description structure”h]”hŒ>pointer to an object type specific debug description structure”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´KhjLubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jKh´Khj×ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jxhj�ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jXhjh²hh³Nh´NubjÉ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÕŒdebug_obj_descr (C struct)”Œc.debug_obj_descr”hNt”auh1jÈhjh²hh³Nh´NubjÚ)�”}”(hhh]”(jß)�”}”(hŒdebug_obj_descr”h]”jå)�”}”(hŒstruct debug_obj_descr”h]”(j�)�”}”(hj¡h]”hŒstruct”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1j€hjŒh²hh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.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"ubj)�”}”(hŒdebug_obj_descr”h]”j)�”}”(hjŠh]”hŒdebug_obj_descr”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1jhj¬ubah}”(h]”h ]”(j'j(eh"]”h$]”h&]”j,j-uh1j hjŒh²hh³j�h´K"ubeh}”(h]”h ]”h"]”h$]”h&]”j,j-j#ˆuh1jäj$j%hjˆh²hh³j�h´K"ubah}”(h]”jƒah ]”(j)j*eh"]”h$]”h&]”j.ˆj/)j0huh1jÞh³j�h´K"hj…h²hubj2)�”}”(hhh]”hì)�”}”(hŒ0object type specific debug description structure”h]”hŒ0object type specific debug description structure”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K)hjÏh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj…h²hh³j�h´K"ubeh}”(h]”h ]”(jÓŒstruct”eh"]”h$]”h&]”jRjÓjSjêjTjêjU‰jV‰jW‰uh1jÙh²hhjh³Nh´NubjY)�”}”(hXð**Definition**:: struct debug_obj_descr { const char *name; void *(*debug_hint)(void *addr); bool (*is_static_object)(void *addr); bool (*fixup_init)(void *addr, enum debug_obj_state state); bool (*fixup_activate)(void *addr, enum debug_obj_state state); bool (*fixup_destroy)(void *addr, enum debug_obj_state state); bool (*fixup_free)(void *addr, enum debug_obj_state state); bool (*fixup_assert_init)(void *addr, enum debug_obj_state state); }; **Members** ``name`` name of the object typee ``debug_hint`` function returning address, which have associated kernel symbol, to allow identify the object ``is_static_object`` return true if the obj is static, otherwise return false ``fixup_init`` fixup function, which is called when the init check fails. All fixup functions must return true if fixup was successful, otherwise return false ``fixup_activate`` fixup function, which is called when the activate check fails ``fixup_destroy`` fixup function, which is called when the destroy check fails ``fixup_free`` fixup function, which is called when the free check fails ``fixup_assert_init`` fixup function, which is called when the assert_init check fails”h]”(hì)�”}”(hŒ**Definition**::”h]”(jc)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjòubhŒ:”…”�”}”(hjòh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K-hjîubj¯)�”}”(hXÛstruct debug_obj_descr { const char *name; void *(*debug_hint)(void *addr); bool (*is_static_object)(void *addr); bool (*fixup_init)(void *addr, enum debug_obj_state state); bool (*fixup_activate)(void *addr, enum debug_obj_state state); bool (*fixup_destroy)(void *addr, enum debug_obj_state state); bool (*fixup_free)(void *addr, enum debug_obj_state state); bool (*fixup_assert_init)(void *addr, enum debug_obj_state state); };”h]”hXÛstruct debug_obj_descr { const char *name; void *(*debug_hint)(void *addr); bool (*is_static_object)(void *addr); bool (*fixup_init)(void *addr, enum debug_obj_state state); bool (*fixup_activate)(void *addr, enum debug_obj_state state); bool (*fixup_destroy)(void *addr, enum debug_obj_state state); bool (*fixup_free)(void *addr, enum debug_obj_state state); bool (*fixup_assert_init)(void *addr, enum debug_obj_state state); };”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j,j-uh1j®h³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K/hjîubhì)�”}”(hŒ **Members**”h]”jc)�”}”(hj h]”hŒMembers”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jbhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K:hjîubjy)�”}”(hhh]”(j~)�”}”(hŒ"``name`` name of the object typee ”h]”(j„)�”}”(hŒ``name``”h]”jŠ)�”}”(hj?h]”hŒname”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K,hj9ubj )�”}”(hhh]”hì)�”}”(hŒname of the object typee”h]”hŒname of the object typee”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jTh´K,hjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jTh´K,hj6ubj~)�”}”(hŒm``debug_hint`` function returning address, which have associated kernel symbol, to allow identify the object ”h]”(j„)�”}”(hŒ``debug_hint``”h]”jŠ)�”}”(hjxh]”hŒ debug_hint”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjvubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K.hjrubj )�”}”(hhh]”hì)�”}”(hŒ]function returning address, which have associated kernel symbol, to allow identify the object”h]”hŒ]function returning address, which have associated kernel symbol, to allow identify the object”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K-hjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjrubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j�h´K.hj6ubj~)�”}”(hŒN``is_static_object`` return true if the obj is static, otherwise return false ”h]”(j„)�”}”(hŒ``is_static_object``”h]”jŠ)�”}”(hj²h]”hŒis_static_object”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K/hj¬ubj )�”}”(hhh]”hì)�”}”(hŒ8return true if the obj is static, otherwise return false”h]”hŒ8return true if the obj is static, otherwise return false”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÇh´K/hjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhj¬ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jÇh´K/hj6ubj~)�”}”(hŒŸ``fixup_init`` fixup function, which is called when the init check fails. All fixup functions must return true if fixup was successful, otherwise return false ”h]”(j„)�”}”(hŒ``fixup_init``”h]”jŠ)�”}”(hjëh]”hŒ fixup_init”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hjéubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K2hjåubj )�”}”(hhh]”hì)�”}”(hŒ�fixup function, which is called when the init check fails. All fixup functions must return true if fixup was successful, otherwise return false”h]”hŒ�fixup function, which is called when the init check fails. All fixup functions must return true if fixup was successful, otherwise return false”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K0hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjåubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³jh´K2hj6ubj~)�”}”(hŒQ``fixup_activate`` fixup function, which is called when the activate check fails ”h]”(j„)�”}”(hŒ``fixup_activate``”h]”jŠ)�”}”(hj%h]”hŒfixup_activate”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K4hjubj )�”}”(hhh]”hì)�”}”(hŒ=fixup function, which is called when the activate check fails”h]”hŒ=fixup function, which is called when the activate check fails”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K3hj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŸhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j}h³j:h´K4hj6ubj~)�”}”(hŒO``fixup_destroy`` fixup function, which is called when the destroy check fails ”h]”(j„)�”}”(hŒ``fixup_destroy``”h]”jŠ)�”}”(hj_h]”hŒ fixup_destroy”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j‰hj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒh³Œd/var/lib/git/docbuild/linux/Documentation/core-api/debug-objects:207: ./include/linux/debugobjects.h”h´K6hjYubj )�”}”(hhh]”hì)�”}”(hŒ