€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ /translations/zh_CN/trace/fprobe”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ /translations/zh_TW/trace/fprobe”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ /translations/it_IT/trace/fprobe”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ /translations/ja_JP/trace/fprobe”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ /translations/ko_KR/trace/fprobe”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ /translations/pt_BR/trace/fprobe”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ /translations/sp_SP/trace/fprobe”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ:/var/lib/git/docbuild/linux/Documentation/trace/fprobe.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ"Fprobe - Function entry/exit probe”h]”hŒ"Fprobe - Function entry/exit probe”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´Kubh¶)�”}”(hŒ.Author: Masami Hiramatsu ”h]”hŒ.Author: Masami Hiramatsu ”…”�”}”hhÝsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Introduction”h]”hŒ Introduction”…”�”}”(hhîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhëh²hh³hÇh´K ubhŒ paragraph”“”)�”}”(hXŸFprobe is a function entry/exit probe based on the function-graph tracing feature in ftrace. Instead of tracing all functions, if you want to attach callbacks on specific function entry and exit, similar to the kprobes and kretprobes, you can use fprobe. Compared with kprobes and kretprobes, fprobe gives faster instrumentation for multiple functions with single handler. This document describes how to use fprobe.”h]”hXŸFprobe is a function entry/exit probe based on the function-graph tracing feature in ftrace. Instead of tracing all functions, if you want to attach callbacks on specific function entry and exit, similar to the kprobes and kretprobes, you can use fprobe. Compared with kprobes and kretprobes, fprobe gives faster instrumentation for multiple functions with single handler. This document describes how to use fprobe.”…”�”}”(hhþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K hhëh²hubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒThe usage of fprobe”h]”hŒThe usage of fprobe”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´Kubhý)�”}”(hŒÊThe fprobe is a wrapper of ftrace (+ kretprobe-like return callback) to attach callbacks to multiple function entry and exit. User needs to set up the `struct fprobe` and pass it to `register_fprobe()`.”h]”(hŒ—The fprobe is a wrapper of ftrace (+ kretprobe-like return callback) to attach callbacks to multiple function entry and exit. User needs to set up the ”…”�”}”(hj%h²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`struct fprobe`”h]”hŒ struct fprobe”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj%ubhŒ and pass it to ”…”�”}”(hj%h²hh³Nh´Nubj.)�”}”(hŒ`register_fprobe()`”h]”hŒregister_fprobe()”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj%ubhŒ.”…”�”}”(hj%h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khjh²hubhý)�”}”(hŒjTypically, `fprobe` data structure is initialized with the `entry_handler` and/or `exit_handler` as below.”h]”(hŒ Typically, ”…”�”}”(hjYh²hh³Nh´Nubj.)�”}”(hŒ`fprobe`”h]”hŒfprobe”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjYubhŒ( data structure is initialized with the ”…”�”}”(hjYh²hh³Nh´Nubj.)�”}”(hŒ`entry_handler`”h]”hŒ entry_handler”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjYubhŒ and/or ”…”�”}”(hjYh²hh³Nh´Nubj.)�”}”(hŒ`exit_handler`”h]”hŒ exit_handler”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjYubhŒ as below.”…”�”}”(hjYh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khjh²hubhŒ literal_block”“”)�”}”(hŒnstruct fprobe fp = { .entry_handler = my_entry_callback, .exit_handler = my_exit_callback, };”h]”hŒnstruct fprobe fp = { .entry_handler = my_entry_callback, .exit_handler = my_exit_callback, };”…”�”}”hjŸsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œc”Œhighlight_args”}”uh1j�h³hÇh´Khjh²hubhý)�”}”(hŒ¯To enable the fprobe, call one of register_fprobe(), register_fprobe_ips(), and register_fprobe_syms(). These functions register the fprobe with different types of parameters.”h]”hŒ¯To enable the fprobe, call one of register_fprobe(), register_fprobe_ips(), and register_fprobe_syms(). These functions register the fprobe with different types of parameters.”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K%hjh²hubhý)�”}”(hŒ€The register_fprobe() enables a fprobe by function-name filters. E.g. this enables @fp on "func*()" function except "func2()".::”h]”hŒ‡The register_fprobe() enables a fprobe by function-name filters. E.g. this enables @fp on “func*()â€� function except “func2()â€�.:”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K)hjh²hubjž)�”}”(hŒ'register_fprobe(&fp, "func*", "func2");”h]”hŒ'register_fprobe(&fp, "func*", "func2");”…”�”}”hjÎsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j�h³hÇh´K,hjh²hubhý)�”}”(hŒMThe register_fprobe_ips() enables a fprobe by ftrace-location addresses. E.g.”h]”hŒMThe register_fprobe_ips() enables a fprobe by ftrace-location addresses. E.g.”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K.hjh²hubjž)�”}”(hŒRunsigned long ips[] = { 0x.... }; register_fprobe_ips(&fp, ips, ARRAY_SIZE(ips));”h]”hŒRunsigned long ips[] = { 0x.... }; register_fprobe_ips(&fp, ips, ARRAY_SIZE(ips));”…”�”}”hjêsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj­‰j®j¯j°}”uh1j�h³hÇh´K1hjh²hubhý)�”}”(hŒEAnd the register_fprobe_syms() enables a fprobe by symbol names. E.g.”h]”hŒEAnd the register_fprobe_syms() enables a fprobe by symbol names. E.g.”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K7hjh²hubjž)�”}”(hŒ^char syms[] = {"func1", "func2", "func3"}; register_fprobe_syms(&fp, syms, ARRAY_SIZE(syms));”h]”hŒ^char syms[] = {"func1", "func2", "func3"}; register_fprobe_syms(&fp, syms, ARRAY_SIZE(syms));”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj­‰j®j¯j°}”uh1j�h³hÇh´K:hjh²hubhý)�”}”(hŒ6To disable (remove from functions) this fprobe, call::”h]”hŒ5To disable (remove from functions) this fprobe, call:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K@hjh²hubjž)�”}”(hŒunregister_fprobe(&fp);”h]”hŒunregister_fprobe(&fp);”…”�”}”hj$sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j�h³hÇh´KBhjh²hubhý)�”}”(hŒ1You can temporally (soft) disable the fprobe by::”h]”hŒ0You can temporally (soft) disable the fprobe by:”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KDhjh²hubjž)�”}”(hŒdisable_fprobe(&fp);”h]”hŒdisable_fprobe(&fp);”…”�”}”hj@sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j�h³hÇh´KFhjh²hubhý)�”}”(hŒand resume by::”h]”hŒand resume by:”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KHhjh²hubjž)�”}”(hŒenable_fprobe(&fp);”h]”hŒenable_fprobe(&fp);”…”�”}”hj\sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j�h³hÇh´KJhjh²hubhý)�”}”(hŒ.The above is defined by including the header::”h]”hŒ-The above is defined by including the header:”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KLhjh²hubjž)�”}”(hŒ#include ”h]”hŒ#include ”…”�”}”hjxsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j�h³hÇh´KNhjh²hubhý)�”}”(hŒ«Same as ftrace, the registered callbacks will start being called some time after the register_fprobe() is called and before it returns. See Documentation/trace/ftrace.rst.”h]”hŒ«Same as ftrace, the registered callbacks will start being called some time after the register_fprobe() is called and before it returns. See Documentation/trace/ftrace.rst.”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KPhjh²hubhý)�”}”(hŒÁAlso, the unregister_fprobe() will guarantee that both enter and exit handlers are no longer being called by functions after unregister_fprobe() returns as same as unregister_ftrace_function().”h]”hŒÁAlso, the unregister_fprobe() will guarantee that both enter and exit handlers are no longer being called by functions after unregister_fprobe() returns as same as unregister_ftrace_function().”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KThjh²hubeh}”(h]”Œthe-usage-of-fprobe”ah ]”h"]”Œthe usage of fprobe”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒThe fprobe entry/exit handler”h]”hŒThe fprobe entry/exit handler”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjªh²hh³hÇh´KYubhý)�”}”(hŒAThe prototype of the entry/exit callback function are as follows:”h]”hŒAThe prototype of the entry/exit callback function are as follows:”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K[hjªh²hubjž)�”}”(hXint entry_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct ftrace_regs *fregs, void *entry_data); void exit_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct ftrace_regs *fregs, void *entry_data);”h]”hXint entry_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct ftrace_regs *fregs, void *entry_data); void exit_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct ftrace_regs *fregs, void *entry_data);”…”�”}”hjÉsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj­‰j®j¯j°}”uh1j�h³hÇh´K]hjªh²hubhý)�”}”(hŒ¬Note that the @entry_ip is saved at function entry and passed to exit handler. If the entry callback function returns !0, the corresponding exit callback will be cancelled.”h]”hŒ¬Note that the @entry_ip is saved at function entry and passed to exit handler. If the entry callback function returns !0, the corresponding exit callback will be cancelled.”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kchjªh²hubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒÅ@fp This is the address of `fprobe` data structure related to this handler. You can embed the `fprobe` to your data structure and get it by container_of() macro from @fp. The @fp must not be NULL. ”h]”(hŒterm”“”)�”}”(hŒ@fp”h]”hŒ@fp”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³hÇh´KkhjíubhŒ definition”“”)�”}”(hhh]”hý)�”}”(hŒÀThis is the address of `fprobe` data structure related to this handler. You can embed the `fprobe` to your data structure and get it by container_of() macro from @fp. The @fp must not be NULL.”h]”(hŒThis is the address of ”…”�”}”(hjh²hh³Nh´Nubj.)�”}”(hŒ`fprobe`”h]”hŒfprobe”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjubhŒ; data structure related to this handler. You can embed the ”…”�”}”(hjh²hh³Nh´Nubj.)�”}”(hŒ`fprobe`”h]”hŒfprobe”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjubhŒ^ to your data structure and get it by container_of() macro from @fp. The @fp must not be NULL.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kihjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjíubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³hÇh´Kkhjèubjì)�”}”(hŒÈ@entry_ip This is the ftrace address of the traced function (both entry and exit). Note that this may not be the actual entry address of the function but the address where the ftrace is instrumented. ”h]”(jò)�”}”(hŒ @entry_ip”h]”hŒ @entry_ip”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³hÇh´KphjDubj)�”}”(hhh]”hý)�”}”(hŒ½This is the ftrace address of the traced function (both entry and exit). Note that this may not be the actual entry address of the function but the address where the ftrace is instrumented.”h]”hŒ½This is the ftrace address of the traced function (both entry and exit). Note that this may not be the actual entry address of the function but the address where the ftrace is instrumented.”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KnhjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjDubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³hÇh´Kphjèh²hubjì)�”}”(hŒŽ@ret_ip This is the return address that the traced function will return to, somewhere in the caller. This can be used at both entry and exit. ”h]”(jò)�”}”(hŒ@ret_ip”h]”hŒ@ret_ip”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³hÇh´Kthjsubj)�”}”(hhh]”hý)�”}”(hŒ…This is the return address that the traced function will return to, somewhere in the caller. This can be used at both entry and exit.”h]”hŒ…This is the return address that the traced function will return to, somewhere in the caller. This can be used at both entry and exit.”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kshj…ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjsubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³hÇh´Kthjèh²hubjì)�”}”(hŒÊ@fregs This is the `ftrace_regs` data structure at the entry and exit. This includes the function parameters, or the return values. So user can access those values via appropriate `ftrace_regs_*` APIs. ”h]”(jò)�”}”(hŒ@fregs”h]”hŒ@fregs”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³hÇh´Kyhj¢ubj)�”}”(hhh]”hý)�”}”(hŒÂThis is the `ftrace_regs` data structure at the entry and exit. This includes the function parameters, or the return values. So user can access those values via appropriate `ftrace_regs_*` APIs.”h]”(hŒ This is the ”…”�”}”(hj·h²hh³Nh´Nubj.)�”}”(hŒ `ftrace_regs`”h]”hŒ ftrace_regs”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj·ubhŒ” data structure at the entry and exit. This includes the function parameters, or the return values. So user can access those values via appropriate ”…”�”}”(hj·h²hh³Nh´Nubj.)�”}”(hŒ`ftrace_regs_*`”h]”hŒ ftrace_regs_*”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj·ubhŒ APIs.”…”�”}”(hj·h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kwhj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¢ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³hÇh´Kyhjèh²hubjì)�”}”(hX*@entry_data This is a local storage to share the data between entry and exit handlers. This storage is NULL by default. If the user specify `exit_handler` field and `entry_data_size` field when registering the fprobe, the storage is allocated and passed to both `entry_handler` and `exit_handler`. ”h]”(jò)�”}”(hŒ @entry_data”h]”hŒ @entry_data”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³hÇh´Khjõubj)�”}”(hhh]”hý)�”}”(hXThis is a local storage to share the data between entry and exit handlers. This storage is NULL by default. If the user specify `exit_handler` field and `entry_data_size` field when registering the fprobe, the storage is allocated and passed to both `entry_handler` and `exit_handler`.”h]”(hŒ€This is a local storage to share the data between entry and exit handlers. This storage is NULL by default. If the user specify ”…”�”}”(hj h²hh³Nh´Nubj.)�”}”(hŒ`exit_handler`”h]”hŒ exit_handler”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj ubhŒ field and ”…”�”}”(hj h²hh³Nh´Nubj.)�”}”(hŒ`entry_data_size`”h]”hŒentry_data_size”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj ubhŒP field when registering the fprobe, the storage is allocated and passed to both ”…”�”}”(hj h²hh³Nh´Nubj.)�”}”(hŒ`entry_handler`”h]”hŒ entry_handler”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj ubhŒ and ”…”�”}”(hj h²hh³Nh´Nubj.)�”}”(hŒ`exit_handler`”h]”hŒ exit_handler”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj ubhŒ.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K|hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjõubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³hÇh´Khjèh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jæhjªh²hh³hÇh´Nubeh}”(h]”Œthe-fprobe-entry-exit-handler”ah ]”h"]”Œthe fprobe entry/exit handler”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KYubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ6Entry data size and exit handlers on the same function”h]”hŒ6Entry data size and exit handlers on the same function”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjzh²hh³hÇh´K‚ubhý)�”}”(hXÒSince the entry data is passed via per-task stack and it has limited size, the entry data size per probe is limited to `15 * sizeof(long)`. You also need to take care that the different fprobes are probing on the same function, this limit becomes smaller. The entry data size is aligned to `sizeof(long)` and each fprobe which has exit handler uses a `sizeof(long)` space on the stack, you should keep the number of fprobes on the same function as small as possible.”h]”(hŒwSince the entry data is passed via per-task stack and it has limited size, the entry data size per probe is limited to ”…”�”}”(hj‹h²hh³Nh´Nubj.)�”}”(hŒ`15 * sizeof(long)`”h]”hŒ15 * sizeof(long)”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj‹ubhŒ˜. You also need to take care that the different fprobes are probing on the same function, this limit becomes smaller. The entry data size is aligned to ”…”�”}”(hj‹h²hh³Nh´Nubj.)�”}”(hŒ`sizeof(long)`”h]”hŒ sizeof(long)”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj‹ubhŒ/ and each fprobe which has exit handler uses a ”…”�”}”(hj‹h²hh³Nh´Nubj.)�”}”(hŒ`sizeof(long)`”h]”hŒ sizeof(long)”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj‹ubhŒe space on the stack, you should keep the number of fprobes on the same function as small as possible.”…”�”}”(hj‹h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K„hjzh²hubeh}”(h]”Œ6entry-data-size-and-exit-handlers-on-the-same-function”ah ]”h"]”Œ6entry data size and exit handlers on the same function”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K‚ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Share the callbacks with kprobes”h]”hŒ Share the callbacks with kprobes”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj×h²hh³hÇh´K�ubhý)�”}”(hŒ¸Since the recursion safeness of the fprobe (and ftrace) is a bit different from the kprobes, this may cause an issue if user wants to run the same code from the fprobe and the kprobes.”h]”hŒ¸Since the recursion safeness of the fprobe (and ftrace) is a bit different from the kprobes, this may cause an issue if user wants to run the same code from the fprobe and the kprobes.”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K�hj×h²hubhý)�”}”(hXKprobes has per-cpu 'current_kprobe' variable which protects the kprobe handler from recursion in all cases. On the other hand, fprobe uses only ftrace_test_recursion_trylock(). This allows interrupt context to call another (or same) fprobe while the fprobe user handler is running.”h]”hXKprobes has per-cpu ‘current_kprobe’ variable which protects the kprobe handler from recursion in all cases. On the other hand, fprobe uses only ftrace_test_recursion_trylock(). This allows interrupt context to call another (or same) fprobe while the fprobe user handler is running.”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K“hj×h²hubhý)�”}”(hXThis is not a matter if the common callback code has its own recursion detection, or it can handle the recursion in the different contexts (normal/interrupt/NMI.) But if it relies on the 'current_kprobe' recursion lock, it has to check kprobe_running() and use kprobe_busy_*() APIs.”h]”hXThis is not a matter if the common callback code has its own recursion detection, or it can handle the recursion in the different contexts (normal/interrupt/NMI.) But if it relies on the ‘current_kprobe’ recursion lock, it has to check kprobe_running() and use kprobe_busy_*() APIs.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K˜hj×h²hubhý)�”}”(hŒ·Fprobe has FPROBE_FL_KPROBE_SHARED flag to do this. If your common callback code will be shared with kprobes, please set FPROBE_FL_KPROBE_SHARED *before* registering the fprobe, like:”h]”(hŒ‘Fprobe has FPROBE_FL_KPROBE_SHARED flag to do this. If your common callback code will be shared with kprobes, please set FPROBE_FL_KPROBE_SHARED ”…”�”}”(hjh²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ*before*”h]”hŒbefore”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ registering the fprobe, like:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kžhj×h²hubjž)�”}”(hŒQfprobe.flags = FPROBE_FL_KPROBE_SHARED; register_fprobe(&fprobe, "func*", NULL);”h]”hŒQfprobe.flags = FPROBE_FL_KPROBE_SHARED; register_fprobe(&fprobe, "func*", NULL);”…”�”}”hj4sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj­‰j®j¯j°}”uh1j�h³hÇh´K¢hj×h²hubhý)�”}”(hŒ(struct fprobe *fp, const char *filter, const char *notfilter)”h]”(jw )�”}”(hŒstruct fprobe *fp”h]”(jc)�”}”(hjfh]”hŒstruct”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”joah"]”h$]”h&]”uh1jbhjªubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjªubh)�”}”(hhh]”jŒ)�”}”(hŒfprobe”h]”hŒfprobe”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjÉubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¯Œreftype”j° Œ reftarget”jÎŒmodname”NŒ classname”Nj´ j· )�”}”jº ]”j½ )�”}”j° j”sbŒc.register_fprobe”†”asbuh1hhjªubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjªubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hjªubjŒ)�”}”(hŒfp”h]”hŒfp”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjªubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj¦ubjw )�”}”(hŒconst char *filter”h]”(jc)�”}”(hŒconst”h]”hŒconst”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”joah"]”h$]”h&]”uh1jbhjubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjubj9 )�”}”(hŒchar”h]”hŒchar”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hjubjŒ)�”}”(hŒfilter”h]”hŒfilter”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj¦ubjw )�”}”(hŒconst char *notfilter”h]”(jc)�”}”(hj"h]”hŒconst”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”joah"]”h$]”h&]”uh1jbhjzubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjzubj9 )�”}”(hŒchar”h]”hŒchar”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjzubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjzubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hjzubjŒ)�”}”(hŒ notfilter”h]”hŒ notfilter”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjzubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj¦ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jp hjmh²hh³jh´M²ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj©ˆuh1j\jªj«hjih²hh³jh´M²ubah}”(h]”jdah ]”(j¯j°eh"]”h$]”h&]”j´ˆjµ)j¶huh1jVh³jh´M²hjfh²hubj¸)�”}”(hhh]”hý)�”}”(hŒ%Register fprobe to ftrace by pattern.”h]”hŒ%Register fprobe to ftrace by pattern.”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M²hjéh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hjfh²hh³jh´M²ubeh}”(h]”h ]”(j¯Œfunction”eh"]”h$]”h&]”jØj¯jÙjjÚjjÛ‰j܉j݉uh1jQh²hhj/h³Nh´Nubjß)�”}”(hXÔ**Parameters** ``struct fprobe *fp`` A fprobe data structure to be registered. ``const char *filter`` A wildcard pattern of probed symbols. ``const char *notfilter`` A wildcard pattern of NOT probed symbols. **Description** Register **fp** to ftrace for enabling the probe on the symbols matched to **filter**. If **notfilter** is not NULL, the symbols matched the **notfilter** are not probed. Return 0 if **fp** is registered successfully, -errno if not.”h]”(hý)�”}”(hŒ**Parameters**”h]”jé)�”}”(hjh]”hŒ Parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M¶hjubjç)�”}”(hhh]”(jì)�”}”(hŒ@``struct fprobe *fp`` A fprobe data structure to be registered. ”h]”(jò)�”}”(hŒ``struct fprobe *fp``”h]”j6)�”}”(hj-h]”hŒstruct fprobe *fp”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hj+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M³hj'ubj)�”}”(hhh]”hý)�”}”(hŒ)A fprobe data structure to be registered.”h]”hŒ)A fprobe data structure to be registered.”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³jBh´M³hjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³jBh´M³hj$ubjì)�”}”(hŒ=``const char *filter`` A wildcard pattern of probed symbols. ”h]”(jò)�”}”(hŒ``const char *filter``”h]”j6)�”}”(hjfh]”hŒconst char *filter”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjdubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M´hj`ubj)�”}”(hhh]”hý)�”}”(hŒ%A wildcard pattern of probed symbols.”h]”hŒ%A wildcard pattern of probed symbols.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³j{h´M´hj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³j{h´M´hj$ubjì)�”}”(hŒD``const char *notfilter`` A wildcard pattern of NOT probed symbols. ”h]”(jò)�”}”(hŒ``const char *notfilter``”h]”j6)�”}”(hjŸh]”hŒconst char *notfilter”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mµhj™ubj)�”}”(hhh]”hý)�”}”(hŒ)A wildcard pattern of NOT probed symbols.”h]”hŒ)A wildcard pattern of NOT probed symbols.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³j´h´Mµhjµubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj™ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³j´h´Mµhj$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jæhjubhý)�”}”(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³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M·hjubhý)�”}”(hŒªRegister **fp** to ftrace for enabling the probe on the symbols matched to **filter**. If **notfilter** is not NULL, the symbols matched the **notfilter** are not probed.”h]”(hŒ Register ”…”�”}”(hjðh²hh³Nh´Nubjé)�”}”(hŒ**fp**”h]”hŒfp”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjðubhŒ< to ftrace for enabling the probe on the symbols matched to ”…”�”}”(hjðh²hh³Nh´Nubjé)�”}”(hŒ **filter**”h]”hŒfilter”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjðubhŒ. If ”…”�”}”(hjðh²hh³Nh´Nubjé)�”}”(hŒ **notfilter**”h]”hŒ notfilter”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjðubhŒ& is not NULL, the symbols matched the ”…”�”}”(hjðh²hh³Nh´Nubjé)�”}”(hŒ **notfilter**”h]”hŒ notfilter”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjðubhŒ are not probed.”…”�”}”(hjðh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M¶hjubhý)�”}”(hŒ=Return 0 if **fp** is registered successfully, -errno if not.”h]”(hŒ Return 0 if ”…”�”}”(hjGh²hh³Nh´Nubjé)�”}”(hŒ**fp**”h]”hŒfp”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjGubhŒ+ is registered successfully, -errno if not.”…”�”}”(hjGh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M¹hjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jÞhj/h²hh³Nh´NubjA)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jMŒ register_fprobe_ips (C function)”Œc.register_fprobe_ips”hNt”auh1j@hj/h²hh³Nh´NubjR)�”}”(hhh]”(jW)�”}”(hŒJint register_fprobe_ips (struct fprobe *fp, unsigned long *addrs, int num)”h]”j])�”}”(hŒIint register_fprobe_ips(struct fprobe *fp, unsigned long *addrs, int num)”h]”(j9 )�”}”(hŒint”h]”hŒint”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj„h²hh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Màubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj„h²hh³j–h´Màubj†)�”}”(hŒregister_fprobe_ips”h]”jŒ)�”}”(hŒregister_fprobe_ips”h]”hŒregister_fprobe_ips”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj¥ubah}”(h]”h ]”(jžjŸeh"]”h$]”h&]”hÅhÆuh1j…hj„h²hh³j–h´Màubjq )�”}”(hŒ2(struct fprobe *fp, unsigned long *addrs, int num)”h]”(jw )�”}”(hŒstruct fprobe *fp”h]”(jc)�”}”(hjfh]”hŒstruct”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”joah"]”h$]”h&]”uh1jbhjÁubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjÁubh)�”}”(hhh]”jŒ)�”}”(hŒfprobe”h]”hŒfprobe”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjàubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¯Œreftype”j° Œ reftarget”jåŒmodname”NŒ classname”Nj´ j· )�”}”jº ]”j½ )�”}”j° j«sbŒc.register_fprobe_ips”†”asbuh1hhjÁubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjÁubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hjÁubjŒ)�”}”(hŒfp”h]”hŒfp”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjÁubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj½ubjw )�”}”(hŒunsigned long *addrs”h]”(j9 )�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj3ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj3ubj9 )�”}”(hŒlong”h]”hŒlong”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&•,j]”uh1j8 hj3ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj3ubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hj3ubjŒ)�”}”(hŒaddrs”h]”hŒaddrs”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj3ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj½ubjw )�”}”(hŒint num”h]”(j9 )�”}”(hŒint”h]”hŒint”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj‘ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj‘ubjŒ)�”}”(hŒnum”h]”hŒnum”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj‘ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj½ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jp 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µ)j¶huh1jVh³j–h´Màhj}h²hubj¸)�”}”(hhh]”hý)�”}”(hŒ%Register fprobe to ftrace by address.”h]”hŒ%Register fprobe to ftrace by address.”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´MàhjØh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hj}h²hh³j–h´Màubeh}”(h]”h ]”(j¯Œfunction”eh"]”h$]”h&]”jØj¯jÙjójÚjójÛ‰j܉j݉uh1jQh²hhj/h³Nh´Nubjß)�”}”(hX***Parameters** ``struct fprobe *fp`` A fprobe data structure to be registered. ``unsigned long *addrs`` An array of target function address. ``int num`` The number of entries of **addrs**. **Description** Register **fp** to ftrace for enabling the probe on the address given by **addrs**. The **addrs** must be the addresses of ftrace location address, which may be the symbol address + arch-dependent offset. If you unsure what this mean, please use other registration functions. Return 0 if **fp** is registered successfully, -errno if not.”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³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mähj÷ubjç)�”}”(hhh]”(jì)�”}”(hŒ@``struct fprobe *fp`` A fprobe data structure to be registered. ”h]”(jò)�”}”(hŒ``struct fprobe *fp``”h]”j6)�”}”(hjh]”hŒstruct fprobe *fp”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Máhjubj)�”}”(hhh]”hý)�”}”(hŒ)A fprobe data structure to be registered.”h]”hŒ)A fprobe data structure to be registered.”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³j1h´Máhj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³j1h´Máhjubjì)�”}”(hŒ>``unsigned long *addrs`` An array of target function address. ”h]”(jò)�”}”(hŒ``unsigned long *addrs``”h]”j6)�”}”(hjUh]”hŒunsigned long *addrs”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjSubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´MâhjOubj)�”}”(hhh]”hý)�”}”(hŒ$An array of target function address.”h]”hŒ$An array of target function address.”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³jjh´Mâhjkubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjOubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³jjh´Mâhjubjì)�”}”(hŒ0``int num`` The number of entries of **addrs**. ”h]”(jò)�”}”(hŒ ``int num``”h]”j6)�”}”(hjŽh]”hŒint num”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mãhjˆubj)�”}”(hhh]”hý)�”}”(hŒ#The number of entries of **addrs**.”h]”(hŒThe number of entries of ”…”�”}”(hj§h²hh³Nh´Nubjé)�”}”(hŒ **addrs**”h]”hŒaddrs”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhj§ubhŒ.”…”�”}”(hj§h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³j£h´Mãhj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³j£h´Mãhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jæhj÷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³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Måhj÷ubhý)�”}”(hXRegister **fp** to ftrace for enabling the probe on the address given by **addrs**. The **addrs** must be the addresses of ftrace location address, which may be the symbol address + arch-dependent offset. If you unsure what this mean, please use other registration functions.”h]”(hŒ Register ”…”�”}”(hjñh²hh³Nh´Nubjé)�”}”(hŒ**fp**”h]”hŒfp”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjñubhŒ: to ftrace for enabling the probe on the address given by ”…”�”}”(hjñh²hh³Nh´Nubjé)�”}”(hŒ **addrs**”h]”hŒaddrs”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjñubhŒ. The ”…”�”}”(hjñh²hh³Nh´Nubjé)�”}”(hŒ **addrs**”h]”hŒaddrs”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjñubhŒ² must be the addresses of ftrace location address, which may be the symbol address + arch-dependent offset. If you unsure what this mean, please use other registration functions.”…”�”}”(hjñh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mähj÷ubhý)�”}”(hŒ=Return 0 if **fp** is registered successfully, -errno if not.”h]”(hŒ Return 0 if ”…”�”}”(hj6h²hh³Nh´Nubjé)�”}”(hŒ**fp**”h]”hŒfp”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhj6ubhŒ+ is registered successfully, -errno if not.”…”�”}”(hj6h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Méhj÷ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jÞhj/h²hh³Nh´NubjA)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jMŒ!register_fprobe_syms (C function)”Œc.register_fprobe_syms”hNt”auh1j@hj/h²hh³Nh´NubjR)�”}”(hhh]”(jW)�”}”(hŒHint register_fprobe_syms (struct fprobe *fp, const char **syms, int num)”h]”j])�”}”(hŒGint register_fprobe_syms(struct fprobe *fp, const char **syms, int num)”h]”(j9 )�”}”(hŒint”h]”hŒint”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjsh²hh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjsh²hh³j…h´Mubj†)�”}”(hŒregister_fprobe_syms”h]”jŒ)�”}”(hŒregister_fprobe_syms”h]”hŒregister_fprobe_syms”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj”ubah}”(h]”h ]”(jžjŸeh"]”h$]”h&]”hÅhÆuh1j…hjsh²hh³j…h´Mubjq )�”}”(hŒ/(struct fprobe *fp, const char **syms, int num)”h]”(jw )�”}”(hŒstruct fprobe *fp”h]”(jc)�”}”(hjfh]”hŒstruct”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”joah"]”h$]”h&]”uh1jbhj°ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj°ubh)�”}”(hhh]”jŒ)�”}”(hŒfprobe”h]”hŒfprobe”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjÏubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¯Œreftype”j° Œ reftarget”jÔŒmodname”NŒ classname”Nj´ j· )�”}”jº ]”j½ )�”}”j° jšsbŒc.register_fprobe_syms”†”asbuh1hhj°ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj°ubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hj°ubjŒ)�”}”(hŒfp”h]”hŒfp”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj°ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj¬ubjw )�”}”(hŒconst char **syms”h]”(jc)�”}”(hj"h]”hŒconst”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”joah"]”h$]”h&]”uh1jbhj"ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj"ubj9 )�”}”(hŒchar”h]”hŒchar”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj"ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj"ubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hj"ubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hj"ubjŒ)�”}”(hŒsyms”h]”hŒsyms”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj"ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj¬ubjw )�”}”(hŒint num”h]”(j9 )�”}”(hŒint”h]”hŒint”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjŒubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjŒubjŒ)�”}”(hŒnum”h]”hŒnum”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjŒubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj¬ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jp hjsh²hh³j…h´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj©ˆuh1j\jªj«hjoh²hh³j…h´Mubah}”(h]”jjah ]”(j¯j°eh"]”h$]”h&]”j´ˆjµ)j¶huh1jVh³j…h´Mhjlh²hubj¸)�”}”(hhh]”hý)�”}”(hŒ%Register fprobe to ftrace by symbols.”h]”hŒ%Register fprobe to ftrace by symbols.”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´MhjÓh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hjlh²hh³j…h´Mubeh}”(h]”h ]”(j¯Œfunction”eh"]”h$]”h&]”jØj¯jÙjîjÚjîjÛ‰j܉j݉uh1jQh²hhj/h³Nh´Nubjß)�”}”(hX†**Parameters** ``struct fprobe *fp`` A fprobe data structure to be registered. ``const char **syms`` An array of target symbols. ``int num`` The number of entries of **syms**. **Description** Register **fp** to the symbols given by **syms** array. This will be useful if you are sure the symbols exist in the kernel. Return 0 if **fp** is registered successfully, -errno if not.”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³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mhjòubjç)�”}”(hhh]”(jì)�”}”(hŒ@``struct fprobe *fp`` A fprobe data structure to be registered. ”h]”(jò)�”}”(hŒ``struct fprobe *fp``”h]”j6)�”}”(hjh]”hŒstruct fprobe *fp”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mhjubj)�”}”(hhh]”hý)�”}”(hŒ)A fprobe data structure to be registered.”h]”hŒ)A fprobe data structure to be registered.”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³j,h´Mhj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³j,h´Mhjubjì)�”}”(hŒ2``const char **syms`` An array of target symbols. ”h]”(jò)�”}”(hŒ``const char **syms``”h]”j6)�”}”(hjPh]”hŒconst char **syms”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´MhjJubj)�”}”(hhh]”hý)�”}”(hŒAn array of target symbols.”h]”hŒAn array of target symbols.”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³jeh´Mhjfubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjJubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³jeh´Mhjubjì)�”}”(hŒ/``int num`` The number of entries of **syms**. ”h]”(jò)�”}”(hŒ ``int num``”h]”j6)�”}”(hj‰h]”hŒint num”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mhjƒubj)�”}”(hhh]”hý)�”}”(hŒ"The number of entries of **syms**.”h]”(hŒThe number of entries of ”…”�”}”(hj¢h²hh³Nh´Nubjé)�”}”(hŒ**syms**”h]”hŒsyms”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhj¢ubhŒ.”…”�”}”(hj¢h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³jžh´MhjŸubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjƒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³jžh´Mhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jæhjò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³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mhjòubhý)�”}”(hŒ|Register **fp** to the symbols given by **syms** array. This will be useful if you are sure the symbols exist in the kernel.”h]”(hŒ Register ”…”�”}”(hjìh²hh³Nh´Nubjé)�”}”(hŒ**fp**”h]”hŒfp”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjìubhŒ to the symbols given by ”…”�”}”(hjìh²hh³Nh´Nubjé)�”}”(hŒ**syms**”h]”hŒsyms”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjìubhŒL array. This will be useful if you are sure the symbols exist in the kernel.”…”�”}”(hjìh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mhjòubhý)�”}”(hŒ=Return 0 if **fp** is registered successfully, -errno if not.”h]”(hŒ Return 0 if ”…”�”}”(hjh²hh³Nh´Nubjé)�”}”(hŒ**fp**”h]”hŒfp”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjubhŒ+ is registered successfully, -errno if not.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mhjòubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jÞhj/h²hh³Nh´NubjA)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jMŒ$unregister_fprobe_async (C function)”Œc.unregister_fprobe_async”hNt”auh1j@hj/h²hh³Nh´NubjR)�”}”(hhh]”(jW)�”}”(hŒ/int unregister_fprobe_async (struct fprobe *fp)”h]”j])�”}”(hŒ.int unregister_fprobe_async(struct fprobe *fp)”h]”(j9 )�”}”(hŒint”h]”hŒint”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hj\h²hh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M^ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj\h²hh³jnh´M^ubj†)�”}”(hŒunregister_fprobe_async”h]”jŒ)�”}”(hŒunregister_fprobe_async”h]”hŒunregister_fprobe_async”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj}ubah}”(h]”h ]”(jžjŸeh"]”h$]”h&]”hÅhÆuh1j…hj\h²hh³jnh´M^ubjq )�”}”(hŒ(struct fprobe *fp)”h]”jw )�”}”(hŒstruct fprobe *fp”h]”(jc)�”}”(hjfh]”hŒstruct”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”joah"]”h$]”h&]”uh1jbhj™ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj™ubh)�”}”(hhh]”jŒ)�”}”(hŒfprobe”h]”hŒfprobe”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj¸ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¯Œreftype”j° Œ reftarget”j½Œmodname”NŒ classname”Nj´ j· )�”}”jº ]”j½ )�”}”j° jƒsbŒc.unregister_fprobe_async”†”asbuh1hhj™ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj™ubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hj™ubjŒ)�”}”(hŒfp”h]”hŒfp”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj™ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj•ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jp hj\h²hh³jnh´M^ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj©ˆuh1j\jªj«hjXh²hh³jnh´M^ubah}”(h]”jSah ]”(j¯j°eh"]”h$]”h&]”j´ˆjµ)j¶huh1jVh³jnh´M^hjUh²hubj¸)�”}”(hhh]”hý)�”}”(hŒ%Unregister fprobe without RCU GP wait”h]”hŒ%Unregister fprobe without RCU GP wait”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M^hjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hjUh²hh³jnh´M^ubeh}”(h]”h ]”(j¯Œfunction”eh"]”h$]”h&]”jØj¯jÙj8jÚj8jÛ‰j܉j݉uh1jQh²hhj/h³Nh´Nubjß)�”}”(hX-**Parameters** ``struct fprobe *fp`` A fprobe data structure to be unregistered. **Description** Unregister fprobe (and remove ftrace hooks from the function entries). This function will NOT wait until the fprobe is no longer used. Return 0 if **fp** is unregistered successfully, -errno if not.”h]”(hý)�”}”(hŒ**Parameters**”h]”jé)�”}”(hjBh]”hŒ Parameters”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhj@ubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mbhj<ubjç)�”}”(hhh]”jì)�”}”(hŒB``struct fprobe *fp`` A fprobe data structure to be unregistered. ”h]”(jò)�”}”(hŒ``struct fprobe *fp``”h]”j6)�”}”(hjah]”hŒstruct fprobe *fp”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M_hj[ubj)�”}”(hhh]”hý)�”}”(hŒ+A fprobe data structure to be unregistered.”h]”hŒ+A fprobe data structure to be unregistered.”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³jvh´M_hjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³jvh´M_hjXubah}”(h]”h ]”h"]”h$]”h&]”uh1jæhj<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³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mahj<ubhý)�”}”(hŒ†Unregister fprobe (and remove ftrace hooks from the function entries). This function will NOT wait until the fprobe is no longer used.”h]”hŒ†Unregister fprobe (and remove ftrace hooks from the function entries). This function will NOT wait until the fprobe is no longer used.”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´M`hj<ubhý)�”}”(hŒ?Return 0 if **fp** is unregistered successfully, -errno if not.”h]”(hŒ Return 0 if ”…”�”}”(hjÁh²hh³Nh´Nubjé)�”}”(hŒ**fp**”h]”hŒfp”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjÁubhŒ- is unregistered successfully, -errno if not.”…”�”}”(hjÁh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mchj<ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jÞhj/h²hh³Nh´NubjA)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jMŒunregister_fprobe (C function)”Œc.unregister_fprobe”hNt”auh1j@hj/h²hh³Nh´NubjR)�”}”(hhh]”(jW)�”}”(hŒ)int unregister_fprobe (struct fprobe *fp)”h]”j])�”}”(hŒ(int unregister_fprobe(struct fprobe *fp)”h]”(j9 )�”}”(hŒint”h]”hŒint”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jE ah"]”h$]”h&]”uh1j8 hjþh²hh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mpubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthjþh²hh³jh´Mpubj†)�”}”(hŒunregister_fprobe”h]”jŒ)�”}”(hŒunregister_fprobe”h]”hŒunregister_fprobe”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjubah}”(h]”h ]”(jžjŸeh"]”h$]”h&]”hÅhÆuh1j…hjþh²hh³jh´Mpubjq )�”}”(hŒ(struct fprobe *fp)”h]”jw )�”}”(hŒstruct fprobe *fp”h]”(jc)�”}”(hjfh]”hŒstruct”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”joah"]”h$]”h&]”uh1jbhj;ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj;ubh)�”}”(hhh]”jŒ)�”}”(hŒfprobe”h]”hŒfprobe”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hjZubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¯Œreftype”j° Œ reftarget”j_Œmodname”NŒ classname”Nj´ j· )�”}”jº ]”j½ )�”}”j° j%sbŒc.unregister_fprobe”†”asbuh1hhj;ubju)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”j�ah"]”h$]”h&]”uh1jthj;ubjÑ )�”}”(hjÔ h]”hŒ*”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”jÝ ah"]”h$]”h&]”uh1jÐ hj;ubjŒ)�”}”(hŒfp”h]”hŒfp”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”j—ah"]”h$]”h&]”uh1j‹hj;ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jv hj7ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jp hjþh²hh³jh´Mpubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj©ˆuh1j\jªj«hjúh²hh³jh´Mpubah}”(h]”jõah ]”(j¯j°eh"]”h$]”h&]”j´ˆjµ)j¶huh1jVh³jh´Mphj÷h²hubj¸)�”}”(hhh]”hý)�”}”(hŒ"Unregister fprobe with RCU GP wait”h]”hŒ"Unregister fprobe with RCU GP wait”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mphj¿h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hj÷h²hh³jh´Mpubeh}”(h]”h ]”(j¯Œfunction”eh"]”h$]”h&]”jØj¯jÙjÚjÚjÚjÛ‰j܉j݉uh1jQh²hhj/h³Nh´Nubjß)�”}”(hX***Parameters** ``struct fprobe *fp`` A fprobe data structure to be unregistered. **Description** Unregister fprobe (and remove ftrace hooks from the function entries). This function will block until the fprobe is no longer used. Return 0 if **fp** is unregistered successfully, -errno if not.”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³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´MthjÞubjç)�”}”(hhh]”jì)�”}”(hŒB``struct fprobe *fp`` A fprobe data structure to be unregistered. ”h]”(jò)�”}”(hŒ``struct fprobe *fp``”h]”j6)�”}”(hjh]”hŒstruct fprobe *fp”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jñh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´Mqhjýubj)�”}”(hhh]”hý)�”}”(hŒ+A fprobe data structure to be unregistered.”h]”hŒ+A fprobe data structure to be unregistered.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³jh´Mqhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjýubeh}”(h]”h ]”h"]”h$]”h&]”uh1jëh³jh´Mqhjúubah}”(h]”h ]”h"]”h$]”h&]”uh1jæhjÞ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³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´MshjÞubhý)�”}”(hŒƒUnregister fprobe (and remove ftrace hooks from the function entries). This function will block until the fprobe is no longer used.”h]”hŒƒUnregister fprobe (and remove ftrace hooks from the function entries). This function will block until the fprobe is no longer used.”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´MrhjÞubhý)�”}”(hŒ?Return 0 if **fp** is unregistered successfully, -errno if not.”h]”(hŒ Return 0 if ”…”�”}”(hjch²hh³Nh´Nubjé)�”}”(hŒ**fp**”h]”hŒfp”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jèhjcubhŒ- is unregistered successfully, -errno if not.”…”�”}”(hjch²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³ŒS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.c”h´MuhjÞubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jÞhj/h²hh³Nh´Nubeh}”(h]”Œfunctions-and-structures”ah ]”h"]”Œfunctions and structures”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KÂubeh}”(h]”Œ fprobe-function-entry-exit-probe”ah ]”h"]”Œ"fprobe - function entry/exit probe”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˜j•jjj§j¤jwjtjÔjÑjVjSj,j)j�j�uŒ nametypes”}”(j˜‰j‰j§‰jw‰jÔ‰jV‰j,‰j�‰uh}”(j•hÊjhëj¤jjtjªjÑjzjSj×j)jYj�j/jOjXjj j j j+ j0 jÑ jÖ jdjij{j€jjjojSjXjõjúuŒ 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”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.