tracing: Consolidate event trigger code
The event trigger code that checks for callback triggers before and after recording of an event has lots of flags checks. This code is duplicated throughout the ftrace events, kprobes and system calls. They all do the exact same checks against the event flags. Added helper functions ftrace_trigger_soft_disabled(), event_trigger_unlock_commit() and event_trigger_unlock_commit_regs() that consolidated the code and these are used instead. Link: http://lkml.kernel.org/r/20140106222703.5e7dbba2@gandalf.local.home Acked-by: Tom Zanussi <tom.zanussi@linux.intel.com> Tested-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:

committed by
Steven Rostedt

parent
e8dc637152
commit
13a1e4aef5
@@ -929,20 +929,12 @@ __kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
|
||||
struct ring_buffer *buffer;
|
||||
int size, dsize, pc;
|
||||
unsigned long irq_flags;
|
||||
unsigned long eflags;
|
||||
enum event_trigger_type tt = ETT_NONE;
|
||||
struct ftrace_event_call *call = &tk->tp.call;
|
||||
|
||||
WARN_ON(call != ftrace_file->event_call);
|
||||
|
||||
eflags = ftrace_file->flags;
|
||||
|
||||
if (!(eflags & FTRACE_EVENT_FL_TRIGGER_COND)) {
|
||||
if (eflags & FTRACE_EVENT_FL_TRIGGER_MODE)
|
||||
event_triggers_call(ftrace_file, NULL);
|
||||
if (eflags & FTRACE_EVENT_FL_SOFT_DISABLED)
|
||||
return;
|
||||
}
|
||||
if (ftrace_trigger_soft_disabled(ftrace_file))
|
||||
return;
|
||||
|
||||
local_save_flags(irq_flags);
|
||||
pc = preempt_count();
|
||||
@@ -960,16 +952,8 @@ __kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
|
||||
entry->ip = (unsigned long)tk->rp.kp.addr;
|
||||
store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
|
||||
|
||||
if (eflags & FTRACE_EVENT_FL_TRIGGER_COND)
|
||||
tt = event_triggers_call(ftrace_file, entry);
|
||||
|
||||
if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, &ftrace_file->flags))
|
||||
ring_buffer_discard_commit(buffer, event);
|
||||
else if (!filter_check_discard(ftrace_file, entry, buffer, event))
|
||||
trace_buffer_unlock_commit_regs(buffer, event,
|
||||
irq_flags, pc, regs);
|
||||
if (tt)
|
||||
event_triggers_post_call(ftrace_file, tt);
|
||||
event_trigger_unlock_commit_regs(ftrace_file, buffer, event,
|
||||
entry, irq_flags, pc, regs);
|
||||
}
|
||||
|
||||
static __kprobes void
|
||||
@@ -992,20 +976,12 @@ __kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
|
||||
struct ring_buffer *buffer;
|
||||
int size, pc, dsize;
|
||||
unsigned long irq_flags;
|
||||
unsigned long eflags;
|
||||
enum event_trigger_type tt = ETT_NONE;
|
||||
struct ftrace_event_call *call = &tk->tp.call;
|
||||
|
||||
WARN_ON(call != ftrace_file->event_call);
|
||||
|
||||
eflags = ftrace_file->flags;
|
||||
|
||||
if (!(eflags & FTRACE_EVENT_FL_TRIGGER_COND)) {
|
||||
if (eflags & FTRACE_EVENT_FL_TRIGGER_MODE)
|
||||
event_triggers_call(ftrace_file, NULL);
|
||||
if (eflags & FTRACE_EVENT_FL_SOFT_DISABLED)
|
||||
return;
|
||||
}
|
||||
if (ftrace_trigger_soft_disabled(ftrace_file))
|
||||
return;
|
||||
|
||||
local_save_flags(irq_flags);
|
||||
pc = preempt_count();
|
||||
@@ -1024,16 +1000,8 @@ __kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
|
||||
entry->ret_ip = (unsigned long)ri->ret_addr;
|
||||
store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize);
|
||||
|
||||
if (eflags & FTRACE_EVENT_FL_TRIGGER_COND)
|
||||
tt = event_triggers_call(ftrace_file, entry);
|
||||
|
||||
if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, &ftrace_file->flags))
|
||||
ring_buffer_discard_commit(buffer, event);
|
||||
else if (!filter_check_discard(ftrace_file, entry, buffer, event))
|
||||
trace_buffer_unlock_commit_regs(buffer, event,
|
||||
irq_flags, pc, regs);
|
||||
if (tt)
|
||||
event_triggers_post_call(ftrace_file, tt);
|
||||
event_trigger_unlock_commit_regs(ftrace_file, buffer, event,
|
||||
entry, irq_flags, pc, regs);
|
||||
}
|
||||
|
||||
static __kprobes void
|
||||
|
Reference in New Issue
Block a user