€•YŒ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”ŒH/translations/zh_CN/process/debugging/driver_development_debugging_guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒH/translations/zh_TW/process/debugging/driver_development_debugging_guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒH/translations/it_IT/process/debugging/driver_development_debugging_guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒH/translations/ja_JP/process/debugging/driver_development_debugging_guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒH/translations/ko_KR/process/debugging/driver_development_debugging_guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒH/translations/pt_BR/process/debugging/driver_development_debugging_guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒH/translations/sp_SP/process/debugging/driver_development_debugging_guide”Œ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³Œb/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ'Debugging advice for driver development”h]”hŒ'Debugging advice for driver development”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œid1”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hXÔThis document serves as a general starting point and lookup for debugging device drivers. While this guide focuses on debugging that requires re-compiling the module/kernel, the :doc:`userspace debugging guide ` will guide you through tools like dynamic debug, ftrace and other tools useful for debugging issues and behavior. For general debugging advice, see the :doc:`general advice document `.”h]”(hŒ²This document serves as a general starting point and lookup for debugging device drivers. While this guide focuses on debugging that requires re-compiling the module/kernel, the ”…”�”}”(hháh²hh³Nh´Nubh)�”}”(hŒO:doc:`userspace debugging guide `”h]”hŒinline”“”)�”}”(hhëh]”hŒuserspace debugging guide”…”�”}”(hhïh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-doc”eh"]”h$]”h&]”uh1híhhéubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ4process/debugging/driver_development_debugging_guide”Œ refdomain”húŒreftype”Œdoc”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œ,/process/debugging/userspace_debugging_guide”uh1hh³hÇh´KhháubhŒ™ will guide you through tools like dynamic debug, ftrace and other tools useful for debugging issues and behavior. For general debugging advice, see the ”…”�”}”(hháh²hh³Nh´Nubh)�”}”(hŒ9:doc:`general advice document `”h]”hî)�”}”(hjh]”hŒgeneral advice document”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-doc”eh"]”h$]”h&]”uh1híhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”j Œreftype”Œdoc”Œ refexplicit”ˆŒrefwarn”ˆj Œ/process/debugging/index”uh1hh³hÇh´KhháubhŒ.”…”�”}”(hháh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KhhÊh²hubhŒtopic”“”)�”}”(hŒ Contents ”h]”(hÎ)�”}”(hŒContents”h]”hŒContents”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj>h³hÇh´KubhŒ bullet_list”“”)�”}”(hhh]”hŒ list_item”“”)�”}”(hhh]”(hà)�”}”(hhh]”hŒ reference”“”)�”}”(hhh]”hŒ'Debugging advice for driver development”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”hÞah ]”h"]”h$]”h&]”Œrefid”Œ'debugging-advice-for-driver-development”uh1j]hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjWubjQ)�”}”(hhh]”(jV)�”}”(hhh]”(hà)�”}”(hhh]”j^)�”}”(hhh]”hŒprintk() & friends”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”Œid2”ah ]”h"]”h$]”h&]”Œrefid”Œprintk-friends”uh1j]hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjwubjQ)�”}”(hhh]”(jV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒSimple printk()”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”Œid3”ah ]”h"]”h$]”h&]”Œrefid”Œ simple-printk”uh1j]hj™ubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhj“ubjV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒ Trace_printk”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”Œid4”ah ]”h"]”h$]”h&]”Œrefid”Œ trace-printk”uh1j]hj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhj¸ubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhj“ubjV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒdev_dbg”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”Œid5”ah ]”h"]”h$]”h&]”Œrefid”Œdev-dbg”uh1j]hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhj“ubjV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒ Custom printk”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid6”ah ]”h"]”h$]”h&]”Œrefid”Œ custom-printk”uh1j]hjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhj“ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jPhjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1jUhjtubjV)�”}”(hhh]”(hà)�”}”(hhh]”j^)�”}”(hhh]”hŒFtrace”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”Œid7”ah ]”h"]”h$]”h&]”Œrefid”Œftrace”uh1j]hj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhj*ubjQ)�”}”(hhh]”jV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒ#Creating a custom Ftrace tracepoint”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”Œid8”ah ]”h"]”h$]”h&]”Œrefid”Œ#creating-a-custom-ftrace-tracepoint”uh1j]hjLubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjIubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjFubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jUhjtubjV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒDebugFS”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”Œid9”ah ]”h"]”h$]”h&]”Œrefid”Œdebugfs”uh1j]hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjtubjV)�”}”(hhh]”(hà)�”}”(hhh]”j^)�”}”(hhh]”hŒ.KASAN, UBSAN, lockdep and other error checkers”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”Œid10”ah ]”h"]”h$]”h&]”Œrefid”Œ,kasan-ubsan-lockdep-and-other-error-checkers”uh1j]hjœubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhj™ubjQ)�”}”(hhh]”(jV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒ KASAN (Kernel Address Sanitizer)”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”Œid11”ah ]”h"]”h$]”h&]”Œrefid”Œkasan-kernel-address-sanitizer”uh1j]hj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhj¸ubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjµubjV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒ$UBSAN (Undefined Behavior Sanitizer)”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”Œid12”ah ]”h"]”h$]”h&]”Œrefid”Œ"ubsan-undefined-behavior-sanitizer”uh1j]hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjµubjV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒ#lockdep (Lock Dependency Validator)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid13”ah ]”h"]”h$]”h&]”Œrefid”Œ!lockdep-lock-dependency-validator”uh1j]hjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjµubjV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒ)PSI (Pressure stall information tracking)”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”Œid14”ah ]”h"]”h$]”h&]”Œrefid”Œ'psi-pressure-stall-information-tracking”uh1j]hj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjµubeh}”(h]”h ]”h"]”h$]”h&]”uh1jPhj™ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jUhjtubjV)�”}”(hhh]”(hà)�”}”(hhh]”j^)�”}”(hhh]”hŒdevice coredump”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”Œid15”ah ]”h"]”h$]”h&]”Œrefid”Œdevice-coredump”uh1j]hjOubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjLubjQ)�”}”(hhh]”jV)�”}”(hhh]”hà)�”}”(hhh]”j^)�”}”(hhh]”hŒdevcoredump interfaces”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”Œid16”ah ]”h"]”h$]”h&]”Œrefid”Œdevcoredump-interfaces”uh1j]hjnubah}”(h]”h ]”h"]”h$]”h&]”uh1hßhjkubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjhubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhjLubeh}”(h]”h ]”h"]”h$]”h&]”uh1jUhjtubeh}”(h]”h ]”h"]”h$]”h&]”uh1jPhjWubeh}”(h]”h ]”h"]”h$]”h&]”uh1jUhjRubah}”(h]”h ]”h"]”h$]”h&]”uh1jPhj>h²hh³Nh´Nubeh}”(h]”Œcontents”ah ]”Œcontents”ah"]”Œcontents”ah$]”h&]”uh1j<h³hÇh´KhhÊh²hubhà)�”}”(hŒ4The following sections show you the available tools.”h]”hŒ4The following sections show you the available tools.”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KhhÊh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒprintk() & friends”h]”hŒprintk() & friends”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝj†uh1hÍhjÂh²hh³hÇh´Kubhà)�”}”(hŒ€These are derivatives of printf() with varying destinations and support for being dynamically turned on or off, or lack thereof.”h]”hŒ€These are derivatives of printf() with varying destinations and support for being dynamically turned on or off, or lack thereof.”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KhjÂh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSimple printk()”h]”hŒSimple printk()”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝj¥uh1hÍhjáh²hh³hÇh´Kubhà)�”}”(hŒ“The classic, can be used to great effect for quick and dirty development of new modules or to extract arbitrary necessary data for troubleshooting.”h]”hŒ“The classic, can be used to great effect for quick and dirty development of new modules or to extract arbitrary necessary data for troubleshooting.”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´Khjáh²hubhà)�”}”(hŒ``”h]”(hŒPrerequisite: ”…”�”}”(hjPh²hh³Nh´Nubj )�”}”(hŒ``CONFIG_DYNAMIC_FTRACE``”h]”hŒCONFIG_DYNAMIC_FTRACE”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjPubhŒ & ”…”�”}”(hjPh²hh³Nh´Nubj )�”}”(hŒ``#include ``”h]”hŒ#include ”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjPubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K7hj?h²hubhà)�”}”(hX&It is a tiny bit less comfortable to use than printk(), because you will have to read the messages from the trace file (See: :ref:`read_ftrace_log` instead of from the kernel log, but very useful when printk() adds unwanted delays into the code execution, causing issues to be flaky or hidden.)”h]”(hŒ}It is a tiny bit less comfortable to use than printk(), because you will have to read the messages from the trace file (See: ”…”�”}”(hj~h²hh³Nh´Nubh)�”}”(hŒ:ref:`read_ftrace_log`”h]”hî)�”}”(hjˆh]”hŒread_ftrace_log”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-ref”eh"]”h$]”h&]”uh1híhj†ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”j”Œreftype”Œref”Œ refexplicit”‰Œrefwarn”ˆj Œread_ftrace_log”uh1hh³hÇh´K9hj~ubhŒ“ instead of from the kernel log, but very useful when printk() adds unwanted delays into the code execution, causing issues to be flaky or hidden.)”…”�”}”(hj~h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K9hj?h²hubhà)�”}”(hŒSIf the processing of this still causes timing issues then you can try trace_puts().”h]”hŒSIf the processing of this still causes timing issues then you can try trace_puts().”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K>hj?h²hubhà)�”}”(hŒ-For the full Documentation see trace_printk()”h]”hŒ-For the full Documentation see trace_printk()”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KAhj?h²hubeh}”(h]”jÍah ]”h"]”Œ trace_printk”ah$]”h&]”uh1hÈhjÂh²hh³hÇh´K5ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒdev_dbg”h]”hŒdev_dbg”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝjéuh1hÍhjÓh²hh³hÇh´KDubhà)�”}”(hŒ¹Print statement, which can be targeted by :ref:`process/debugging/userspace_debugging_guide:dynamic debug` that contains additional information about the device used within the context.”h]”(hŒ*Print statement, which can be targeted by ”…”�”}”(hjäh²hh³Nh´Nubh)�”}”(hŒ@:ref:`process/debugging/userspace_debugging_guide:dynamic debug`”h]”hî)�”}”(hjîh]”hŒ9process/debugging/userspace_debugging_guide:dynamic debug”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-ref”eh"]”h$]”h&]”uh1híhjìubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”júŒreftype”Œref”Œ refexplicit”‰Œrefwarn”ˆj Œ9process/debugging/userspace_debugging_guide:dynamic debug”uh1hh³hÇh´KFhjäubhŒO that contains additional information about the device used within the context.”…”�”}”(hjäh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KFhjÓh²hubhà)�”}”(hŒ>**When is it appropriate to leave a debug print in the code?**”h]”j')�”}”(hjh]”hŒ:When is it appropriate to leave a debug print in the code?”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KJhjÓh²hubhà)�”}”(hXxPermanent debug statements have to be useful for a developer to troubleshoot driver misbehavior. Judging that is a bit more of an art than a science, but some guidelines are in the :ref:`Coding style guidelines `. In almost all cases the debug statements shouldn't be upstreamed, as a working driver is supposed to be silent.”h]”(hŒµPermanent debug statements have to be useful for a developer to troubleshoot driver misbehavior. Judging that is a bit more of an art than a science, but some guidelines are in the ”…”�”}”(hj-h²hh³Nh´Nubh)�”}”(hŒR:ref:`Coding style guidelines `”h]”hî)�”}”(hj7h]”hŒCoding style guidelines”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-ref”eh"]”h$]”h&]”uh1híhj5ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jCŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆj Œ1process/coding-style:13) printing kernel messages”uh1hh³hÇh´KLhj-ubhŒs. In almost all cases the debug statements shouldn’t be upstreamed, as a working driver is supposed to be silent.”…”�”}”(hj-h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KLhjÓh²hubeh}”(h]”jïah ]”h"]”Œdev_dbg”ah$]”h&]”uh1hÈhjÂh²hh³hÇh´KDubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Custom printk”h]”hŒ Custom printk”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝj uh1hÍhjfh²hh³hÇh´KTubhà)�”}”(hŒ Example::”h]”hŒExample:”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KVhjfh²hubhŒ literal_block”“”)�”}”(hŒ•#define core_dbg(fmt, arg...) do { \ if (core_debug) \ printk(KERN_DEBUG pr_fmt("core: " fmt), ## arg); \ } while (0)”h]”hŒ•#define core_dbg(fmt, arg...) do { \ if (core_debug) \ printk(KERN_DEBUG pr_fmt("core: " fmt), ## arg); \ } while (0)”…”�”}”hj‡sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j…h³hÇh´KXhjfh²hubhà)�”}”(hŒ**When should you do this?**”h]”j')�”}”(hj—h]”hŒWhen should you do this?”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K]hjfh²hubhà)�”}”(hXNIt is better to just use a pr_debug(), which can later be turned on/off with dynamic debug. Additionally, a lot of drivers activate these prints via a variable like ``core_debug`` set by a module parameter. However, Module parameters `are not recommended anymore `_.”h]”(hŒ¥It is better to just use a pr_debug(), which can later be turned on/off with dynamic debug. Additionally, a lot of drivers activate these prints via a variable like ”…”�”}”(hj¬h²hh³Nh´Nubj )�”}”(hŒ``core_debug``”h]”hŒ core_debug”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¬ubhŒ7 set by a module parameter. However, Module parameters ”…”�”}”(hj¬h²hh³Nh´Nubj^)�”}”(hŒc`are not recommended anymore `_”h]”hŒare not recommended anymore”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œare not recommended anymore”Œrefuri”ŒBhttps://lore.kernel.org/all/2024032757-surcharge-grime-d3dd@gregkh”uh1j]hj¬ubhŒtarget”“”)�”}”(hŒE ”h]”h}”(h]”Œare-not-recommended-anymore”ah ]”h"]”Œare not recommended anymore”ah$]”h&]”Œrefuri”j×uh1jØŒ referenced”Khj¬ubhŒ.”…”�”}”(hj¬h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K_hjfh²hubeh}”(h]”jah ]”h"]”Œ custom printk”ah$]”h&]”uh1hÈhjÂh²hh³hÇh´KTubeh}”(h]”jŒah ]”h"]”Œprintk() & friends”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒFtrace”h]”hŒFtrace”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝj9uh1hÍhjh²hh³hÇh´KfubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ#Creating a custom Ftrace tracepoint”h]”hŒ#Creating a custom Ftrace tracepoint”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝjXuh1hÍhjh²hh³hÇh´Kiubhà)�”}”(hX A tracepoint adds a hook into your code that will be called and logged when the tracepoint is enabled. This can be used, for example, to trace hitting a conditional branch or to dump the internal state at specific points of the code flow during a debugging session.”h]”hX A tracepoint adds a hook into your code that will be called and logged when the tracepoint is enabled. This can be used, for example, to trace hitting a conditional branch or to dump the internal state at specific points of the code flow during a debugging session.”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´Kkhjh²hubhà)�”}”(hŒaHere is a basic description of :ref:`how to implement new tracepoints `.”h]”(hŒHere is a basic description of ”…”�”}”(hj0h²hh³Nh´Nubh)�”}”(hŒA:ref:`how to implement new tracepoints `”h]”hî)�”}”(hj:h]”hŒ how to implement new tracepoints”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-ref”eh"]”h$]”h&]”uh1híhj8ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jFŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆj Œtrace/tracepoints:usage”uh1hh³hÇh´Kphj0ubhŒ.”…”�”}”(hj0h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´Kphjh²hubhà)�”}”(hŒAFor the full event tracing documentation see :doc:`/trace/events`”h]”(hŒ-For the full event tracing documentation see ”…”�”}”(hjbh²hh³Nh´Nubh)�”}”(hŒ:doc:`/trace/events`”h]”hî)�”}”(hjlh]”hŒ /trace/events”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-doc”eh"]”h$]”h&]”uh1híhjjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jxŒreftype”Œdoc”Œ refexplicit”‰Œrefwarn”ˆj Œ /trace/events”uh1hh³hÇh´Kshjbubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´Kshjh²hubhà)�”}”(hŒ:For the full Ftrace documentation see :doc:`/trace/ftrace`”h]”(hŒ&For the full Ftrace documentation see ”…”�”}”(hj�h²hh³Nh´Nubh)�”}”(hŒ:doc:`/trace/ftrace`”h]”hî)�”}”(hjšh]”hŒ /trace/ftrace”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-doc”eh"]”h$]”h&]”uh1híhj˜ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”j¦Œreftype”Œdoc”Œ refexplicit”‰Œrefwarn”ˆj Œ /trace/ftrace”uh1hh³hÇh´Kuhj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´Kuhjh²hubeh}”(h]”j^ah ]”h"]”Œ#creating a custom ftrace tracepoint”ah$]”h&]”uh1hÈhjh²hh³hÇh´Kiubeh}”(h]”j?ah ]”h"]”Œftrace”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KfubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒDebugFS”h]”hŒDebugFS”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝj†uh1hÍhjÌh²hh³hÇh´Kxubhà)�”}”(hŒ@Prerequisite: ``CONFIG_DEBUG_FS` & `#include ``”h]”(hŒPrerequisite: ”…”�”}”(hjÝh²hh³Nh´Nubj )�”}”(hŒ2``CONFIG_DEBUG_FS` & `#include ``”h]”hŒ.CONFIG_DEBUG_FS` & `#include ”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÝubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KzhjÌh²hubhà)�”}”(hXcDebugFS differs from the other approaches of debugging, as it doesn't write messages to the kernel log nor add traces to the code. Instead it allows the developer to handle a set of files. With these files you can either store values of variables or make register/memory dumps or you can make these files writable and modify values/settings in the driver.”h]”hXeDebugFS differs from the other approaches of debugging, as it doesn’t write messages to the kernel log nor add traces to the code. Instead it allows the developer to handle a set of files. With these files you can either store values of variables or make register/memory dumps or you can make these files writable and modify values/settings in the driver.”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K|hjÌh²hubhà)�”}”(hŒ Possible use-cases among others:”h]”hŒ Possible use-cases among others:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KƒhjÌh²hubjQ)�”}”(hhh]”(jV)�”}”(hŒStore register values”h]”hà)�”}”(hjh]”hŒStore register values”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K…hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjh²hh³hÇh´NubjV)�”}”(hŒKeep track of variables”h]”hà)�”}”(hj1h]”hŒKeep track of variables”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K†hj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjh²hh³hÇh´NubjV)�”}”(hŒ Store errors”h]”hà)�”}”(hjHh]”hŒ Store errors”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K‡hjFubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjh²hh³hÇh´NubjV)�”}”(hŒStore settings”h]”hà)�”}”(hj_h]”hŒStore settings”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´Kˆhj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjh²hh³hÇh´NubjV)�”}”(hŒ"Toggle a setting like debug on/off”h]”hà)�”}”(hjvh]”hŒ"Toggle a setting like debug on/off”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K‰hjtubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjh²hh³hÇh´NubjV)�”}”(hŒError injection ”h]”hà)�”}”(hŒError injection”h]”hŒError injection”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KŠhj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j´jµuh1jPh³hÇh´K…hjÌh²hubhà)�”}”(hXThis is especially useful, when the size of a data dump would be hard to digest as part of the general kernel log (for example when dumping raw bitstream data) or when you are not interested in all the values all the time, but with the possibility to inspect them.”h]”hXThis is especially useful, when the size of a data dump would be hard to digest as part of the general kernel log (for example when dumping raw bitstream data) or when you are not interested in all the values all the time, but with the possibility to inspect them.”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KŒhjÌh²hubhà)�”}”(hŒThe general idea is:”h]”hŒThe general idea is:”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K‘hjÌh²hubjQ)�”}”(hhh]”(jV)�”}”(hŒdCreate a directory during probe (``struct dentry *parent = debugfs_create_dir("my_driver", NULL);``)”h]”hà)�”}”(hŒdCreate a directory during probe (``struct dentry *parent = debugfs_create_dir("my_driver", NULL);``)”h]”(hŒ!Create a directory during probe (”…”�”}”(hjÌh²hh³Nh´Nubj )�”}”(hŒB``struct dentry *parent = debugfs_create_dir("my_driver", NULL);``”h]”hŒ>struct dentry *parent = debugfs_create_dir("my_driver", NULL);”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÌubhŒ)”…”�”}”(hjÌh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K“hjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjÅh²hh³hÇh´NubjV)�”}”(hX)Create a file (``debugfs_create_u32("my_value", 444, parent, &my_variable);``) - In this example the file is found in ``/sys/kernel/debug/my_driver/my_value`` (with read permissions for user/group/all) - any read of the file will return the current contents of the variable ``my_variable`` ”h]”(hà)�”}”(hŒNCreate a file (``debugfs_create_u32("my_value", 444, parent, &my_variable);``)”h]”(hŒCreate a file (”…”�”}”(hjöh²hh³Nh´Nubj )�”}”(hŒ>``debugfs_create_u32("my_value", 444, parent, &my_variable);``”h]”hŒ:debugfs_create_u32("my_value", 444, parent, &my_variable);”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjöubhŒ)”…”�”}”(hjöh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K•hjòubjQ)�”}”(hhh]”(jV)�”}”(hŒxIn this example the file is found in ``/sys/kernel/debug/my_driver/my_value`` (with read permissions for user/group/all)”h]”hà)�”}”(hŒxIn this example the file is found in ``/sys/kernel/debug/my_driver/my_value`` (with read permissions for user/group/all)”h]”(hŒ%In this example the file is found in ”…”�”}”(hj h²hh³Nh´Nubj )�”}”(hŒ(``/sys/kernel/debug/my_driver/my_value``”h]”hŒ$/sys/kernel/debug/my_driver/my_value”…”�”}”(hj% h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ+ (with read permissions for user/group/all)”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K—hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhj ubjV)�”}”(hŒVany read of the file will return the current contents of the variable ``my_variable`` ”h]”hà)�”}”(hŒUany read of the file will return the current contents of the variable ``my_variable``”h]”(hŒFany read of the file will return the current contents of the variable ”…”�”}”(hjG h²hh³Nh´Nubj )�”}”(hŒ``my_variable``”h]”hŒ my_variable”…”�”}”(hjO h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjG ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KšhjC ubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhj ubeh}”(h]”h ]”h"]”h$]”h&]”j´jµuh1jPh³hÇh´K—hjòubeh}”(h]”h ]”h"]”h$]”h&]”uh1jUhjÅh²hh³Nh´NubjV)�”}”(hŒNClean up the directory when removing the device (``debugfs_remove(parent);``) ”h]”hà)�”}”(hŒMClean up the directory when removing the device (``debugfs_remove(parent);``)”h]”(hŒ1Clean up the directory when removing the device (”…”�”}”(hjy h²hh³Nh´Nubj )�”}”(hŒ``debugfs_remove(parent);``”h]”hŒdebugfs_remove(parent);”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjy ubhŒ)”…”�”}”(hjy h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K�hju ubah}”(h]”h ]”h"]”h$]”h&]”uh1jUhjÅh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j´jµuh1jPh³hÇh´K“hjÌh²hubhà)�”}”(hŒ;For the full documentation see :doc:`/filesystems/debugfs`.”h]”(hŒFor the full documentation see ”…”�”}”(hj¥ h²hh³Nh´Nubh)�”}”(hŒ:doc:`/filesystems/debugfs`”h]”hî)�”}”(hj¯ h]”hŒ/filesystems/debugfs”…”�”}”(hj± h²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-doc”eh"]”h$]”h&]”uh1híhj­ ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”j» Œreftype”Œdoc”Œ refexplicit”‰Œrefwarn”ˆj Œ/filesystems/debugfs”uh1hh³hÇh´K hj¥ ubhŒ.”…”�”}”(hj¥ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K hjÌh²hubeh}”(h]”jŒah ]”h"]”Œdebugfs”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KxubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ.KASAN, UBSAN, lockdep and other error checkers”h]”hŒ.KASAN, UBSAN, lockdep and other error checkers”…”�”}”(hjá h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝj¨uh1hÍhjÞ h²hh³hÇh´K£ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ KASAN (Kernel Address Sanitizer)”h]”hŒ KASAN (Kernel Address Sanitizer)”…”�”}”(hjò h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝjÇuh1hÍhjï h²hh³hÇh´K¦ubhà)�”}”(hŒPrerequisite: ``CONFIG_KASAN``”h]”(hŒPrerequisite: ”…”�”}”(hj h²hh³Nh´Nubj )�”}”(hŒ``CONFIG_KASAN``”h]”hŒ CONFIG_KASAN”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K¨hjï h²hubhà)�”}”(hŒ¥KASAN is a dynamic memory error detector that helps to find use-after-free and out-of-bounds bugs. It uses compile-time instrumentation to check every memory access.”h]”hŒ¥KASAN is a dynamic memory error detector that helps to find use-after-free and out-of-bounds bugs. It uses compile-time instrumentation to check every memory access.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´Kªhjï h²hubhà)�”}”(hŒ7For the full documentation see :doc:`/dev-tools/kasan`.”h]”(hŒFor the full documentation see ”…”�”}”(hj* h²hh³Nh´Nubh)�”}”(hŒ:doc:`/dev-tools/kasan`”h]”hî)�”}”(hj4 h]”hŒ/dev-tools/kasan”…”�”}”(hj6 h²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-doc”eh"]”h$]”h&]”uh1híhj2 ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”j@ Œreftype”Œdoc”Œ refexplicit”‰Œrefwarn”ˆj Œ/dev-tools/kasan”uh1hh³hÇh´K®hj* ubhŒ.”…”�”}”(hj* h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K®hjï h²hubeh}”(h]”jÍah ]”h"]”Œ kasan (kernel address sanitizer)”ah$]”h&]”uh1hÈhjÞ h²hh³hÇh´K¦ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ$UBSAN (Undefined Behavior Sanitizer)”h]”hŒ$UBSAN (Undefined Behavior Sanitizer)”…”�”}”(hjf h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝjéuh1hÍhjc h²hh³hÇh´K±ubhà)�”}”(hŒPrerequisite: ``CONFIG_UBSAN``”h]”(hŒPrerequisite: ”…”�”}”(hjt h²hh³Nh´Nubj )�”}”(hŒ``CONFIG_UBSAN``”h]”hŒ CONFIG_UBSAN”…”�”}”(hj| h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjt ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K³hjc h²hubhà)�”}”(hŒÍUBSAN relies on compiler instrumentation and runtime checks to detect undefined behavior. It is designed to find a variety of issues, including signed integer overflow, array index out of bounds, and more.”h]”hŒÍUBSAN relies on compiler instrumentation and runtime checks to detect undefined behavior. It is designed to find a variety of issues, including signed integer overflow, array index out of bounds, and more.”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´Kµhjc h²hubhà)�”}”(hŒ6For the full documentation see :doc:`/dev-tools/ubsan`”h]”(hŒFor the full documentation see ”…”�”}”(hjž h²hh³Nh´Nubh)�”}”(hŒ:doc:`/dev-tools/ubsan`”h]”hî)�”}”(hj¨ h]”hŒ/dev-tools/ubsan”…”�”}”(hjª h²hh³Nh´Nubah}”(h]”h ]”(hùŒstd”Œstd-doc”eh"]”h$]”h&]”uh1híhj¦ ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”j´ Œreftype”Œdoc”Œ refexplicit”‰Œrefwarn”ˆj Œ/dev-tools/ubsan”uh1hh³hÇh´K¹hjž ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K¹hjc h²hubeh}”(h]”jïah ]”h"]”Œ$ubsan (undefined behavior sanitizer)”ah$]”h&]”uh1hÈhjÞ h²hh³hÇh´K±ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ#lockdep (Lock Dependency Validator)”h]”hŒ#lockdep (Lock Dependency Validator)”…”�”}”(hjÖ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝj uh1hÍhjÓ h²hh³hÇh´K¼ubhà)�”}”(hŒ&Prerequisite: ``CONFIG_DEBUG_LOCKDEP``”h]”(hŒPrerequisite: ”…”�”}”(hjä h²hh³Nh´Nubj )�”}”(hŒ``CONFIG_DEBUG_LOCKDEP``”h]”hŒCONFIG_DEBUG_LOCKDEP”…”�”}”(hjì h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjä ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´K¾hjÓ h²hubhà)�”}”(hXKlockdep is a runtime lock dependency validator that detects potential deadlocks and other locking-related issues in the kernel. It tracks lock acquisitions and releases, building a dependency graph that is analyzed for potential deadlocks. lockdep is especially useful for validating the correctness of lock ordering in the kernel.”h]”hXKlockdep is a runtime lock dependency validator that detects potential deadlocks and other locking-related issues in the kernel. It tracks lock acquisitions and releases, building a dependency graph that is analyzed for potential deadlocks. lockdep is especially useful for validating the correctness of lock ordering in the kernel.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KÀhjÓ h²hubeh}”(h]”jah ]”h"]”Œ#lockdep (lock dependency validator)”ah$]”h&]”uh1hÈhjÞ h²hh³hÇh´K¼ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ)PSI (Pressure stall information tracking)”h]”hŒ)PSI (Pressure stall information tracking)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝj-uh1hÍhj h²hh³hÇh´KÈubhà)�”}”(hŒPrerequisite: ``CONFIG_PSI``”h]”(hŒPrerequisite: ”…”�”}”(hj& h²hh³Nh´Nubj )�”}”(hŒ``CONFIG_PSI``”h]”hŒ CONFIG_PSI”…”�”}”(hj. h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj& ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KÊhj h²hubhà)�”}”(hŒŒPSI is a measurement tool to identify excessive overcommits on hardware resources, that can cause performance disruptions or even OOM kills.”h]”hŒŒPSI is a measurement tool to identify excessive overcommits on hardware resources, that can cause performance disruptions or even OOM kills.”…”�”}”(hjB h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KÌhj h²hubeh}”(h]”j3ah ]”h"]”Œ)psi (pressure stall information tracking)”ah$]”h&]”uh1hÈhjÞ h²hh³hÇh´KÈubeh}”(h]”j®ah ]”h"]”Œ.kasan, ubsan, lockdep and other error checkers”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K£ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒdevice coredump”h]”hŒdevice coredump”…”�”}”(hja h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝj[uh1hÍhj^ h²hh³hÇh´KÐubhà)�”}”(hŒJPrerequisite: ``CONFIG_DEV_COREDUMP`` & ``#include ``”h]”(hŒPrerequisite: ”…”�”}”(hjo h²hh³Nh´Nubj )�”}”(hŒ``CONFIG_DEV_COREDUMP``”h]”hŒCONFIG_DEV_COREDUMP”…”�”}”(hjw h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjo ubhŒ & ”…”�”}”(hjo h²hh³Nh´Nubj )�”}”(hŒ"``#include ``”h]”hŒ#include ”…”�”}”(hj‰ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjo ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KÒhj^ h²hubhà)�”}”(hXÇProvides the infrastructure for a driver to provide arbitrary data to userland. It is most often used in conjunction with udev or similar userland application to listen for kernel uevents, which indicate that the dump is ready. Udev has rules to copy that file somewhere for long-term storage and analysis, as by default, the data for the dump is automatically cleaned up after a default 5 minutes. That data is analyzed with driver-specific tools or GDB.”h]”hXÇProvides the infrastructure for a driver to provide arbitrary data to userland. It is most often used in conjunction with udev or similar userland application to listen for kernel uevents, which indicate that the dump is ready. Udev has rules to copy that file somewhere for long-term storage and analysis, as by default, the data for the dump is automatically cleaned up after a default 5 minutes. That data is analyzed with driver-specific tools or GDB.”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KÔhj^ h²hubhà)�”}”(hŒjA device coredump can be created with a vmalloc area, with read/free methods, or as a scatter/gather list.”h]”hŒjA device coredump can be created with a vmalloc area, with read/free methods, or as a scatter/gather list.”…”�”}”(hj« h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KÛhj^ h²hubhà)�”}”(hX You can find an example implementation at: `drivers/media/platform/qcom/venus/core.c `__, in the Bluetooth HCI layer, in several wireless drivers, and in several DRM drivers.”h]”(hŒ+You can find an example implementation at: ”…”�”}”(hj¹ h²hh³Nh´Nubj^)�”}”(hŒ‹`drivers/media/platform/qcom/venus/core.c `__”h]”hŒ(drivers/media/platform/qcom/venus/core.c”…”�”}”(hjÁ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ(drivers/media/platform/qcom/venus/core.c”jÖŒ\https://elixir.bootlin.com/linux/v6.11.6/source/drivers/media/platform/qcom/venus/core.c#L30”uh1j]hj¹ ubhŒV, in the Bluetooth HCI layer, in several wireless drivers, and in several DRM drivers.”…”�”}”(hj¹ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KÞhj^ h²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒdevcoredump interfaces”h]”hŒdevcoredump interfaces”…”�”}”(hjß h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”hÝjzuh1hÍhjÜ h²hh³hÇh´KåubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œdev_coredumpm (C function)”Œc.dev_coredumpm”hNt”auh1jí hjÜ h²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒÖvoid dev_coredumpm (struct device *dev, struct module *owner, void *data, size_t datalen, gfp_t gfp, ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen), void (*free)(void *data))”h]”hŒdesc_signature_line”“”)�”}”(hŒÕvoid dev_coredumpm(struct device *dev, struct module *owner, void *data, size_t datalen, gfp_t gfp, ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen), void (*free)(void *data))”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³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´KfubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj# h²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1j! hj h²hh³j h´KfubhŒ desc_name”“”)�”}”(hŒ dev_coredumpm”h]”hŒ desc_sig_name”“”)�”}”(hŒ dev_coredumpm”h]”hŒ dev_coredumpm”…”�”}”(hj: h²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1j8 hj4 ubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1j2 hj h²hh³j h´KfubhŒdesc_parameterlist”“”)�”}”(hŒÃ(struct device *dev, struct module *owner, void *data, size_t datalen, gfp_t gfp, ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen), void (*free)(void *data))”h]”(hŒdesc_parameter”“”)�”}”(hŒstruct device *dev”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1j] hjY ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjY ubh)�”}”(hhh]”j9 )�”}”(hŒdevice”h]”hŒdevice”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj| 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.dev_coredumpm”†”asbuh1hhjY ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¨ h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjY ubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hj¸ h²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1j¶ hjY ubj9 )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjÇ h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjY ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjS ubjX )�”}”(hŒstruct module *owner”h]”(j^ )�”}”(hja h]”hŒstruct”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”jj ah"]”h$]”h&]”uh1j] hjÜ ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjí h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjÜ ubh)�”}”(hhh]”j9 )�”}”(hŒmodule”h]”hŒmodule”…”�”}”(hjþ h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjû ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j Œmodname”NŒ classname”Njš j� )�”}”j  ]”j¤ Œc.dev_coredumpm”†”asbuh1hhjÜ 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Ü ubj9 )�”}”(hŒowner”h]”hŒowner”…”�”}”(hj7 h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÜ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjS ubjX )�”}”(hŒ void *data”h]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjL ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj^ h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjL ubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjl h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjL ubj9 )�”}”(hŒdata”h]”hŒdata”…”�”}”(hjy h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjL ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjS ubjX )�”}”(hŒsize_t datalen”h]”(h)�”}”(hhh]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj• h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj’ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j— Œmodname”NŒ classname”Njš j� )�”}”j  ]”j¤ Œc.dev_coredumpm”†”asbuh1hhjŽ ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj³ h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjŽ ubj9 )�”}”(hŒdatalen”h]”hŒdatalen”…”�”}”(hjÁ h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjŽ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjS ubjX )�”}”(hŒ gfp_t gfp”h]”(h)�”}”(hhh]”j9 )�”}”(hŒgfp_t”h]”hŒgfp_t”…”�”}”(hjÝ h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÚ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jß Œmodname”NŒ classname”Njš j� )�”}”j  ]”j¤ Œc.dev_coredumpm”†”asbuh1hhjÖ ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjû h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjÖ ubj9 )�”}”(hŒgfp”h]”hŒgfp”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÖ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjS ubjX )�”}”(hŒVssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)”h]”(h)�”}”(hhh]”j9 )�”}”(hŒssize_t”h]”hŒssize_t”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj"ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j'Œmodname”NŒ classname”Njš j� )�”}”j  ]”j¤ Œc.dev_coredumpm”†”asbuh1hhjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj· )�”}”(hŒ(”h]”hŒ(”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj· )�”}”(hjº h]”hŒ*”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj9 )�”}”(hŒread”h]”hŒread”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubj· )�”}”(hŒ)”h]”hŒ)”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj· )�”}”(hjSh]”hŒ(”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj )�”}”(hŒchar”h]”hŒchar”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj· )�”}”(hjº h]”hŒ*”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj9 )�”}”(hŒbuffer”h]”hŒbuffer”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubj· )�”}”(hŒ,”h]”hŒ,”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubh)�”}”(hhh]”j9 )�”}”(hŒloff_t”h]”hŒloff_t”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjèubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jíŒmodname”NŒ classname”Njš j� )�”}”j  ]”j¤ Œc.dev_coredumpm”†”asbuh1hhjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj9 )�”}”(hŒoffset”h]”hŒoffset”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubj· )�”}”(hjÎh]”hŒ,”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubh)�”}”(hhh]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj@ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jEŒmodname”NŒ classname”Njš j� )�”}”j  ]”j¤ Œc.dev_coredumpm”†”asbuh1hhjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj9 )�”}”(hŒcount”h]”hŒcount”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubj· )�”}”(hjÎh]”hŒ,”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj· )�”}”(hjº h]”hŒ*”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj9 )�”}”(hŒdata”h]”hŒdata”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubj· )�”}”(hjÎh]”hŒ,”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubh)�”}”(hhh]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjêubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jïŒmodname”NŒ classname”Njš j� )�”}”j  ]”j¤ Œc.dev_coredumpm”†”asbuh1hhjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj9 )�”}”(hŒdatalen”h]”hŒdatalen”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubj· )�”}”(hj|h]”hŒ)”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjS ubjX )�”}”(hŒvoid (*free)(void *data)”h]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hj;ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj;ubj· )�”}”(hjSh]”hŒ(”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hj;ubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hj;ubj9 )�”}”(hŒfree”h]”hŒfree”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj;ubj· )�”}”(hj|h]”hŒ)”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hj;ubj· )�”}”(hjSh]”hŒ(”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hj;ubj )�”}”(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;ubj· )�”}”(hjº h]”hŒ*”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hj;ubj9 )�”}”(hŒdata”h]”hŒdata”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj;ubj· )�”}”(hj|h]”hŒ)”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hj;ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjS ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jQ hj h²hh³j h´Kfubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1j Œsphinx_line_type”Œ declarator”hj h²hh³j h´Kfubah}”(h]”jü ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j h³j h´Kfhj h²hubhŒ desc_content”“”)�”}”(hhh]”hà)�”}”(hŒ-create device coredump with read/free methods”h]”hŒ-create device coredump with read/free methods”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´Kfhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj h²hh³j h´Kfubeh}”(h]”h ]”(j” Œfunction”eh"]”h$]”h&]”Œdomain”j” Œobjtype”jŒdesctype”jŒnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1jþ h²hhjÜ h³Nh´NubhŒ container”“”)�”}”(hX,**Parameters** ``struct device *dev`` the struct device for the crashed device ``struct module *owner`` the module that contains the read/free functions, use ``THIS_MODULE`` ``void *data`` data cookie for the **read**/**free** functions ``size_t datalen`` length of the data ``gfp_t gfp`` allocation flags ``ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)`` function to read from the given buffer ``void (*free)(void *data)`` function to free the given buffer **Description** Creates a new device coredump for the given device. If a previous one hasn't been read yet, the new coredump is discarded. The data lifetime is determined by the device coredump framework and when it is no longer needed the **free** function will be called to free the data.”h]”(hà)�”}”(hŒ**Parameters**”h]”j')�”}”(hj1h]”hŒ Parameters”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´Kjhj+ubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ@``struct device *dev`` the struct device for the crashed device ”h]”(hŒterm”“”)�”}”(hŒ``struct device *dev``”h]”j )�”}”(hjVh]”hŒstruct device *dev”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´KghjNubhŒ definition”“”)�”}”(hhh]”hà)�”}”(hŒ(the struct device for the crashed device”h]”hŒ(the struct device for the crashed device”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jkh´Kghjnubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjNubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jkh´KghjIubjM)�”}”(hŒ_``struct module *owner`` the module that contains the read/free functions, use ``THIS_MODULE`` ”h]”(jS)�”}”(hŒ``struct module *owner``”h]”j )�”}”(hj‘h]”hŒstruct module *owner”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´Khhj‹ubjm)�”}”(hhh]”hà)�”}”(hŒEthe module that contains the read/free functions, use ``THIS_MODULE``”h]”(hŒ6the module that contains the read/free functions, use ”…”�”}”(hjªh²hh³Nh´Nubj )�”}”(hŒ``THIS_MODULE``”h]”hŒ THIS_MODULE”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjªubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j¦h´Khhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj‹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j¦h´KhhjIubjM)�”}”(hŒ?``void *data`` data cookie for the **read**/**free** functions ”h]”(jS)�”}”(hŒ``void *data``”h]”j )�”}”(hjØh]”hŒ void *data”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´KihjÒubjm)�”}”(hhh]”hà)�”}”(hŒ/data cookie for the **read**/**free** functions”h]”(hŒdata cookie for the ”…”�”}”(hjñh²hh³Nh´Nubj')�”}”(hŒ**read**”h]”hŒread”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjñubhŒ/”…”�”}”(hjñh²hh³Nh´Nubj')�”}”(hŒ**free**”h]”hŒfree”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjñubhŒ functions”…”�”}”(hjñh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jíh´Kihjîubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jíh´KihjIubjM)�”}”(hŒ&``size_t datalen`` length of the data ”h]”(jS)�”}”(hŒ``size_t datalen``”h]”j )�”}”(hj5h]”hŒsize_t datalen”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´Kjhj/ubjm)�”}”(hhh]”hà)�”}”(hŒlength of the data”h]”hŒlength of the data”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jJh´KjhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jJh´KjhjIubjM)�”}”(hŒ``gfp_t gfp`` allocation flags ”h]”(jS)�”}”(hŒ ``gfp_t gfp``”h]”j )�”}”(hjnh]”hŒ gfp_t gfp”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjlubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´Kkhjhubjm)�”}”(hhh]”hà)�”}”(hŒallocation flags”h]”hŒallocation flags”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jƒh´Kkhj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jƒh´KkhjIubjM)�”}”(hŒ‚``ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)`` function to read from the given buffer ”h]”(jS)�”}”(hŒZ``ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)``”h]”j )�”}”(hj§h]”hŒVssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´Klhj¡ubjm)�”}”(hhh]”hà)�”}”(hŒ&function to read from the given buffer”h]”hŒ&function to read from the given buffer”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j¼h´Klhj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj¡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j¼h´KlhjIubjM)�”}”(hŒ?``void (*free)(void *data)`` function to free the given buffer ”h]”(jS)�”}”(hŒ``void (*free)(void *data)``”h]”j )�”}”(hjàh]”hŒvoid (*free)(void *data)”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´KmhjÚubjm)�”}”(hhh]”hà)�”}”(hŒ!function to free the given buffer”h]”hŒ!function to free the given buffer”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jõh´Kmhjöubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjÚubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jõh´KmhjIubeh}”(h]”h ]”h"]”h$]”h&]”uh1jGhj+ubhà)�”}”(hŒ**Description**”h]”j')�”}”(hjh]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´Kohj+ubhà)�”}”(hXCreates a new device coredump for the given device. If a previous one hasn't been read yet, the new coredump is discarded. The data lifetime is determined by the device coredump framework and when it is no longer needed the **free** function will be called to free the data.”h]”(hŒâCreates a new device coredump for the given device. If a previous one hasn’t been read yet, the new coredump is discarded. The data lifetime is determined by the device coredump framework and when it is no longer needed the ”…”�”}”(hj1h²hh³Nh´Nubj')�”}”(hŒ**free**”h]”hŒfree”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hj1ubhŒ* function will be called to free the data.”…”�”}”(hj1h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ�/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:231: ./include/linux/devcoredump.h”h´Knhj+ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j)hjÜ h²hh³Nh´Nubjî )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jú Œdev_coredumpv (C function)”Œc.dev_coredumpv”hNt”auh1jí hjÜ h²hh³Nh´Nubjÿ )�”}”(hhh]”(j )�”}”(hŒNvoid dev_coredumpv (struct device *dev, void *data, size_t datalen, gfp_t gfp)”h]”j )�”}”(hŒMvoid dev_coredumpv(struct device *dev, void *data, size_t datalen, gfp_t gfp)”h]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjnh²hh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjnh²hh³j€h´Mubj3 )�”}”(hŒ dev_coredumpv”h]”j9 )�”}”(hŒ dev_coredumpv”h]”hŒ dev_coredumpv”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj�ubah}”(h]”h ]”(jL jM eh"]”h$]”h&]”hÅhÆuh1j2 hjnh²hh³j€h´MubjR )�”}”(hŒ;(struct device *dev, void *data, size_t datalen, gfp_t gfp)”h]”(jX )�”}”(hŒstruct device *dev”h]”(j^ )�”}”(hja h]”hŒstruct”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”jj ah"]”h$]”h&]”uh1j] hj«ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj«ubh)�”}”(hhh]”j9 )�”}”(hŒdevice”h]”hŒdevice”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÊubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jÏŒmodname”NŒ classname”Njš j� )�”}”j  ]”j£ )�”}”j– j•sbŒc.dev_coredumpv”†”asbuh1hhj«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«ubj9 )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj«ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj§ubjX )�”}”(hŒ void *data”h]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj· )�”}”(hjº h]”hŒ*”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj9 )�”}”(hŒdata”h]”hŒdata”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj§ubjX )�”}”(hŒsize_t datalen”h]”(h)�”}”(hhh]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjcubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jhŒmodname”NŒ classname”Njš j� )�”}”j  ]”jéŒc.dev_coredumpv”†”asbuh1hhj_ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj_ubj9 )�”}”(hŒdatalen”h]”hŒdatalen”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj_ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj§ubjX )�”}”(hŒ gfp_t gfp”h]”(h)�”}”(hhh]”j9 )�”}”(hŒgfp_t”h]”hŒgfp_t”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj«ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j°Œmodname”NŒ classname”Njš j� )�”}”j  ]”jéŒc.dev_coredumpv”†”asbuh1hhj§ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj§ubj9 )�”}”(hŒgfp”h]”hŒgfp”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj§ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj§ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jQ hjnh²hh³j€h´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjôˆuh1j jõjöhjjh²hh³j€h´Mubah}”(h]”jeah ]”(jújûeh"]”h$]”h&]”jÿˆj)jhuh1j h³j€h´Mhjgh²hubj)�”}”(hhh]”hà)�”}”(hŒ(create device coredump with vmalloc data”h]”hŒ(create device coredump with vmalloc data”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjgh²hh³j€h´Mubeh}”(h]”h ]”(j” Œfunction”eh"]”h$]”h&]”j#j” j$jj%jj&‰j'‰j(‰uh1jþ h²hhjÜ h³Nh´Nubj*)�”}”(hXw**Parameters** ``struct device *dev`` the struct device for the crashed device ``void *data`` vmalloc data containing the device coredump ``size_t datalen`` length of the data ``gfp_t gfp`` allocation flags **Description** This function takes ownership of the vmalloc'ed data and will free it when it is no longer used. See dev_coredumpm() for more information.”•.âh]”(hà)�”}”(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&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhj ubjH)�”}”(hhh]”(jM)�”}”(hŒ@``struct device *dev`` the struct device for the crashed device ”h]”(jS)�”}”(hŒ``struct device *dev``”h]”j )�”}”(hjEh]”hŒstruct device *dev”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhj?ubjm)�”}”(hhh]”hà)�”}”(hŒ(the struct device for the crashed device”h]”hŒ(the struct device for the crashed device”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jZh´Mhj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj?ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jZh´Mhj<ubjM)�”}”(hŒ;``void *data`` vmalloc data containing the device coredump ”h]”(jS)�”}”(hŒ``void *data``”h]”j )�”}”(hj~h]”hŒ void *data”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhjxubjm)�”}”(hhh]”hà)�”}”(hŒ+vmalloc data containing the device coredump”h]”hŒ+vmalloc data containing the device coredump”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j“h´Mhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjxubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j“h´Mhj<ubjM)�”}”(hŒ&``size_t datalen`` length of the data ”h]”(jS)�”}”(hŒ``size_t datalen``”h]”j )�”}”(hj·h]”hŒsize_t datalen”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjµubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhj±ubjm)�”}”(hhh]”hà)�”}”(hŒlength of the data”h]”hŒlength of the data”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jÌh´MhjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj±ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jÌh´Mhj<ubjM)�”}”(hŒ``gfp_t gfp`` allocation flags ”h]”(jS)�”}”(hŒ ``gfp_t gfp``”h]”j )�”}”(hjðh]”hŒ gfp_t gfp”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjîubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhjêubjm)�”}”(hhh]”hà)�”}”(hŒallocation flags”h]”hŒallocation flags”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jh´Mhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjêubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jh´Mhj<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jGhj ubhà)�”}”(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&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhj ubhà)�”}”(hŒŠThis function takes ownership of the vmalloc'ed data and will free it when it is no longer used. See dev_coredumpm() for more information.”h]”hŒŒThis function takes ownership of the vmalloc’ed data and will free it when it is no longer used. See dev_coredumpm() for more information.”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhj ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j)hjÜ h²hh³Nh´Nubjî )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jú Œdevcd_free_sgtable (C function)”Œc.devcd_free_sgtable”hNt”auh1jí hjÜ h²hh³Nh´Nubjÿ )�”}”(hhh]”(j )�”}”(hŒ$void devcd_free_sgtable (void *data)”h]”j )�”}”(hŒ#void devcd_free_sgtable(void *data)”h]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjlh²hh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjlh²hh³j~h´Mubj3 )�”}”(hŒdevcd_free_sgtable”h]”j9 )�”}”(hŒdevcd_free_sgtable”h]”hŒdevcd_free_sgtable”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj�ubah}”(h]”h ]”(jL jM eh"]”h$]”h&]”hÅhÆuh1j2 hjlh²hh³j~h´MubjR )�”}”(hŒ (void *data)”h]”jX )�”}”(hŒ void *data”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©ubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hj©ubj9 )�”}”(hŒdata”h]”hŒdata”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj©ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj¥ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jQ hjlh²hh³j~h´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjôˆuh1j jõjöhjhh²hh³j~h´Mubah}”(h]”jcah ]”(jújûeh"]”h$]”h&]”jÿˆj)jhuh1j h³j~h´Mhjeh²hubj)�”}”(hhh]”hà)�”}”(hŒ^free all the memory of the given scatterlist table (i.e. both pages and scatterlist instances)”h]”hŒ^free all the memory of the given scatterlist table (i.e. both pages and scatterlist instances)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhjýh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjeh²hh³j~h´Mubeh}”(h]”h ]”(j” Œfunction”eh"]”h$]”h&]”j#j” j$jj%jj&‰j'‰j(‰uh1jþ h²hhjÜ h³Nh´Nubj*)�”}”(hŒè**Parameters** ``void *data`` pointer to sg_table to free **NOTE** if two tables allocated with devcd_alloc_sgtable and then chained using the sg_chain function then that function should be called only once on the chained table”h]”(hà)�”}”(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&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MhjubjH)�”}”(hhh]”jM)�”}”(hŒ+``void *data`` pointer to sg_table to free ”h]”(jS)�”}”(hŒ``void *data``”h]”j )�”}”(hjAh]”hŒ void *data”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhj;ubjm)�”}”(hhh]”hà)�”}”(hŒpointer to sg_table to free”h]”hŒpointer to sg_table to free”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jVh´MhjWubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jVh´Mhj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jGhjubhà)�”}”(hŒ**NOTE**”h]”j')�”}”(hj|h]”hŒNOTE”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhjubhà)�”}”(hŒ if two tables allocated with devcd_alloc_sgtable and then chained using the sg_chain function then that function should be called only once on the chained table”h]”hŒ if two tables allocated with devcd_alloc_sgtable and then chained using the sg_chain function then that function should be called only once on the chained table”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mhjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j)hjÜ h²hh³Nh´Nubjî )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jú Œ$devcd_read_from_sgtable (C function)”Œc.devcd_read_from_sgtable”hNt”auh1jí hjÜ h²hh³Nh´Nubjÿ )�”}”(hhh]”(j )�”}”(hŒjssize_t devcd_read_from_sgtable (char *buffer, loff_t offset, size_t buf_len, void *data, size_t data_len)”h]”j )�”}”(hŒissize_t devcd_read_from_sgtable(char *buffer, loff_t offset, size_t buf_len, void *data, size_t data_len)”h]”(h)�”}”(hhh]”j9 )�”}”(hŒssize_t”h]”hŒssize_t”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÁubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jÆŒmodname”NŒ classname”Njš j� )�”}”j  ]”j£ )�”}”j– Œdevcd_read_from_sgtable”sbŒc.devcd_read_from_sgtable”†”asbuh1hhj½h²hh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.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%ubj3 )�”}”(hŒdevcd_read_from_sgtable”h]”j9 )�”}”(hjâh]”hŒdevcd_read_from_sgtable”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjôubah}”(h]”h ]”(jL jM eh"]”h$]”h&]”hÅhÆuh1j2 hj½h²hh³jåh´M%ubjR )�”}”(hŒJ(char *buffer, loff_t offset, size_t buf_len, void *data, size_t data_len)”h]”(jX )�”}”(hŒ char *buffer”h]”(j )�”}”(hŒchar”h]”hŒchar”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj· )�”}”(hjº h]”hŒ*”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj9 )�”}”(hŒbuffer”h]”hŒbuffer”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj ubjX )�”}”(hŒ loff_t offset”h]”(h)�”}”(hhh]”j9 )�”}”(hŒloff_t”h]”hŒloff_t”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjUubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jZŒmodname”NŒ classname”Njš j� )�”}”j  ]”jàŒc.devcd_read_from_sgtable”†”asbuh1hhjQubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjQubj9 )�”}”(hŒoffset”h]”hŒoffset”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjQubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj ubjX )�”}”(hŒsize_t buf_len”h]”(h)�”}”(hhh]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj�ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j¢Œmodname”NŒ classname”Njš j� )�”}”j  ]”jàŒc.devcd_read_from_sgtable”†”asbuh1hhj™ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj™ubj9 )�”}”(hŒbuf_len”h]”hŒbuf_len”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj™ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj ubjX )�”}”(hŒ void *data”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áubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjáubj9 )�”}”(hŒdata”h]”hŒdata”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjáubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj ubjX )�”}”(hŒsize_t data_len”h]”(h)�”}”(hhh]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj'ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j,Œmodname”NŒ classname”Njš j� )�”}”j  ]”jàŒc.devcd_read_from_sgtable”†”asbuh1hhj#ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj#ubj9 )�”}”(hŒdata_len”h]”hŒdata_len”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj#ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jQ hj½h²hh³jåh´M%ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjôˆuh1j jõjöhj¹h²hh³jåh´M%ubah}”(h]”j´ah ]”(jújûeh"]”h$]”h&]”jÿˆj)jhuh1j h³jåh´M%hj¶h²hubj)�”}”(hhh]”hà)�”}”(hŒMcopy data from sg_table to a given buffer and return the number of bytes read”h]”hŒMcopy data from sg_table to a given buffer and return the number of bytes read”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M%hj}h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¶h²hh³jåh´M%ubeh}”(h]”h ]”(j” Œfunction”eh"]”h$]”h&]”j#j” j$j˜j%j˜j&‰j'‰j(‰uh1jþ h²hhjÜ h³Nh´Nubj*)�”}”(hX}**Parameters** ``char *buffer`` the buffer to copy the data to it ``loff_t offset`` start copy from **offset****** bytes from the head of the data in the given scatterlist ``size_t buf_len`` the length of the buffer ``void *data`` the scatterlist table to copy from ``size_t data_len`` the length of the data in the sg_table **Return** the number of bytes copied”h]”(hà)�”}”(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&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M)hjœubjH)�”}”(hhh]”(jM)�”}”(hŒ3``char *buffer`` the buffer to copy the data to it ”h]”(jS)�”}”(hŒ``char *buffer``”h]”j )�”}”(hjÁh]”hŒ char *buffer”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M'hj»ubjm)�”}”(hhh]”hà)�”}”(hŒ!the buffer to copy the data to it”h]”hŒ!the buffer to copy the data to it”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jÖh´M'hj×ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj»ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jÖh´M'hj¸ubjM)�”}”(hŒj``loff_t offset`` start copy from **offset****** bytes from the head of the data in the given scatterlist ”h]”(jS)�”}”(hŒ``loff_t offset``”h]”j )�”}”(hjúh]”hŒ loff_t offset”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M+hjôubjm)�”}”(hhh]”hà)�”}”(hŒWstart copy from **offset****** bytes from the head of the data in the given scatterlist”h]”(hŒstart copy from ”…”�”}”(hjh²hh³Nh´Nubj')�”}”(hŒ**offset******”h]”hŒ offset****”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjubhŒ9 bytes from the head of the data in the given scatterlist”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M*hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjôubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jh´M+hj¸ubjM)�”}”(hŒ,``size_t buf_len`` the length of the buffer ”h]”(jS)�”}”(hŒ``size_t buf_len``”h]”j )�”}”(hjFh]”hŒsize_t buf_len”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjDubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M(hj@ubjm)�”}”(hhh]”hà)�”}”(hŒthe length of the buffer”h]”hŒthe length of the buffer”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j[h´M(hj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj@ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j[h´M(hj¸ubjM)�”}”(hŒ2``void *data`` the scatterlist table to copy from ”h]”(jS)�”}”(hŒ``void *data``”h]”j )�”}”(hjh]”hŒ void *data”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M)hjyubjm)�”}”(hhh]”hà)�”}”(hŒ"the scatterlist table to copy from”h]”hŒ"the scatterlist table to copy from”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j”h´M)hj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjyubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j”h´M)hj¸ubjM)�”}”(hŒ;``size_t data_len`` the length of the data in the sg_table ”h]”(jS)�”}”(hŒ``size_t data_len``”h]”j )�”}”(hj¸h]”hŒsize_t data_len”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¶ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M,hj²ubjm)�”}”(hhh]”hà)�”}”(hŒ&the length of the data in the sg_table”h]”hŒ&the length of the data in the sg_table”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jÍh´M,hjÎubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj²ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jÍh´M,hj¸ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jGhjœubhà)�”}”(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&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M.hjœubhà)�”}”(hŒthe number of bytes copied”h]”hŒthe number of bytes copied”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M.hjœubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j)hjÜ h²hh³Nh´Nubjî )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jú Œdev_coredump_put (C function)”Œc.dev_coredump_put”hNt”auh1jí hjÜ h²hh³Nh´Nubjÿ )�”}”(hhh]”(j )�”}”(hŒ*void dev_coredump_put (struct device *dev)”h]”j )�”}”(hŒ)void dev_coredump_put(struct device *dev)”h]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hj4h²hh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M@ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj4h²hh³jFh´M@ubj3 )�”}”(hŒdev_coredump_put”h]”j9 )�”}”(hŒdev_coredump_put”h]”hŒdev_coredump_put”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjUubah}”(h]”h ]”(jL jM eh"]”h$]”h&]”hÅhÆuh1j2 hj4h²hh³jFh´M@ubjR )�”}”(hŒ(struct device *dev)”h]”jX )�”}”(hŒstruct device *dev”h]”(j^ )�”}”(hja h]”hŒstruct”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”jj ah"]”h$]”h&]”uh1j] hjqubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjqubh)�”}”(hhh]”j9 )�”}”(hŒdevice”h]”hŒdevice”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj�ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j•Œmodname”NŒ classname”Njš j� )�”}”j  ]”j£ )�”}”j– j[sbŒc.dev_coredump_put”†”asbuh1hhjqubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjqubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjqubj9 )�”}”(hŒdev”h]”hŒdev”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjqubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjmubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jQ hj4h²hh³jFh´M@ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjôˆuh1j jõjöhj0h²hh³jFh´M@ubah}”(h]”j+ah ]”(jújûeh"]”h$]”h&]”jÿˆj)jhuh1j h³jFh´M@hj-h²hubj)�”}”(hhh]”hà)�”}”(hŒremove device coredump”h]”hŒremove device coredump”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M@hjõh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj-h²hh³jFh´M@ubeh}”(h]”h ]”(j” Œfunction”eh"]”h$]”h&]”j#j” j$jj%jj&‰j'‰j(‰uh1jþ h²hhjÜ h³Nh´Nubj*)�”}”(hXI**Parameters** ``struct device *dev`` the struct device for the crashed device **Description** dev_coredump_put() removes coredump, if exists, for a given device from the file system and free its associated data otherwise, does nothing. It is useful for modules that do not want to keep coredump available after its unload.”h]”(hà)�”}”(hŒ**Parameters**”h]”j')�”}”(hjh]”hŒ Parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MDhjubjH)�”}”(hhh]”jM)�”}”(hŒ@``struct device *dev`` the struct device for the crashed device ”h]”(jS)�”}”(hŒ``struct device *dev``”h]”j )�”}”(hj9h]”hŒstruct device *dev”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MAhj3ubjm)�”}”(hhh]”hà)�”}”(hŒ(the struct device for the crashed device”h]”hŒ(the struct device for the crashed device”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jNh´MAhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jNh´MAhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jGhjubhà)�”}”(hŒ**Description**”h]”j')�”}”(hjth]”hŒ Description”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjrubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MChjubhà)�”}”(hŒ�dev_coredump_put() removes coredump, if exists, for a given device from the file system and free its associated data otherwise, does nothing.”h]”hŒ�dev_coredump_put() removes coredump, if exists, for a given device from the file system and free its associated data otherwise, does nothing.”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MBhjubhà)�”}”(hŒVIt is useful for modules that do not want to keep coredump available after its unload.”h]”hŒVIt is useful for modules that do not want to keep coredump available after its unload.”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MEhjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j)hjÜ h²hh³Nh´Nubjî )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jú Œ"dev_coredumpm_timeout (C function)”Œc.dev_coredumpm_timeout”hNt”auh1jí hjÜ h²hh³Nh´Nubjÿ )�”}”(hhh]”(j )�”}”(hŒõvoid dev_coredumpm_timeout (struct device *dev, struct module *owner, void *data, size_t datalen, gfp_t gfp, ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen), void (*free)(void *data), unsigned long timeout)”h]”j )�”}”(hŒôvoid dev_coredumpm_timeout(struct device *dev, struct module *owner, void *data, size_t datalen, gfp_t gfp, ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen), void (*free)(void *data), unsigned long timeout)”h]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjÄh²hh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MWubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjÄh²hh³jÖh´MWubj3 )�”}”(hŒdev_coredumpm_timeout”h]”j9 )�”}”(hŒdev_coredumpm_timeout”h]”hŒdev_coredumpm_timeout”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjåubah}”(h]”h ]”(jL jM eh"]”h$]”h&]”hÅhÆuh1j2 hjÄh²hh³jÖh´MWubjR )�”}”(hŒÚ(struct device *dev, struct module *owner, void *data, size_t datalen, gfp_t gfp, ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen), void (*free)(void *data), unsigned long timeout)”h]”(jX )�”}”(hŒstruct device *dev”h]”(j^ )�”}”(hja h]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jj ah"]”h$]”h&]”uh1j] hjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubh)�”}”(hhh]”j9 )�”}”(hŒdevice”h]”hŒdevice”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j%Œmodname”NŒ classname”Njš j� )�”}”j  ]”j£ )�”}”j– jësbŒc.dev_coredumpm_timeout”†”asbuh1hhjubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjubj9 )�”}”(hŒdev”h]”hŒdev”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjýubjX )�”}”(hŒstruct module *owner”h]”(j^ )�”}”(hja h]”hŒstruct”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”jj ah"]”h$]”h&]”uh1j] hjsubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjsubh)�”}”(hhh]”j9 )�”}”(hŒmodule”h]”hŒmodule”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj’ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j—Œmodname”NŒ classname”Njš j� )�”}”j  ]”j?Œc.dev_coredumpm_timeout”†”asbuh1hhjsubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjsubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjsubj9 )�”}”(hŒowner”h]”hŒowner”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjsubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjýubjX )�”}”(hŒ void *data”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ãubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjãubj9 )�”}”(hŒdata”h]”hŒdata”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjãubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjýubjX )�”}”(hŒsize_t datalen”h]”(h)�”}”(hhh]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj)ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j.Œmodname”NŒ classname”Njš j� )�”}”j  ]”j?Œc.dev_coredumpm_timeout”†”asbuh1hhj%ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj%ubj9 )�”}”(hŒdatalen”h]”hŒdatalen”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj%ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjýubjX )�”}”(hŒ gfp_t gfp”h]”(h)�”}”(hhh]”j9 )�”}”(hŒgfp_t”h]”hŒgfp_t”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjqubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jvŒmodname”NŒ classname”Njš j� )�”}”j  ]”j?Œc.dev_coredumpm_timeout”†”asbuh1hhjmubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjmubj9 )�”}”(hŒgfp”h]”hŒgfp”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjmubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjýubjX )�”}”(hŒVssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)”h]”(h)�”}”(hhh]”j9 )�”}”(hŒssize_t”h]”hŒssize_t”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj¹ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j¾Œmodname”NŒ classname”Njš j� )�”}”j  ]”j?Œc.dev_coredumpm_timeout”†”asbuh1hhjµubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjµubj· )�”}”(hjSh]”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µubj9 )�”}”(hŒread”h]”hŒread”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjµubj· )�”}”(hj|h]”hŒ)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjµubj· )�”}”(hjSh]”hŒ(”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjµubj )�”}”(hŒchar”h]”hŒchar”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjµubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjµubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjµubj9 )�”}”(hŒbuffer”h]”hŒbuffer”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjµubj· )�”}”(hjÎh]”hŒ,”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjµubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjµubh)�”}”(hhh]”j9 )�”}”(hŒloff_t”h]”hŒloff_t”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj|ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”j�Œmodname”NŒ classname”Njš j� )�”}”j  ]”j?Œc.dev_coredumpm_timeout”†”asbuh1hhjµubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjµubj9 )�”}”(hŒoffset”h]”hŒoffset”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjµubj· )�”}”(hjÎh]”hŒ,”…”�”}”(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]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÔubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jÙŒmodname”NŒ classname”Njš j� )�”}”j  ]”j?Œc.dev_coredumpm_timeout”†”asbuh1hhjµubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjµubj9 )�”}”(hŒcount”h]”hŒcount”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjµubj· )�”}”(hjÎh]”hŒ,”…”�”}”(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 )�”}”(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µubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjµubj9 )�”}”(hŒdata”h]”hŒdata”…”�”}”(hjU h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjµubj· )�”}”(hjÎh]”hŒ,”…”�”}”(hjc h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjµubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjp h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjµubh)�”}”(hhh]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj~ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jƒ Œmodname”NŒ classname”Njš j� )�”}”j  ]”j?Œc.dev_coredumpm_timeout”†”asbuh1hhjµubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjŸ h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjµubj9 )�”}”(hŒdatalen”h]”hŒdatalen”…”�”}”(hj­ h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjµubj· )�”}”(hj|h]”hŒ)”…”�”}”(hj» h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjµubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjýubjX )�”}”(hŒvoid (*free)(void *data)”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Ï ubj· )�”}”(hjSh]”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Ï ubj9 )�”}”(hŒfree”h]”hŒfree”…”�”}”(hj !h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÏ ubj· )�”}”(hj|h]”hŒ)”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjÏ ubj· )�”}”(hjSh]”hŒ(”…”�”}”(hj$!h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjÏ ubj )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj1!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Œ*”…”�”}”(hjM!h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjÏ ubj9 )�”}”(hŒdata”h]”hŒdata”…”�”}”(hjZ!h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÏ ubj· )�”}”(hj|h]”hŒ)”…”�”}”(hjh!h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hjÏ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjýubjX )�”}”(hŒunsigned long timeout”h]”(j )�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(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 )�”}”(hŒlong”h]”hŒlong”…”�”}”(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|!ubj9 )�”}”(hŒtimeout”h]”hŒtimeout”…”�”}”(hj¸!h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj|!ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hjýubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jQ hjÄh²hh³jÖh´MWubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjôˆuh1j jõjöhjÀh²hh³jÖh´MWubah}”(h]”j»ah ]”(jújûeh"]”h$]”h&]”jÿˆj)jhuh1j h³jÖh´MWhj½h²hubj)�”}”(hhh]”hà)�”}”(hŒDcreate device coredump with read/free methods with a custom timeout.”h]”hŒDcreate device coredump with read/free methods with a custom timeout.”…”�”}”(hjâ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MWhjß!h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj½h²hh³jÖh´MWubeh}”(h]”h ]”(j” Œfunction”eh"]”h$]”h&]”j#j” j$jú!j%jú!j&‰j'‰j(‰uh1jþ h²hhjÜ h³Nh´Nubj*)�”}”(hXl**Parameters** ``struct device *dev`` the struct device for the crashed device ``struct module *owner`` the module that contains the read/free functions, use ``THIS_MODULE`` ``void *data`` data cookie for the **read**/**free** functions ``size_t datalen`` length of the data ``gfp_t gfp`` allocation flags ``ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)`` function to read from the given buffer ``void (*free)(void *data)`` function to free the given buffer ``unsigned long timeout`` time in jiffies to remove coredump **Description** Creates a new device coredump for the given device. If a previous one hasn't been read yet, the new coredump is discarded. The data lifetime is determined by the device coredump framework and when it is no longer needed the **free** function will be called to free the data.”h]”(hà)�”}”(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&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M[hjþ!ubjH)�”}”(hhh]”(jM)�”}”(hŒ@``struct device *dev`` the struct device for the crashed device ”h]”(jS)�”}”(hŒ``struct device *dev``”h]”j )�”}”(hj#"h]”hŒstruct device *dev”…”�”}”(hj%"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj!"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MYhj"ubjm)�”}”(hhh]”hà)�”}”(hŒ(the struct device for the crashed device”h]”hŒ(the struct device for the crashed device”…”�”}”(hj<"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j8"h´MYhj9"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j8"h´MYhj"ubjM)�”}”(hŒ_``struct module *owner`` the module that contains the read/free functions, use ``THIS_MODULE`` ”h]”(jS)�”}”(hŒ``struct module *owner``”h]”j )�”}”(hj\"h]”hŒstruct module *owner”…”�”}”(hj^"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZ"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MZhjV"ubjm)�”}”(hhh]”hà)�”}”(hŒEthe module that contains the read/free functions, use ``THIS_MODULE``”h]”(hŒ6the module that contains the read/free functions, use ”…”�”}”(hju"h²hh³Nh´Nubj )�”}”(hŒ``THIS_MODULE``”h]”hŒ THIS_MODULE”…”�”}”(hj}"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhju"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jq"h´MZhjr"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjV"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jq"h´MZhj"ubjM)�”}”(hŒ?``void *data`` data cookie for the **read**/**free** functions ”h]”(jS)�”}”(hŒ``void *data``”h]”j )�”}”(hj£"h]”hŒ void *data”…”�”}”(hj¥"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¡"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M[hj�"ubjm)�”}”(hhh]”hà)�”}”(hŒ/data cookie for the **read**/**free** functions”h]”(hŒdata cookie for the ”…”�”}”(hj¼"h²hh³Nh´Nubj')�”}”(hŒ**read**”h]”hŒread”…”�”}”(hjÄ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hj¼"ubhŒ/”…”�”}”(hj¼"h²hh³Nh´Nubj')�”}”(hŒ**free**”h]”hŒfree”…”�”}”(hjÖ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hj¼"ubhŒ functions”…”�”}”(hj¼"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j¸"h´M[hj¹"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj�"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j¸"h´M[hj"ubjM)�”}”(hŒ&``size_t datalen`` length of the data ”h]”(jS)�”}”(hŒ``size_t datalen``”h]”j )�”}”(hj#h]”hŒsize_t datalen”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjþ"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M\hjú"ubjm)�”}”(hhh]”hà)�”}”(hŒlength of the data”h]”hŒlength of the data”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j#h´M\hj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjú"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j#h´M\hj"ubjM)�”}”(hŒ``gfp_t gfp`` allocation flags ”h]”(jS)�”}”(hŒ ``gfp_t gfp``”h]”j )�”}”(hj9#h]”hŒ gfp_t gfp”…”�”}”(hj;#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj7#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M]hj3#ubjm)�”}”(hhh]”hà)�”}”(hŒallocation flags”h]”hŒallocation flags”…”�”}”(hjR#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jN#h´M]hjO#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj3#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jN#h´M]hj"ubjM)�”}”(hŒ‚``ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)`` function to read from the given buffer ”h]”(jS)�”}”(hŒZ``ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)``”h]”j )�”}”(hjr#h]”hŒVssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen)”…”�”}”(hjt#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjp#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M^hjl#ubjm)�”}”(hhh]”hà)�”}”(hŒ&function to read from the given buffer”h]”hŒ&function to read from the given buffer”…”�”}”(hj‹#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j‡#h´M^hjˆ#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjl#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j‡#h´M^hj"ubjM)�”}”(hŒ?``void (*free)(void *data)`` function to free the given buffer ”h]”(jS)�”}”(hŒ``void (*free)(void *data)``”h]”j )�”}”(hj«#h]”hŒvoid (*free)(void *data)”…”�”}”(hj­#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj©#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M_hj¥#ubjm)�”}”(hhh]”hà)�”}”(hŒ!function to free the given buffer”h]”hŒ!function to free the given buffer”…”�”}”(hjÄ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jÀ#h´M_hjÁ#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj¥#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jÀ#h´M_hj"ubjM)�”}”(hŒ=``unsigned long timeout`` time in jiffies to remove coredump ”h]”(jS)�”}”(hŒ``unsigned long timeout``”h]”j )�”}”(hjä#h]”hŒunsigned long timeout”…”�”}”(hjæ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjâ#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´M`hjÞ#ubjm)�”}”(hhh]”hà)�”}”(hŒ"time in jiffies to remove coredump”h]”hŒ"time in jiffies to remove coredump”…”�”}”(hjý#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jù#h´M`hjú#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjÞ#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jù#h´M`hj"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jGhjþ!ubhà)�”}”(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&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mbhjþ!ubhà)�”}”(hXCreates a new device coredump for the given device. If a previous one hasn't been read yet, the new coredump is discarded. The data lifetime is determined by the device coredump framework and when it is no longer needed the **free** function will be called to free the data.”h]”(hŒâCreates a new device coredump for the given device. If a previous one hasn’t been read yet, the new coredump is discarded. The data lifetime is determined by the device coredump framework and when it is no longer needed the ”…”�”}”(hj5$h²hh³Nh´Nubj')�”}”(hŒ**free**”h]”hŒfree”…”�”}”(hj=$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hj5$ubhŒ* function will be called to free the data.”…”�”}”(hj5$h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´Mahjþ!ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j)hjÜ h²hh³Nh´Nubjî )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jú Œdev_coredumpsg (C function)”Œc.dev_coredumpsg”hNt”auh1jí hjÜ h²hh³Nh´Nubjÿ )�”}”(hhh]”(j )�”}”(hŒ^void dev_coredumpsg (struct device *dev, struct scatterlist *table, size_t datalen, gfp_t gfp)”h]”j )�”}”(hŒ]void dev_coredumpsg(struct device *dev, struct scatterlist *table, size_t datalen, gfp_t gfp)”h]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjv$h²hh³Nh´Nubah}”(h]”h ]”j ah"]”h$]”h&]”uh1j hjr$h²hh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MÁubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj…$h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjr$h²hh³j„$h´MÁubj3 )�”}”(hŒdev_coredumpsg”h]”j9 )�”}”(hŒdev_coredumpsg”h]”hŒdev_coredumpsg”…”�”}”(hj—$h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj“$ubah}”(h]”h ]”(jL jM eh"]”h$]”h&]”hÅhÆuh1j2 hjr$h²hh³j„$h´MÁubjR )�”}”(hŒJ(struct device *dev, struct scatterlist *table, size_t datalen, gfp_t gfp)”h]”(jX )�”}”(hŒstruct device *dev”h]”(j^ )�”}”(hja h]”hŒstruct”…”�”}”(hj³$h²hh³Nh´Nubah}”(h]”h ]”jj ah"]”h$]”h&]”uh1j] hj¯$ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÀ$h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj¯$ubh)�”}”(hhh]”j9 )�”}”(hŒdevice”h]”hŒdevice”…”�”}”(hjÑ$h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÎ$ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jÓ$Œmodname”NŒ classname”Njš j� )�”}”j  ]”j£ )�”}”j– j™$sbŒc.dev_coredumpsg”†”asbuh1hhj¯$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¯$ubj9 )�”}”(hŒdev”h]”hŒdev”…”�”}”(hj %h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj¯$ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj«$ubjX )�”}”(hŒstruct scatterlist *table”h]”(j^ )�”}”(hja h]”hŒstruct”…”�”}”(hj%%h²hh³Nh´Nubah}”(h]”h ]”jj ah"]”h$]”h&]”uh1j] hj!%ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj2%h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj!%ubh)�”}”(hhh]”j9 )�”}”(hŒ scatterlist”h]”hŒ scatterlist”…”�”}”(hjC%h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj@%ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jE%Œmodname”NŒ classname”Njš j� )�”}”j  ]”jí$Œc.dev_coredumpsg”†”asbuh1hhj!%ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hja%h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj!%ubj· )�”}”(hjº h]”hŒ*”…”�”}”(hjo%h²hh³Nh´Nubah}”(h]”h ]”jà ah"]”h$]”h&]”uh1j¶ hj!%ubj9 )�”}”(hŒtable”h]”hŒtable”…”�”}”(hj|%h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj!%ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj«$ubjX )�”}”(hŒsize_t datalen”h]”(h)�”}”(hhh]”j9 )�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj˜%h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj•%ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jš%Œmodname”NŒ classname”Njš j� )�”}”j  ]”jí$Œc.dev_coredumpsg”†”asbuh1hhj‘%ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¶%h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hj‘%ubj9 )�”}”(hŒdatalen”h]”hŒdatalen”…”�”}”(hjÄ%h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj‘%ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj«$ubjX )�”}”(hŒ gfp_t gfp”h]”(h)�”}”(hhh]”j9 )�”}”(hŒgfp_t”h]”hŒgfp_t”…”�”}”(hjà%h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÝ%ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j” Œreftype”j– Œ reftarget”jâ%Œmodname”NŒ classname”Njš j� )�”}”j  ]”jí$Œc.dev_coredumpsg”†”asbuh1hhjÙ%ubj" )�”}”(hŒ ”h]”hŒ ”…”�”}”(hjþ%h²hh³Nh´Nubah}”(h]”h ]”j. ah"]”h$]”h&]”uh1j! hjÙ%ubj9 )�”}”(hŒgfp”h]”hŒgfp”…”�”}”(hj &h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjÙ%ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jW hj«$ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jQ hjr$h²hh³j„$h´MÁubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjôˆuh1j jõjöhjn$h²hh³j„$h´MÁubah}”(h]”ji$ah ]”(jújûeh"]”h$]”h&]”jÿˆj)jhuh1j h³j„$h´MÁhjk$h²hubj)�”}”(hhh]”hà)�”}”(hŒ>create device coredump that uses scatterlist as data parameter”h]”hŒ>create device coredump that uses scatterlist as data parameter”…”�”}”(hj6&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MÁhj3&h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjk$h²hh³j„$h´MÁubeh}”(h]”h ]”(j” Œfunction”eh"]”h$]”h&]”j#j” j$jN&j%jN&j&‰j'‰j(‰uh1jþ h²hhjÜ h³Nh´Nubj*)�”}”(hXÐ**Parameters** ``struct device *dev`` the struct device for the crashed device ``struct scatterlist *table`` the dump data ``size_t datalen`` length of the data ``gfp_t gfp`` allocation flags **Description** Creates a new device coredump for the given device. If a previous one hasn't been read yet, the new coredump is discarded. The data lifetime is determined by the device coredump framework and when it is no longer needed it will free the data.”h]”(hà)�”}”(hŒ**Parameters**”h]”j')�”}”(hjX&h]”hŒ Parameters”…”�”}”(hjZ&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjV&ubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MÅhjR&ubjH)�”}”(hhh]”(jM)�”}”(hŒ@``struct device *dev`` the struct device for the crashed device ”h]”(jS)�”}”(hŒ``struct device *dev``”h]”j )�”}”(hjw&h]”hŒstruct device *dev”…”�”}”(hjy&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhju&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MÃhjq&ubjm)�”}”(hhh]”hà)�”}”(hŒ(the struct device for the crashed device”h]”hŒ(the struct device for the crashed device”…”�”}”(hj�&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jŒ&h´MÃhj�&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjq&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jŒ&h´MÃhjn&ubjM)�”}”(hŒ,``struct scatterlist *table`` the dump data ”h]”(jS)�”}”(hŒ``struct scatterlist *table``”h]”j )�”}”(hj°&h]”hŒstruct scatterlist *table”…”�”}”(hj²&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj®&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MÄhjª&ubjm)�”}”(hhh]”hà)�”}”(hŒ the dump data”h]”hŒ the dump data”…”�”}”(hjÉ&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jÅ&h´MÄhjÆ&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjª&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jÅ&h´MÄhjn&ubjM)�”}”(hŒ&``size_t datalen`` length of the data ”h]”(jS)�”}”(hŒ``size_t datalen``”h]”j )�”}”(hjé&h]”hŒsize_t datalen”…”�”}”(hjë&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjç&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MÅhjã&ubjm)�”}”(hhh]”hà)�”}”(hŒlength of the data”h]”hŒlength of the data”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³jþ&h´MÅhjÿ&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhjã&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³jþ&h´MÅhjn&ubjM)�”}”(hŒ``gfp_t gfp`` allocation flags ”h]”(jS)�”}”(hŒ ``gfp_t gfp``”h]”j )�”}”(hj"'h]”hŒ gfp_t gfp”…”�”}”(hj$'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj 'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jRh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MÆhj'ubjm)�”}”(hhh]”hà)�”}”(hŒallocation flags”h]”hŒallocation flags”…”�”}”(hj;'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³j7'h´MÆhj8'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhj'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jLh³j7'h´MÆhjn&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jGhjR&ubhà)�”}”(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&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MÈhjR&ubhà)�”}”(hŒòCreates a new device coredump for the given device. If a previous one hasn't been read yet, the new coredump is discarded. The data lifetime is determined by the device coredump framework and when it is no longer needed it will free the data.”h]”hŒôCreates a new device coredump for the given device. If a previous one hasn’t been read yet, the new coredump is discarded. The data lifetime is determined by the device coredump framework and when it is no longer needed it will free the data.”…”�”}”(hjs'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hßh³Œ€/var/lib/git/docbuild/linux/Documentation/process/debugging/driver_development_debugging_guide:233: ./drivers/base/devcoredump.c”h´MÇhjR&ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j)hjÜ h²hh³Nh´Nubhà)�”}”(hŒ **Copyright** ©2024 : Collabora”h]”(j')�”}”(hŒ **Copyright**”h]”hŒ Copyright”…”�”}”(hj�'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hj‰'ubhŒ ©2024 : Collabora”…”�”}”(hj‰'h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hßh³hÇh´KëhjÜ h²hubeh}”(h]”j€ah ]”h"]”Œdevcoredump interfaces”ah$]”h&]”uh1hÈhj^ h²hh³hÇh´Kåubeh}”(h]”jaah ]”h"]”Œdevice coredump”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KÐubeh}”(h]”jmah ]”h"]”Œ'debugging advice for driver development”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jÝ'Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j·'jmj±j­jýjŒj<j«jÐjÍjcjïjöjjãjàjÉj?jÂj^jÛ jŒj[ j®j` jÍjÐ jïj jjT j3j°'jaj©'j€uŒ nametypes”}”(j·'‰j±‰jý‰j<‰jЉjc‰jö‰jãˆjɉj‰jÛ ‰j[ ‰j` ‰jÐ ‰j ‰jT ‰j°'‰j©'‰uh}”(jmhÊj­j>jŒjÂj«jájÍj?jïjÓjjfjàjÚj?jj^jjŒjÌj®jÞ jÍjï jïjc jjÓ j3j jaj^ j€jÜ jü j jejjjcjhj´j¹j+j0j»jÀji$jn$hÞj_j†j}j¥jœjÇj¾jéjàj jj9j0jXjOj†j}j¨jŸjÇj¾jéjàj jj-j$j[jRjzjquŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”jë'Ks…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.