Commit 715fa2fd authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Steven Rostedt (VMware)

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@devnote2Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent e3dc9f89
...@@ -157,6 +157,12 @@ static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk) ...@@ -157,6 +157,12 @@ static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk)
return nhit; 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 */ /* Return 0 if it fails to find the symbol address */
static nokprobe_inline static nokprobe_inline
unsigned long trace_kprobe_address(struct trace_kprobe *tk) unsigned long trace_kprobe_address(struct trace_kprobe *tk)
...@@ -244,6 +250,8 @@ static struct trace_kprobe *alloc_trace_kprobe(const char *group, ...@@ -244,6 +250,8 @@ static struct trace_kprobe *alloc_trace_kprobe(const char *group,
tk->rp.kp.pre_handler = kprobe_dispatcher; tk->rp.kp.pre_handler = kprobe_dispatcher;
tk->rp.maxactive = maxactive; 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); ret = trace_probe_init(&tk->tp, event, group);
if (ret < 0) if (ret < 0)
...@@ -273,7 +281,7 @@ static inline int __enable_trace_kprobe(struct trace_kprobe *tk) ...@@ -273,7 +281,7 @@ static inline int __enable_trace_kprobe(struct trace_kprobe *tk)
{ {
int ret = 0; 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)) if (trace_kprobe_is_return(tk))
ret = enable_kretprobe(&tk->rp); ret = enable_kretprobe(&tk->rp);
else else
...@@ -333,7 +341,7 @@ disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file) ...@@ -333,7 +341,7 @@ disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
} else } else
trace_probe_clear_flag(tp, TP_FLAG_PROFILE); 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)) if (trace_kprobe_is_return(tk))
disable_kretprobe(&tk->rp); disable_kretprobe(&tk->rp);
else else
...@@ -381,7 +389,7 @@ static int __register_trace_kprobe(struct trace_kprobe *tk) ...@@ -381,7 +389,7 @@ static int __register_trace_kprobe(struct trace_kprobe *tk)
{ {
int i, ret; int i, ret;
if (trace_probe_is_registered(&tk->tp)) if (trace_kprobe_is_registered(tk))
return -EINVAL; return -EINVAL;
if (within_notrace_func(tk)) { if (within_notrace_func(tk)) {
...@@ -407,21 +415,20 @@ static int __register_trace_kprobe(struct trace_kprobe *tk) ...@@ -407,21 +415,20 @@ static int __register_trace_kprobe(struct trace_kprobe *tk)
else else
ret = register_kprobe(&tk->rp.kp); ret = register_kprobe(&tk->rp.kp);
if (ret == 0)
trace_probe_set_flag(&tk->tp, TP_FLAG_REGISTERED);
return ret; return ret;
} }
/* Internal unregister function - just handle k*probes and flags */ /* Internal unregister function - just handle k*probes and flags */
static void __unregister_trace_kprobe(struct trace_kprobe *tk) 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)) if (trace_kprobe_is_return(tk))
unregister_kretprobe(&tk->rp); unregister_kretprobe(&tk->rp);
else else
unregister_kprobe(&tk->rp.kp); unregister_kprobe(&tk->rp.kp);
trace_probe_clear_flag(&tk->tp, TP_FLAG_REGISTERED); /* Cleanup kprobe for reuse and mark it unregistered */
/* Cleanup kprobe for reuse */ INIT_HLIST_NODE(&tk->rp.kp.hlist);
INIT_LIST_HEAD(&tk->rp.kp.list);
if (tk->rp.kp.symbol_name) if (tk->rp.kp.symbol_name)
tk->rp.kp.addr = NULL; tk->rp.kp.addr = NULL;
} }
......
...@@ -55,7 +55,6 @@ ...@@ -55,7 +55,6 @@
/* Flags for trace_probe */ /* Flags for trace_probe */
#define TP_FLAG_TRACE 1 #define TP_FLAG_TRACE 1
#define TP_FLAG_PROFILE 2 #define TP_FLAG_PROFILE 2
#define TP_FLAG_REGISTERED 4
/* data_loc: data location, compatible with u32 */ /* data_loc: data location, compatible with u32 */
#define make_data_loc(len, offs) \ #define make_data_loc(len, offs) \
...@@ -261,11 +260,6 @@ static inline bool trace_probe_is_enabled(struct trace_probe *tp) ...@@ -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); 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) static inline const char *trace_probe_name(struct trace_probe *tp)
{ {
return trace_event_name(&tp->call); return trace_event_name(&tp->call);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment