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 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 Documentation/trace/ftrace.rst.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjhhubh)}(hAlso, 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]hAlso, 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().}(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 }(hjhhhNhNubj)}(h`fprobe`h]hfprobe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh; data structure related to this handler. You can embed the }(hjhhhNhNubj)}(h`fprobe`h]hfprobe}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh^ to your data structure and get it by container_of() macro from @fp. The @fp must not be NULL.}(hjhhhNhNubeh}(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}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKphj0ubj)}(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.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnhjBubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(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}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKthj_ubj)}(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.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKshjqubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(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 }(hjhhhNhNubj)}(h`exit_handler`h]h exit_handler}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh field and }(hjhhhNhNubj)}(h`entry_data_size`h]hentry_data_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhP field when registering the fprobe, the storage is allocated and passed to both }(hjhhhNhNubj)}(h`entry_handler`h]h entry_handler}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h`exit_handler`h]h exit_handler}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK|hjubah}(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}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhhhhhKubh)}(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 }(hjwhhhNhNubj)}(h`15 * sizeof(long)`h]h15 * sizeof(long)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh. 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 }(hjwhhhNhNubj)}(h`sizeof(long)`h]h sizeof(long)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh/ and each fprobe which has exit handler uses a }(hjwhhhNhNubj)}(h`sizeof(long)`h]h sizeof(long)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubhe space on the stack, you should keep the number of fprobes on the same function as small as possible.}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjfhhubeh}(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);}hj sbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhKhjhhubh)}(h)}(hhh](jC)}(h fprobe_hlisth]jI)}(hstruct fprobe_hlisth](jO)}(hjRh]hstruct}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjhhhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK"ubja)}(h h]h }(hj hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjhhhj hK"ubjr)}(h fprobe_hlisth]jx)}(hjh]h fprobe_hlist}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubah}(h]h ](jjeh"]h$]h&]hhuh1jqhjhhhj hK"ubeh}(h]h ]h"]h$]h&]hhjuh1jHjjhjhhhj hK"ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jBhj hK"hjhhubj)}(hhh]h)}(hhash list nodes for fprobe.h]hhash list nodes for fprobe.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK$hj>hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hK"ubeh}(h]h ](jstructeh"]h$]h&]jjjjYjjYjjjuh1j=hhhjhNhNubj)}(hX**Definition**:: struct fprobe_hlist { struct hlist_node hlist; struct rcu_head rcu; struct fprobe *fp; int size; struct fprobe_hlist_node array[] ; }; **Members** ``hlist`` The hlist node for existence checking hash table. ``rcu`` rcu_head for RCU deferred release. ``fp`` The fprobe which owns this fprobe_hlist. ``size`` The size of **array**. ``array`` The fprobe_hlist_node for each address to probe.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh:}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK(hj]ubj)}(hstruct fprobe_hlist { struct hlist_node hlist; struct rcu_head rcu; struct fprobe *fp; int size; struct fprobe_hlist_node array[] ; };h]hstruct fprobe_hlist { struct hlist_node hlist; struct rcu_head rcu; struct fprobe *fp; int size; struct fprobe_hlist_node array[] ; };}hj~sbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK*hj]ubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK2hj]ubj)}(hhh](j)}(h<``hlist`` The hlist node for existence checking hash table. h](j)}(h ``hlist``h]j")}(hjh]hhlist}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK'hjubj)}(hhh]h)}(h1The hlist node for existence checking hash table.h]h1The hlist node for existence checking hash table.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK'hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK'hjubj)}(h+``rcu`` rcu_head for RCU deferred release. h](j)}(h``rcu``h]j")}(hjh]hrcu}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK(hjubj)}(hhh]h)}(h"rcu_head for RCU deferred release.h]h"rcu_head for RCU deferred release.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK(hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK(hjubj)}(h0``fp`` The fprobe which owns this fprobe_hlist. h](j)}(h``fp``h]j")}(hj h]hfp}(hj" hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hj ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK)hj ubj)}(hhh]h)}(h(The fprobe which owns this fprobe_hlist.h]h(The fprobe which owns this fprobe_hlist.}(hj9 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5 hK)hj6 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj5 hK)hjubj)}(h ``size`` The size of **array**. h](j)}(h``size``h]j")}(hjY h]hsize}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjW ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK*hjS ubj)}(hhh]h)}(hThe size of **array**.h](h The size of }(hjr hhhNhNubj)}(h **array**h]harray}(hjz hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjr ubh.}(hjr hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjn hK*hjo ubah}(h]h ]h"]h$]h&]uh1jhjS ubeh}(h]h ]h"]h$]h&]uh1jhjn hK*hjubj)}(h:``array`` The fprobe_hlist_node for each address to probe.h](j)}(h ``array``h]j")}(hj h]harray}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hj ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK*hj ubj)}(hhh]h)}(h0The fprobe_hlist_node for each address to probe.h]h0The fprobe_hlist_node for each address to probe.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK+hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hK*hjubeh}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj-)}(hhh]h}(h]h ]h"]h$]h&]entries](j9fprobe (C struct)c.fprobehNtauh1j,hjhhhNhNubj>)}(hhh](jC)}(hfprobeh]jI)}(h struct fprobeh](jO)}(hjRh]hstruct}(hj hhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhj hhhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK1ubja)}(h h]h }(hj hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hj hhhj hK1ubjr)}(hfprobeh]jx)}(hj h]hfprobe}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj ubah}(h]h ](jjeh"]h$]h&]hhuh1jqhj hhhj hK1ubeh}(h]h ]h"]h$]h&]hhjuh1jHjjhj hhhj hK1ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jBhj hK1hj hhubj)}(hhh]h)}(hftrace based probe.h]hftrace based probe.}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK5hj= hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hK1ubeh}(h]h ](jstructeh"]h$]h&]jjjjX jjX jjjuh1j=hhhjhNhNubj)}(hX\**Definition**:: struct fprobe { unsigned long nmissed; unsigned int flags; size_t entry_data_size; fprobe_entry_cb entry_handler; fprobe_exit_cb exit_handler; struct fprobe_hlist *hlist_array; }; **Members** ``nmissed`` The counter for missing events. ``flags`` The status flag. ``entry_data_size`` The private data storage size. ``entry_handler`` The callback function for function entry. ``exit_handler`` The callback function for function exit. ``hlist_array`` The fprobe_hlist for fprobe search from IP hash table.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj` ubh:}(hj` hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK9hj\ ubj)}(hstruct fprobe { unsigned long nmissed; unsigned int flags; size_t entry_data_size; fprobe_entry_cb entry_handler; fprobe_exit_cb exit_handler; struct fprobe_hlist *hlist_array; };h]hstruct fprobe { unsigned long nmissed; unsigned int flags; size_t entry_data_size; fprobe_entry_cb entry_handler; fprobe_exit_cb exit_handler; struct fprobe_hlist *hlist_array; };}hj} sbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK;hj\ ubh)}(h **Members**h]j)}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKDhj\ ubj)}(hhh](j)}(h,``nmissed`` The counter for missing events. h](j)}(h ``nmissed``h]j")}(hj h]hnmissed}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hj ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK8hj ubj)}(hhh]h)}(hThe counter for missing events.h]hThe counter for missing events.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK8hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hK8hj ubj)}(h``flags`` The status flag. h](j)}(h ``flags``h]j")}(hj h]hflags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hj ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK9hj ubj)}(hhh]h)}(hThe status flag.h]hThe status flag.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK9hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hK9hj ubj)}(h3``entry_data_size`` The private data storage size. h](j)}(h``entry_data_size``h]j")}(hj h]hentry_data_size}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hj ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK:hj ubj)}(hhh]h)}(hThe private data storage size.h]hThe private data storage size.}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4 hK:hj5 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj4 hK:hj ubj)}(h<``entry_handler`` The callback function for function entry. h](j)}(h``entry_handler``h]j")}(hjX h]h entry_handler}(hjZ hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjV ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK;hjR ubj)}(hhh]h)}(h)The callback function for function entry.h]h)The callback function for function entry.}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjm hK;hjn ubah}(h]h ]h"]h$]h&]uh1jhjR ubeh}(h]h ]h"]h$]h&]uh1jhjm hK;hj ubj)}(h:``exit_handler`` The callback function for function exit. h](j)}(h``exit_handler``h]j")}(hj h]h exit_handler}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hj ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhK)}(hhh](jC)}(h'void disable_fprobe (struct fprobe *fp)h]jI)}(h&void disable_fprobe(struct fprobe *fp)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hj& hhhNhNubah}(h]h ]ktah"]h$]h&]uh1j$ hj hhhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKubja)}(h h]h }(hj6 hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hj hhhj5 hKubjr)}(hdisable_fprobeh]jx)}(hdisable_fprobeh]hdisable_fprobe}(hjH hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjD ubah}(h]h ](jjeh"]h$]h&]hhuh1jqhj hhhj5 hKubhdesc_parameterlist)}(h(struct fprobe *fp)h]hdesc_parameter)}(hstruct fprobe *fph](jO)}(hjRh]hstruct}(hjh hhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjd ubja)}(h h]h }(hju hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjd ubh)}(hhh]jx)}(hfprobeh]hfprobe}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj ubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetj modnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}j jJ sbc.disable_fprobeasbuh1hhjd ubja)}(h h]h }(hj hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjd ubhdesc_sig_punctuation)}(h*h]h*}(hj hhhNhNubah}(h]h ]pah"]h$]h&]uh1j hjd ubjx)}(hfph]hfp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjd ubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hj^ ubah}(h]h ]h"]h$]h&]hhuh1j\ hj hhhj5 hKubeh}(h]h ]h"]h$]h&]hhjuh1jHjjhj hhhj5 hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jBhj5 hKhj hhubj)}(hhh]h)}(hDisable fprobeh]hDisable fprobe}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj5 hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1j=hhhjhNhNubj)}(h**Parameters** ``struct fprobe *fp`` The fprobe to be disabled. **Description** This will soft-disable **fp**. Note that this doesn't remove the ftrace hooks from the function entry.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhj ubj)}(hhh]j)}(h1``struct fprobe *fp`` The fprobe to be disabled. h](j)}(h``struct fprobe *fp``h]j")}(hj8 h]hstruct fprobe *fp}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hj6 ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhj2 ubj)}(hhh]h)}(hThe fprobe to be disabled.h]hThe fprobe to be disabled.}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjM hKhjN ubah}(h]h ]h"]h$]h&]uh1jhj2 ubeh}(h]h ]h"]h$]h&]uh1jhjM hKhj/ ubah}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]j)}(hjs h]h Description}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhj ubh)}(hfThis will soft-disable **fp**. Note that this doesn't remove the ftrace hooks from the function entry.h](hThis will soft-disable }(hj hhhNhNubj)}(h**fp**h]hfp}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhK. Note that this doesn’t remove the ftrace hooks from the function entry.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj-)}(hhh]h}(h]h ]h"]h$]h&]entries](j9enable_fprobe (C function)c.enable_fprobehNtauh1j,hjhhhNhNubj>)}(hhh](jC)}(h&void enable_fprobe (struct fprobe *fp)h]jI)}(h%void enable_fprobe(struct fprobe *fp)h](j% )}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hj hhhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKubja)}(h h]h }(hj hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hj hhhj hKubjr)}(h enable_fprobeh]jx)}(h enable_fprobeh]h enable_fprobe}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj ubah}(h]h ](jjeh"]h$]h&]hhuh1jqhj hhhj hKubj] )}(h(struct fprobe *fp)h]jc )}(hstruct fprobe *fph](jO)}(hjRh]hstruct}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubh)}(hhh]jx)}(hfprobeh]hfprobe}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj'modnameN classnameNj j )}j ]j )}j j sbc.enable_fprobeasbuh1hhjubja)}(h h]h }(hjEhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj )}(hj h]h*}(hjShhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjx)}(hfph]hfp}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hj ubah}(h]h ]h"]h$]h&]hhuh1j\ hj hhhj hKubeh}(h]h ]h"]h$]h&]hhjuh1jHjjhj hhhj hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jBhj hKhj hhubj)}(hhh]h)}(h Enable fprobeh]h Enable fprobe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j=hhhjhNhNubj)}(hq**Parameters** ``struct fprobe *fp`` The fprobe to be enabled. **Description** This will soft-enable **fp**.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhjubj)}(hhh]j)}(h0``struct fprobe *fp`` The fprobe to be enabled. h](j)}(h``struct fprobe *fp``h]j")}(hjh]hstruct fprobe *fp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhjubj)}(hhh]h)}(hThe fprobe to be enabled.h]hThe fprobe to be enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(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&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhjubh)}(hThis will soft-enable **fp**.h](hThis will soft-enable }(hjhhhNhNubj)}(h**fp**h]hfp}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/trace/fprobe:196: ./include/linux/fprobe.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj-)}(hhh]h}(h]h ]h"]h$]h&]entries](j9register_fprobe (C function)c.register_fprobehNtauh1j,hjhhhNhNubj>)}(hhh](jC)}(hRint register_fprobe (struct fprobe *fp, const char *filter, const char *notfilter)h]jI)}(hQint register_fprobe(struct fprobe *fp, const char *filter, const char *notfilter)h](j% )}(hinth]hint}(hj]hhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hjYhhhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chM ubja)}(h h]h }(hjlhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjYhhhjkhM ubjr)}(hregister_fprobeh]jx)}(hregister_fprobeh]hregister_fprobe}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjzubah}(h]h ](jjeh"]h$]h&]hhuh1jqhjYhhhjkhM ubj] )}(h>(struct fprobe *fp, const char *filter, const char *notfilter)h](jc )}(hstruct fprobe *fph](jO)}(hjRh]hstruct}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubh)}(hhh]jx)}(hfprobeh]hfprobe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jsbc.register_fprobeasbuh1hhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjx)}(hfph]hfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubjc )}(hconst char *filterh](jO)}(hconsth]hconst}(hj hhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj% )}(hcharh]hchar}(hj(hhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hjubja)}(h h]h }(hj6hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj )}(hj h]h*}(hjDhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjx)}(hfilterh]hfilter}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubjc )}(hconst char *notfilterh](jO)}(hjh]hconst}(hjjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjfubja)}(h h]h }(hjwhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjfubj% )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hjfubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjfubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjfubjx)}(h notfilterh]h notfilter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjfubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubeh}(h]h ]h"]h$]h&]hhuh1j\ hjYhhhjkhM ubeh}(h]h ]h"]h$]h&]hhjuh1jHjjhjUhhhjkhM ubah}(h]jPah ](jjeh"]h$]h&]jj)jhuh1jBhjkhM hjRhhubj)}(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.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjRhhhjkhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j=hhhjhNhNubj)}(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&]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&]uh1j!hjubah}(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.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hMhj/ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj.hMhjubj)}(h=``const char *filter`` A wildcard pattern of probed symbols. h](j)}(h``const char *filter``h]j")}(hjRh]hconst char *filter}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjPubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjLubj)}(hhh]h)}(h%A wildcard pattern of probed symbols.h]h%A wildcard pattern of probed symbols.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMhjhubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jhjghMhjubj)}(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&]uh1j!hjubah}(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&]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)}(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}(hjhhhNhNubah}(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}(hjhhhNhNubah}(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.chMhjubh)}(h=Return 0 if **fp** is registered successfully, -errno if not.h](h Return 0 if }(hj3hhhNhNubj)}(h**fp**h]hfp}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh+ is registered successfully, -errno if not.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj-)}(hhh]h}(h]h ]h"]h$]h&]entries](j9 register_fprobe_ips (C function)c.register_fprobe_ipshNtauh1j,hjhhhNhNubj>)}(hhh](jC)}(hJint register_fprobe_ips (struct fprobe *fp, unsigned long *addrs, int num)h]jI)}(hIint register_fprobe_ips(struct fprobe *fp, unsigned long *addrs, int num)h](j% )}(hinth]hint}(hjthhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hjphhhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chM;ubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjphhhjhM;ubjr)}(hregister_fprobe_ipsh]jx)}(hregister_fprobe_ipsh]hregister_fprobe_ips}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubah}(h]h ](jjeh"]h$]h&]hhuh1jqhjphhhjhM;ubj] )}(h2(struct fprobe *fp, unsigned long *addrs, int num)h](jc )}(hstruct fprobe *fph](jO)}(hjRh]hstruct}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubh)}(hhh]jx)}(hfprobeh]hfprobe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jsbc.register_fprobe_ipsasbuh1hhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjx)}(hfph]hfp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubjc )}(hunsigned long *addrsh](j% )}(hunsignedh]hunsigned}(hj#hhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hjubja)}(h h]h }(hj1hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj% )}(hlongh]hlong}(hj?hhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hjubja)}(h h]h }(hjMhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj )}(hj h]h*}(hj[hhhNhNubah}(h]h ]j ah"]h$]h&gT]uh1j hjubjx)}(haddrsh]haddrs}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubjc )}(hint numh](j% )}(hinth]hint}(hjhhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hj}ubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hj}ubjx)}(hnumh]hnum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj}ubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubeh}(h]h ]h"]h$]h&]hhuh1j\ hjphhhjhM;ubeh}(h]h ]h"]h$]h&]hhjuh1jHjjhjlhhhjhM;ubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1jBhjhM;hjihhubj)}(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.chM;hjhhubah}(h]h ]h"]h$]h&]uh1jhjihhhjhM;ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j=hhhjhNhNubj)}(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.chM?hjubj)}(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}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chM<hjubj)}(hhh]h)}(h)A fprobe data structure to be registered.h]h)A fprobe data structure to be registered.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM<hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM<hjubj)}(h>``unsigned long *addrs`` An array of target function address. h](j)}(h``unsigned long *addrs``h]j")}(hjAh]hunsigned long *addrs}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j!hj?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$An array of target function address.h]h$An array of target function address.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhM=hjWubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhM=hjubj)}(h0``int num`` The number of entries of **addrs**. h](j)}(h ``int num``h]j")}(hjzh]hint num}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjxubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chM>hjtubj)}(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&]uh1hhjhM>hjubah}(h]h ]h"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]uh1jhjhM>hjubeh}(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.chM@hjubh)}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. The }(hjhhhNhNubj)}(h **addrs**h]haddrs}(hj hhhNhNubah}(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.chM?hjubh)}(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.chMDhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj-)}(hhh]h}(h]h ]h"]h$]h&]entries](j9!register_fprobe_syms (C function)c.register_fprobe_symshNtauh1j,hjhhhNhNubj>)}(hhh](jC)}(hHint register_fprobe_syms (struct fprobe *fp, const char **syms, int num)h]jI)}(hGint register_fprobe_syms(struct fprobe *fp, const char **syms, int num)h](j% )}(hinth]hint}(hjchhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hj_hhhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMoubja)}(h h]h }(hjrhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hj_hhhjqhMoubjr)}(hregister_fprobe_symsh]jx)}(hregister_fprobe_symsh]hregister_fprobe_syms}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubah}(h]h ](jjeh"]h$]h&]hhuh1jqhj_hhhjqhMoubj] )}(h/(struct fprobe *fp, const char **syms, int num)h](jc )}(hstruct fprobe *fph](jO)}(hjRh]hstruct}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubh)}(hhh]jx)}(hfprobeh]hfprobe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j jsbc.register_fprobe_symsasbuh1hhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjx)}(hfph]hfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubjc )}(hconst char **symsh](jO)}(hjh]hconst}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj% )}(hcharh]hchar}(hj-hhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hjubja)}(h h]h }(hj;hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj )}(hj h]h*}(hjIhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj )}(hj h]h*}(hjVhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjx)}(hsymsh]hsyms}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubjc )}(hint numh](j% )}(hinth]hint}(hj|hhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hjxubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjxubjx)}(hnumh]hnum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjxubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubeh}(h]h ]h"]h$]h&]hhuh1j\ hj_hhhjqhMoubeh}(h]h ]h"]h$]h&]hhjuh1jHjjhj[hhhjqhMoubah}(h]jVah ](jjeh"]h$]h&]jj)jhuh1jBhjqhMohjXhhubj)}(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.chMohjhhubah}(h]h ]h"]h$]h&]uh1jhjXhhhjqhMoubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j=hhhjhNhNubj)}(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.chMshjubj)}(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&]uh1j!hjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMphjubj)}(hhh]h)}(h)A fprobe data structure to be registered.h]h)A fprobe data structure to be registered.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMphjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMphjubj)}(h2``const char **syms`` An array of target symbols. h](j)}(h``const char **syms``h]j")}(hj<h]hconst char **syms}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j!hj:ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMqhj6ubj)}(hhh]h)}(hAn array of target symbols.h]hAn array of target symbols.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhMqhjRubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMqhjubj)}(h/``int num`` The number of entries of **syms**. h](j)}(h ``int num``h]j")}(hjuh]hint num}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjsubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMrhjoubj)}(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&]uh1hhjhMrhjubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjhMrhjubeh}(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.chMthjubh)}(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.chMshjubh)}(h=Return 0 if **fp** is registered successfully, -errno if not.h](h Return 0 if }(hj hhhNhNubj)}(h**fp**h]hfp}(hjhhhNhNubah}(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.chMvhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj-)}(hhh]h}(h]h ]h"]h$]h&]entries](j9unregister_fprobe (C function)c.unregister_fprobehNtauh1j,hjhhhNhNubj>)}(hhh](jC)}(h)int unregister_fprobe (struct fprobe *fp)h]jI)}(h(int unregister_fprobe(struct fprobe *fp)h](j% )}(hinth]hint}(hjLhhhNhNubah}(h]h ]j1 ah"]h$]h&]uh1j$ hjHhhhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMubja)}(h h]h }(hj[hhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjHhhhjZhMubjr)}(hunregister_fprobeh]jx)}(hunregister_fprobeh]hunregister_fprobe}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjiubah}(h]h ](jjeh"]h$]h&]hhuh1jqhjHhhhjZhMubj] )}(h(struct fprobe *fp)h]jc )}(hstruct fprobe *fph](jO)}(hjRh]hstruct}(hjhhhNhNubah}(h]h ]j[ah"]h$]h&]uh1jNhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubh)}(hhh]jx)}(hfprobeh]hfprobe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNj j )}j ]j )}j josbc.unregister_fprobeasbuh1hhjubja)}(h h]h }(hjhhhNhNubah}(h]h ]jmah"]h$]h&]uh1j`hjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjx)}(hfph]hfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jb hjubah}(h]h ]h"]h$]h&]hhuh1j\ hjHhhhjZhMubeh}(h]h ]h"]h$]h&]hhjuh1jHjjhjDhhhjZhMubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jBhjZhMhjAhhubj)}(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.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjZhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj$jj$jjjuh1j=hhhjhNhNubj)}(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)}(hj.h]h Parameters}(hj0hhhNhNubah}(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)}(hB``struct fprobe *fp`` A fprobe data structure to be unregistered. h](j)}(h``struct fprobe *fp``h]j")}(hjMh]hstruct fprobe *fp}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j!hjKubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/trace/fprobe:197: ./kernel/trace/fprobe.chMhjGubj)}(hhh]h)}(h+A fprobe data structure to be unregistered.h]h+A fprobe data structure to be unregistered.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhMhjcubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjDubah}(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)}(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.chMhj(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.chMhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(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}(jjhhjjjcj`jjjBj?jjjju nametypes}(jhjjcjjBjjuh}(jhhhjjj`jjjfj?jjjEjjj;jDjjj j j j j j jPjUjgjljVj[j?jDu 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.