tracing/kprobe: Check registered state using kprobe
Change registered check only by trace_kprobe and remove TP_FLAG_REGISTERED from trace_probe, since this feature is only used for trace_kprobe. Link: http://lkml.kernel.org/r/155931588704.28323.4952266828256245833.stgit@devnote2 Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
Родитель
e3dc9f898e
Коммит
715fa2fd4c
|
@ -157,6 +157,12 @@ static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk)
|
|||
return nhit;
|
||||
}
|
||||
|
||||
static nokprobe_inline bool trace_kprobe_is_registered(struct trace_kprobe *tk)
|
||||
{
|
||||
return !(list_empty(&tk->rp.kp.list) &&
|
||||
hlist_unhashed(&tk->rp.kp.hlist));
|
||||
}
|
||||
|
||||
/* Return 0 if it fails to find the symbol address */
|
||||
static nokprobe_inline
|
||||
unsigned long trace_kprobe_address(struct trace_kprobe *tk)
|
||||
|
@ -244,6 +250,8 @@ static struct trace_kprobe *alloc_trace_kprobe(const char *group,
|
|||
tk->rp.kp.pre_handler = kprobe_dispatcher;
|
||||
|
||||
tk->rp.maxactive = maxactive;
|
||||
INIT_HLIST_NODE(&tk->rp.kp.hlist);
|
||||
INIT_LIST_HEAD(&tk->rp.kp.list);
|
||||
|
||||
ret = trace_probe_init(&tk->tp, event, group);
|
||||
if (ret < 0)
|
||||
|
@ -273,7 +281,7 @@ static inline int __enable_trace_kprobe(struct trace_kprobe *tk)
|
|||
{
|
||||
int ret = 0;
|
||||
|
||||
if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
|
||||
if (trace_kprobe_is_registered(tk) && !trace_kprobe_has_gone(tk)) {
|
||||
if (trace_kprobe_is_return(tk))
|
||||
ret = enable_kretprobe(&tk->rp);
|
||||
else
|
||||
|
@ -333,7 +341,7 @@ disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
|
|||
} else
|
||||
trace_probe_clear_flag(tp, TP_FLAG_PROFILE);
|
||||
|
||||
if (!trace_probe_is_enabled(tp) && trace_probe_is_registered(tp)) {
|
||||
if (!trace_probe_is_enabled(tp) && trace_kprobe_is_registered(tk)) {
|
||||
if (trace_kprobe_is_return(tk))
|
||||
disable_kretprobe(&tk->rp);
|
||||
else
|
||||
|
@ -381,7 +389,7 @@ static int __register_trace_kprobe(struct trace_kprobe *tk)
|
|||
{
|
||||
int i, ret;
|
||||
|
||||
if (trace_probe_is_registered(&tk->tp))
|
||||
if (trace_kprobe_is_registered(tk))
|
||||
return -EINVAL;
|
||||
|
||||
if (within_notrace_func(tk)) {
|
||||
|
@ -407,21 +415,20 @@ static int __register_trace_kprobe(struct trace_kprobe *tk)
|
|||
else
|
||||
ret = register_kprobe(&tk->rp.kp);
|
||||
|
||||
if (ret == 0)
|
||||
trace_probe_set_flag(&tk->tp, TP_FLAG_REGISTERED);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Internal unregister function - just handle k*probes and flags */
|
||||
static void __unregister_trace_kprobe(struct trace_kprobe *tk)
|
||||
{
|
||||
if (trace_probe_is_registered(&tk->tp)) {
|
||||
if (trace_kprobe_is_registered(tk)) {
|
||||
if (trace_kprobe_is_return(tk))
|
||||
unregister_kretprobe(&tk->rp);
|
||||
else
|
||||
unregister_kprobe(&tk->rp.kp);
|
||||
trace_probe_clear_flag(&tk->tp, TP_FLAG_REGISTERED);
|
||||
/* Cleanup kprobe for reuse */
|
||||
/* Cleanup kprobe for reuse and mark it unregistered */
|
||||
INIT_HLIST_NODE(&tk->rp.kp.hlist);
|
||||
INIT_LIST_HEAD(&tk->rp.kp.list);
|
||||
if (tk->rp.kp.symbol_name)
|
||||
tk->rp.kp.addr = NULL;
|
||||
}
|
||||
|
|
|
@ -55,7 +55,6 @@
|
|||
/* Flags for trace_probe */
|
||||
#define TP_FLAG_TRACE 1
|
||||
#define TP_FLAG_PROFILE 2
|
||||
#define TP_FLAG_REGISTERED 4
|
||||
|
||||
/* data_loc: data location, compatible with u32 */
|
||||
#define make_data_loc(len, offs) \
|
||||
|
@ -261,11 +260,6 @@ static inline bool trace_probe_is_enabled(struct trace_probe *tp)
|
|||
return trace_probe_test_flag(tp, TP_FLAG_TRACE | TP_FLAG_PROFILE);
|
||||
}
|
||||
|
||||
static inline bool trace_probe_is_registered(struct trace_probe *tp)
|
||||
{
|
||||
return trace_probe_test_flag(tp, TP_FLAG_REGISTERED);
|
||||
}
|
||||
|
||||
static inline const char *trace_probe_name(struct trace_probe *tp)
|
||||
{
|
||||
return trace_event_name(&tp->call);
|
||||
|
|
Загрузка…
Ссылка в новой задаче