sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget /translations/zh_CN/trace/fprobemodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/zh_TW/trace/fprobemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/it_IT/trace/fprobemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ja_JP/trace/fprobemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ko_KR/trace/fprobemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/sp_SP/trace/fprobemodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh:/var/lib/git/docbuild/linux/Documentation/trace/fprobe.rsthKubhsection)}(hhh](htitle)}(h"Fprobe - Function entry/exit probeh]h"Fprobe - Function entry/exit probe}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(h.Author: Masami Hiramatsu h]h.Author: Masami Hiramatsu }hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhhhhKubh)}(hhh](h)}(h Introductionh]h Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh paragraph)}(hXFprobe 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]hXFprobe 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.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hThe usage of fprobeh]hThe usage of fprobe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hThe 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](hThe 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 }(hjhhhNhNubhtitle_reference)}(h`struct fprobe`h]h struct fprobe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and pass it to }(hjhhhNhNubj)}(h`register_fprobe()`h]hregister_fprobe()}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hjTypically, `fprobe` data structure is initialized with the `entry_handler` and/or `exit_handler` as below.h](h Typically, }(hjEhhhNhNubj)}(h`fprobe`h]hfprobe}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh( data structure is initialized with the }(hjEhhhNhNubj)}(h`entry_handler`h]h entry_handler}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh and/or }(hjEhhhNhNubj)}(h`exit_handler`h]h exit_handler}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh as below.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh literal_block)}(hnstruct fprobe fp = { .entry_handler = my_entry_callback, .exit_handler = my_exit_callback, };h]hnstruct fprobe fp = { .entry_handler = my_entry_callback, .exit_handler = my_exit_callback, };}hjsbah}(h]h ]h"]h$]h&]hhforcelanguagechighlight_args}uh1jhhhKhjhhubh)}(hTo 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]hTo 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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjhhubh)}(hThe register_fprobe() enables a fprobe by function-name filters. E.g. this enables @fp on "func*()" function except "func2()".::h]hThe register_fprobe() enables a fprobe by function-name filters. E.g. this enables @fp on “func*()” function except “func2()”.:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjhhubj)}(h'register_fprobe(&fp, "func*", "func2");h]h'register_fprobe(&fp, "func*", "func2");}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK,hjhhubh)}(hMThe register_fprobe_ips() enables a fprobe by ftrace-location addresses. E.g.h]hMThe register_fprobe_ips() enables a fprobe by ftrace-location addresses. E.g.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjhhubj)}(hRunsigned long ips[] = { 0x.... }; register_fprobe_ips(&fp, ips, ARRAY_SIZE(ips));h]hRunsigned long ips[] = { 0x.... }; register_fprobe_ips(&fp, ips, ARRAY_SIZE(ips));}hjsbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhK1hjhhubh)}(hEAnd the register_fprobe_syms() enables a fprobe by symbol names. E.g.h]hEAnd the register_fprobe_syms() enables a fprobe by symbol names. E.g.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjhhubj)}(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&]hhjjjj}uh1jhhhK:hjhhubh)}(h6To disable (remove from functions) this fprobe, call::h]h5To disable (remove from functions) this fprobe, call:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjhhubj)}(hunregister_fprobe(&fp);h]hunregister_fprobe(&fp);}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKBhjhhubh)}(h1You can temporally (soft) disable the fprobe by::h]h0You can temporally (soft) disable the fprobe by:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjhhubj)}(hdisable_fprobe(&fp);h]hdisable_fprobe(&fp);}hj,sbah}(h]h ]h"]h$]h&]hhuh1jhhhKFhjhhubh)}(hand resume by::h]hand resume by:}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhjhhubj)}(henable_fprobe(&fp);h]henable_fprobe(&fp);}hjHsbah}(h]h ]h"]h$]h&]hhuh1jhhhKJhjhhubh)}(h.The above is defined by including the header::h]h-The above is defined by including the header:}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjhhubj)}(h#include h]h#include }hjdsbah}(h]h ]h"]h$]h&]hhuh1jhhhKNhjhhubh)}(hSame as ftrace, the registered callbacks will start being called some time after the register_fprobe() is called and before it returns. See :file:`Documentation/trace/ftrace.rst`.h](hSame as ftrace, the registered callbacks will start being called some time after the register_fprobe() is called and before it returns. See }(hjrhhhNhNubhliteral)}(h&:file:`Documentation/trace/ftrace.rst`h]hDocumentation/trace/ftrace.rst}(hj|hhhNhNubah}(h]h ]fileah"]h$]h&]rolefileuh1jzhjrubh.}(hjrhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKPhjhhubh)}(hAlso, the unregister_fprobe() will guarantee that the both enter and exit handlers are no longer being called by functions after unregister_fprobe() returns as same as unregister_ftrace_function().h]hAlso, the unregister_fprobe() will guarantee that the both enter and exit handlers are no longer being called by functions after unregister_fprobe() returns as same as unregister_ftrace_function().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKThjhhubeh}(h]the-usage-of-fprobeah ]h"]the usage of fprobeah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hThe fprobe entry/exit handlerh]hThe fprobe entry/exit handler}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKYubh)}(hAThe prototype of the entry/exit callback function are as follows:h]hAThe prototype of the entry/exit callback function are as follows:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjhhubj)}(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);}hjsbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhK]hjhhubh)}(hNote 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]hNote 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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchjhhubhdefinition_list)}(hhh](hdefinition_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](hterm)}(h@fph]h@fp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKkhjubh definition)}(hhh]h)}(hThis 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](hThis is the address of }(hj hhhNhNubj)}(h`fprobe`h]hfprobe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh; data structure related to this handler. You can embed the }(hj hhhNhNubj)}(h`fprobe`h]hfprobe}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh^ to your data structure and get it by container_of() macro from @fp. The @fp must not be NULL.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKihjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKkhjubj)}(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_iph]h @entry_ip}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKphjGubj)}(hhh]h)}(hThis 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]hThis 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.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnhjYubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhhhKphjhhubj)}(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_iph]h@ret_ip}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKthjvubj)}(hhh]h)}(hThis 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]hThis is the return address that the traced function will return to, somewhere in the caller. This can be used at both entry and exit.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKshjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhhhKthjhhubj)}(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 thos values via appropriate `ftrace_regs_*` APIs. h](j)}(h@fregsh]h@fregs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKyhjubj)}(hhh]h)}(hThis is the `ftrace_regs` data structure at the entry and exit. This includes the function parameters, or the return values. So user can access thos values via appropriate `ftrace_regs_*` APIs.h](h This is the }(hjhhhNhNubj)}(h `ftrace_regs`h]h ftrace_regs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh data structure at the entry and exit. This includes the function parameters, or the return values. So user can access thos values via appropriate }(hjhhhNhNubj)}(h`ftrace_regs_*`h]h ftrace_regs_*}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh APIs.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKwhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKyhjhhubj)}(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_datah]h @entry_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjubj)}(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](hThis is a local storage to share the data between entry and exit handlers. This storage is NULL by default. If the user specify }(hj hhhNhNubj)}(h`exit_handler`h]h exit_handler}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh field and }(hj hhhNhNubj)}(h`entry_data_size`h]hentry_data_size}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhP field when registering the fprobe, the storage is allocated and passed to both }(hj hhhNhNubj)}(h`entry_handler`h]h entry_handler}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh and }(hj hhhNhNubj)}(h`exit_handler`h]h exit_handler}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK|hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]the-fprobe-entry-exit-handlerah ]h"]the fprobe entry/exit handlerah$]h&]uh1hhhhhhhhKYubh)}(hhh](h)}(h6Entry data size and exit handlers on the same functionh]h6Entry data size and exit handlers on the same function}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hhhhhKubh)}(hXSince 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](hwSince the entry data is passed via per-task stack and it has limited size, the entry data size per probe is limited to }(hjhhhNhNubj)}(h`15 * sizeof(long)`h]h15 * sizeof(long)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. 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 }(hjhhhNhNubj)}(h`sizeof(long)`h]h sizeof(long)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh/ and each fprobe which has exit handler uses a }(hjhhhNhNubj)}(h`sizeof(long)`h]h sizeof(long)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhe space on the stack, you should keep the number of fprobes on the same function as small as possible.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj}hhubeh}(h]6entry-data-size-and-exit-handlers-on-the-same-functionah ]h"]6entry data size and exit handlers on the same functionah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Share the callbacks with kprobesh]h Share the callbacks with kprobes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hSince 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]hSince 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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hFprobe 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](hFprobe 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 }(hjhhhNhNubhemphasis)}(h*before*h]hbefore}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh registering the fprobe, like:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hQfprobe.flags = FPROBE_FL_KPROBE_SHARED; register_fprobe(&fprobe, "func*", NULL);h]hQfprobe.flags = FPROBE_FL_KPROBE_SHARED; register_fprobe(&fprobe, "func*", NULL);}hj7sbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhKhjhhubh)}(h(struct fprobe *fp, const char *filter, const char *notfilter)h](jx )}(hstruct fprobe *fph](jf)}(hjih]hstruct}(hjhhhNhNubah}(h]h ]jrah"]h$]h&]uh1jehjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubh)}(hhh]j)}(hfprobeh]hfprobe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jsbc.register_fprobeasbuh1hhjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj)}(hfph]hfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubjx )}(hconst char *filterh](jf)}(hconsth]hconst}(hj!hhhNhNubah}(h]h ]jrah"]h$]h&]uh1jehjubjx)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubj: )}(hcharh]hchar}(hj=hhhNhNubah}(h]h ]jF ah"]h$]h&]uh1j9 hjubjx)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubj )}(hj h]h*}(hjYhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj)}(hfilterh]hfilter}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubjx )}(hconst char *notfilterh](jf)}(hj#h]hconst}(hjhhhNhNubah}(h]h ]jrah"]h$]h&]uh1jehj{ubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj{ubj: )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jF ah"]h$]h&]uh1j9 hj{ubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj{ubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj{ubj)}(h notfilterh]h notfilter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubeh}(h]h ]h"]h$]h&]hhuh1jq hjnhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j_jjhjjhhhjhMubah}(h]jeah ](jjeh"]h$]h&]jj)jhuh1jYhjhMhjghhubj)}(hhh]h)}(h%Register fprobe to ftrace by pattern.h]h%Register fprobe to ftrace by pattern.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjghhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jThhhj2hNhNubj)}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhj ubj)}(hhh](j)}(h@``struct fprobe *fp`` A fprobe data structure to be registered. h](j)}(h``struct fprobe *fp``h]j{)}(hj.h]hstruct fprobe *fp}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jzhj,ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhj(ubj)}(hhh]h)}(h)A fprobe data structure to be registered.h]h)A fprobe data structure to be registered.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjDubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMhj%ubj)}(h=``const char *filter`` A wildcard pattern of probed symbols. h](j)}(h``const char *filter``h]j{)}(hjgh]hconst char *filter}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjeubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjaubj)}(hhh]h)}(h%A wildcard pattern of probed symbols.h]h%A wildcard pattern of probed symbols.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hMhj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMhj%ubj)}(hD``const char *notfilter`` A wildcard pattern of NOT probed symbols. h](j)}(h``const char *notfilter``h]j{)}(hjh]hconst char *notfilter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubj)}(hhh]h)}(h)A wildcard pattern of NOT probed symbols.h]h)A wildcard pattern of NOT probed symbols.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj%ubeh}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhj ubh)}(hRegister **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 }(hjhhhNhNubj)}(h**fp**h]hfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh< to ftrace for enabling the probe on the symbols matched to }(hjhhhNhNubj)}(h **filter**h]hfilter}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. If }(hjhhhNhNubj)}(h **notfilter**h]h notfilter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh& is not NULL, the symbols matched the }(hjhhhNhNubj)}(h **notfilter**h]h notfilter}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh are not probed.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhj ubh)}(h=Return 0 if **fp** is registered successfully, -errno if not.h](h Return 0 if }(hjHhhhNhNubj)}(h**fp**h]hfp}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubh+ is registered successfully, -errno if not.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubjD)}(hhh]h}(h]h ]h"]h$]h&]entries](jP register_fprobe_ips (C function)c.register_fprobe_ipshNtauh1jChj2hhhNhNubjU)}(hhh](jZ)}(hJint register_fprobe_ips (struct fprobe *fp, unsigned long *addrs, int num)h]j`)}(hIint register_fprobe_ips(struct fprobe *fp, unsigned long *addrs, int num)h](j: )}(hinth]hint}(hjhhhNhNubah}(h]h ]jF ah"]h$]h&]uh1j9 hjhhhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjhhhjhMubj)}(hregister_fprobe_ipsh]j)}(hregister_fprobe_ipsh]hregister_fprobe_ips}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMubjr )}(h2(struct fprobe *fp, unsigned long *addrs, int num)h](jx )}(hstruct fprobe *fph](jf)}(hjih]hstruct}(hjhhhNhNubah}(h]h ]jrah"]h$]h&]uh1jehjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubh)}(hhh]j)}(hfprobeh]hfprobe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jsbc.register_fprobe_ipsasbuh1hhjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj)}(hfph]hfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubjx )}(hunsigned long *addrsh](j: )}(hunsignedh]hunsigned}(hj8hhhNhNubah}(h]h ]jF ah"]h$]h&]uh1j9 hj4ubjx)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj4ubj: )}(hlongh]hlong}(hjThhhNhNubah}(h]h ]jF ah"]h$]h&]u1Uh1j9 hj4ubjx)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj4ubj )}(hj h]h*}(hjphhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj4ubj)}(haddrsh]haddrs}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubjx )}(hint numh](j: )}(hinth]hint}(hjhhhNhNubah}(h]h ]jF ah"]h$]h&]uh1j9 hjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubj)}(hnumh]hnum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubeh}(h]h ]h"]h$]h&]hhuh1jq hjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j_jjhjhhhjhMubah}(h]j|ah ](jjeh"]h$]h&]jj)jhuh1jYhjhMhj~hhubj)}(hhh]h)}(h%Register fprobe to ftrace by address.h]h%Register fprobe to ftrace by address.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj~hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jThhhj2hNhNubj)}(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)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubj)}(hhh](j)}(h@``struct fprobe *fp`` A fprobe data structure to be registered. h](j)}(h``struct fprobe *fp``h]j{)}(hjh]hstruct fprobe *fp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubj)}(hhh]h)}(h)A fprobe data structure to be registered.h]h)A fprobe data structure to be registered.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj3ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj2hMhjubj)}(h>``unsigned long *addrs`` An array of target function address. h](j)}(h``unsigned long *addrs``h]j{)}(hjVh]hunsigned long *addrs}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjTubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjPubj)}(hhh]h)}(h$An array of target function address.h]h$An array of target function address.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMhjlubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhjkhMhjubj)}(h0``int num`` The number of entries of **addrs**. h](j)}(h ``int num``h]j{)}(hjh]hint num}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubj)}(hhh]h)}(h#The number of entries of **addrs**.h](hThe number of entries of }(hjhhhNhNubj)}(h **addrs**h]haddrs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubh)}(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 }(hjhhhNhNubj)}(h**fp**h]hfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh: to ftrace for enabling the probe on the address given by }(hjhhhNhNubj)}(h **addrs**h]haddrs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. The }(hjhhhNhNubj)}(h **addrs**h]haddrs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 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.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubh)}(h=Return 0 if **fp** is registered successfully, -errno if not.h](h Return 0 if }(hj7hhhNhNubj)}(h**fp**h]hfp}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh+ is registered successfully, -errno if not.}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubjD)}(hhh]h}(h]h ]h"]h$]h&]entries](jP!register_fprobe_syms (C function)c.register_fprobe_symshNtauh1jChj2hhhNhNubjU)}(hhh](jZ)}(hHint register_fprobe_syms (struct fprobe *fp, const char **syms, int num)h]j`)}(hGint register_fprobe_syms(struct fprobe *fp, const char **syms, int num)h](j: )}(hinth]hint}(hjxhhhNhNubah}(h]h ]jF ah"]h$]h&]uh1j9 hjthhhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjthhhjhMubj)}(hregister_fprobe_symsh]j)}(hregister_fprobe_symsh]hregister_fprobe_syms}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjthhhjhMubjr )}(h/(struct fprobe *fp, const char **syms, int num)h](jx )}(hstruct fprobe *fph](jf)}(hjih]hstruct}(hjhhhNhNubah}(h]h ]jrah"]h$]h&]uh1jehjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubh)}(hhh]j)}(hfprobeh]hfprobe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jsbc.register_fprobe_symsasbuh1hhjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj)}(hfph]hfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubjx )}(hconst char **symsh](jf)}(hj#h]hconst}(hj'hhhNhNubah}(h]h ]jrah"]h$]h&]uh1jehj#ubjx)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj#ubj: )}(hcharh]hchar}(hjBhhhNhNubah}(h]h ]jF ah"]h$]h&]uh1j9 hj#ubjx)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj#ubj )}(hj h]h*}(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj#ubj )}(hj h]h*}(hjkhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj#ubj)}(hsymsh]hsyms}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubjx )}(hint numh](j: )}(hinth]hint}(hjhhhNhNubah}(h]h ]jF ah"]h$]h&]uh1j9 hjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubj)}(hnumh]hnum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubeh}(h]h ]h"]h$]h&]hhuh1jq hjthhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j_jjhjphhhjhMubah}(h]jkah ](jjeh"]h$]h&]jj)jhuh1jYhjhMhjmhhubj)}(hhh]h)}(h%Register fprobe to ftrace by symbols.h]h%Register fprobe to ftrace by symbols.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjmhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jThhhj2hNhNubj)}(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)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubj)}(hhh](j)}(h@``struct fprobe *fp`` A fprobe data structure to be registered. h](j)}(h``struct fprobe *fp``h]j{)}(hjh]hstruct fprobe *fp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubj)}(hhh]h)}(h)A fprobe data structure to be registered.h]h)A fprobe data structure to be registered.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj.ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj-hMhjubj)}(h2``const char **syms`` An array of target symbols. h](j)}(h``const char **syms``h]j{)}(hjQh]hconst char **syms}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjOubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjKubj)}(hhh]h)}(hAn array of target symbols.h]hAn array of target symbols.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhMhjgubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhjfhMhjubj)}(h/``int num`` The number of entries of **syms**. h](j)}(h ``int num``h]j{)}(hjh]hint num}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jzhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubj)}(hhh]h)}(h"The number of entries of **syms**.h](hThe number of entries of }(hjhhhNhNubj)}(h**syms**h]hsyms}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubh)}(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 }(hjhhhNhNubj)}(h**fp**h]hfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to the symbols given by }(hjhhhNhNubj)}(h**syms**h]hsyms}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhL array. This will be useful if you are sure the symbols exist in the kernel.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubh)}(h=Return 0 if **fp** is registered successfully, -errno if not.h](h Return 0 if }(hj hhhNhNubj)}(h**fp**h]hfp}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh+ is registered successfully, -errno if not.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubjD)}(hhh]h}(h]h ]h"]h$]h&]entries](jPunregister_fprobe (C function)c.unregister_fprobehNtauh1jChj2hhhNhNubjU)}(hhh](jZ)}(h)int unregister_fprobe (struct fprobe *fp)h]j`)}(h(int unregister_fprobe(struct fprobe *fp)h](j: )}(hinth]hint}(hjahhhNhNubah}(h]h ]jF ah"]h$]h&]uh1j9 hj]hhhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMubjx)}(h h]h }(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj]hhhjohMubj)}(hunregister_fprobeh]j)}(hunregister_fprobeh]hunregister_fprobe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj]hhhjohMubjr )}(h(struct fprobe *fp)h]jx )}(hstruct fprobe *fph](jf)}(hjih]hstruct}(hjhhhNhNubah}(h]h ]jrah"]h$]h&]uh1jehjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubh)}(hhh]j)}(hfprobeh]hfprobe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jsbc.unregister_fprobeasbuh1hhjubjx)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj)}(hfph]hfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jw hjubah}(h]h ]h"]h$]h&]hhuh1jq hj]hhhjohMubeh}(h]h ]h"]h$]h&]hhjuh1j_jjhjYhhhjohMubah}(h]jTah ](jjeh"]h$]h&]jj)jhuh1jYhjohMhjVhhubj)}(hhh]h)}(hUnregister fprobe.h]hUnregister fprobe.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjVhhhjohMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj9jj9jjjuh1jThhhj2hNhNubj)}(h**Parameters** ``struct fprobe *fp`` A fprobe data structure to be unregistered. **Description** Unregister fprobe (and remove ftrace hooks from the function entries). Return 0 if **fp** is unregistered successfully, -errno if not.h](h)}(h**Parameters**h]j)}(hjCh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chM hj=ubj)}(hhh]j)}(hB``struct fprobe *fp`` A fprobe data structure to be unregistered. h](j)}(h``struct fprobe *fp``h]j{)}(hjbh]hstruct fprobe *fp}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jzhj`ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chM hj\ubj)}(hhh]h)}(h+A fprobe data structure to be unregistered.h]h+A fprobe data structure to be unregistered.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhM hjxubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhjwhM hjYubah}(h]h ]h"]h$]h&]uh1jhj=ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chM hj=ubh)}(hFUnregister fprobe (and remove ftrace hooks from the function entries).h]hFUnregister fprobe (and remove ftrace hooks from the function entries).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chM hj=ubh)}(h?Return 0 if **fp** is unregistered successfully, -errno if not.h](h Return 0 if }(hjhhhNhNubj)}(h**fp**h]hfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh- is unregistered successfully, -errno if not.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chM hj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubeh}(h]functions-and-structuresah ]h"]functions and structuresah$]h&]uh1hhhhhhhhKubeh}(h] fprobe-function-entry-exit-probeah ]h"]"fprobe - function entry/exit probeah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjhhjjjzjwjjjYjVj/j,jju nametypes}(jhjjzjjYj/juh}(jhhhjjjwjjj}jVjj,j\jj2jRj[jj j j j, j1 j j jejjj|jjkjpjTjYu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.