Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 257129
b: refs/heads/master
c: 1538f88
h: refs/heads/master
i:
  257127: a6b9357
v: v3
  • Loading branch information
Masami Hiramatsu authored and Steven Rostedt committed Jul 15, 2011
1 parent 8da38c6 commit cd8a063
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 57 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7143f168e2aa4bc7f8a8bcfe46d8dc52f7be869a
refs/heads/master: 1538f888f1e793de04e0f90372352ac1b05833cf
92 changes: 36 additions & 56 deletions trunk/kernel/trace/trace_kprobe.c
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,34 @@ static struct trace_probe *find_trace_probe(const char *event,
return NULL;
}

/* Enable trace_probe - @flag must be TP_FLAG_TRACE or TP_FLAG_PROFILE */
static int enable_trace_probe(struct trace_probe *tp, int flag)
{
int ret = 0;

tp->flags |= flag;
if (tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE)) {
if (trace_probe_is_return(tp))
ret = enable_kretprobe(&tp->rp);
else
ret = enable_kprobe(&tp->rp.kp);
}

return ret;
}

/* Disable trace_probe - @flag must be TP_FLAG_TRACE or TP_FLAG_PROFILE */
static void disable_trace_probe(struct trace_probe *tp, int flag)
{
tp->flags &= ~flag;
if (!(tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE))) {
if (trace_probe_is_return(tp))
disable_kretprobe(&tp->rp);
else
disable_kprobe(&tp->rp.kp);
}
}

/* Unregister a trace_probe and probe_event: call with locking probe_lock */
static void unregister_trace_probe(struct trace_probe *tp)
{
Expand Down Expand Up @@ -1514,30 +1542,6 @@ print_kretprobe_event(struct trace_iterator *iter, int flags,
return TRACE_TYPE_PARTIAL_LINE;
}

static int probe_event_enable(struct ftrace_event_call *call)
{
struct trace_probe *tp = (struct trace_probe *)call->data;

tp->flags |= TP_FLAG_TRACE;
if (trace_probe_is_return(tp))
return enable_kretprobe(&tp->rp);
else
return enable_kprobe(&tp->rp.kp);
}

static void probe_event_disable(struct ftrace_event_call *call)
{
struct trace_probe *tp = (struct trace_probe *)call->data;

tp->flags &= ~TP_FLAG_TRACE;
if (!(tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE))) {
if (trace_probe_is_return(tp))
disable_kretprobe(&tp->rp);
else
disable_kprobe(&tp->rp.kp);
}
}

#undef DEFINE_FIELD
#define DEFINE_FIELD(type, item, name, is_signed) \
do { \
Expand Down Expand Up @@ -1716,49 +1720,25 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri,
head = this_cpu_ptr(call->perf_events);
perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, regs, head);
}

static int probe_perf_enable(struct ftrace_event_call *call)
{
struct trace_probe *tp = (struct trace_probe *)call->data;

tp->flags |= TP_FLAG_PROFILE;

if (trace_probe_is_return(tp))
return enable_kretprobe(&tp->rp);
else
return enable_kprobe(&tp->rp.kp);
}

static void probe_perf_disable(struct ftrace_event_call *call)
{
struct trace_probe *tp = (struct trace_probe *)call->data;

tp->flags &= ~TP_FLAG_PROFILE;

if (!(tp->flags & TP_FLAG_TRACE)) {
if (trace_probe_is_return(tp))
disable_kretprobe(&tp->rp);
else
disable_kprobe(&tp->rp.kp);
}
}
#endif /* CONFIG_PERF_EVENTS */

static __kprobes
int kprobe_register(struct ftrace_event_call *event, enum trace_reg type)
{
struct trace_probe *tp = (struct trace_probe *)event->data;

switch (type) {
case TRACE_REG_REGISTER:
return probe_event_enable(event);
return enable_trace_probe(tp, TP_FLAG_TRACE);
case TRACE_REG_UNREGISTER:
probe_event_disable(event);
disable_trace_probe(tp, TP_FLAG_TRACE);
return 0;

#ifdef CONFIG_PERF_EVENTS
case TRACE_REG_PERF_REGISTER:
return probe_perf_enable(event);
return enable_trace_probe(tp, TP_FLAG_PROFILE);
case TRACE_REG_PERF_UNREGISTER:
probe_perf_disable(event);
disable_trace_probe(tp, TP_FLAG_PROFILE);
return 0;
#endif
}
Expand Down Expand Up @@ -1905,7 +1885,7 @@ static __init int kprobe_trace_self_tests_init(void)
pr_warning("error on getting new probe.\n");
warn++;
} else
probe_event_enable(&tp->call);
enable_trace_probe(tp, TP_FLAG_TRACE);
}

ret = command_trace_probe("r:testprobe2 kprobe_trace_selftest_target "
Expand All @@ -1920,7 +1900,7 @@ static __init int kprobe_trace_self_tests_init(void)
pr_warning("error on getting new probe.\n");
warn++;
} else
probe_event_enable(&tp->call);
enable_trace_probe(tp, TP_FLAG_TRACE);
}

if (warn)
Expand Down

0 comments on commit cd8a063

Please sign in to comment.