aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_syscalls.c
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2014-01-06 21:32:10 -0500
committerSteven Rostedt <rostedt@goodmis.org>2014-01-09 21:20:07 -0500
commit13a1e4aef53b2a7684ddee374e749999ba103b4a (patch)
tree74acb760b6d12d4faaae4c4c76a146855e8352a5 /kernel/trace/trace_syscalls.c
parente8dc637152d2921447b012f58c51e0342304af33 (diff)
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>
Diffstat (limited to 'kernel/trace/trace_syscalls.c')
-rw-r--r--kernel/trace/trace_syscalls.c48
1 files changed, 8 insertions, 40 deletions
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
index a4acf9bbffa7..759d5e004517 100644
--- a/kernel/trace/trace_syscalls.c
+++ b/kernel/trace/trace_syscalls.c
@@ -306,10 +306,8 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id)
306 struct syscall_trace_enter *entry; 306 struct syscall_trace_enter *entry;
307 struct syscall_metadata *sys_data; 307 struct syscall_metadata *sys_data;
308 struct ring_buffer_event *event; 308 struct ring_buffer_event *event;
309 enum event_trigger_type tt = ETT_NONE;
310 struct ring_buffer *buffer; 309 struct ring_buffer *buffer;
311 unsigned long irq_flags; 310 unsigned long irq_flags;
312 unsigned long eflags;
313 int pc; 311 int pc;
314 int syscall_nr; 312 int syscall_nr;
315 int size; 313 int size;
@@ -323,14 +321,8 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id)
323 if (!ftrace_file) 321 if (!ftrace_file)
324 return; 322 return;
325 323
326 eflags = ftrace_file->flags; 324 if (ftrace_trigger_soft_disabled(ftrace_file))
327 325 return;
328 if (!(eflags & FTRACE_EVENT_FL_TRIGGER_COND)) {
329 if (eflags & FTRACE_EVENT_FL_TRIGGER_MODE)
330 event_triggers_call(ftrace_file, NULL);
331 if (eflags & FTRACE_EVENT_FL_SOFT_DISABLED)
332 return;
333 }
334 326
335 sys_data = syscall_nr_to_meta(syscall_nr); 327 sys_data = syscall_nr_to_meta(syscall_nr);
336 if (!sys_data) 328 if (!sys_data)
@@ -351,16 +343,8 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id)
351 entry->nr = syscall_nr; 343 entry->nr = syscall_nr;
352 syscall_get_arguments(current, regs, 0, sys_data->nb_args, entry->args); 344 syscall_get_arguments(current, regs, 0, sys_data->nb_args, entry->args);
353 345
354 if (eflags & FTRACE_EVENT_FL_TRIGGER_COND) 346 event_trigger_unlock_commit(ftrace_file, buffer, event, entry,
355 tt = event_triggers_call(ftrace_file, entry); 347 irq_flags, pc);
356
357 if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, &ftrace_file->flags))
358 ring_buffer_discard_commit(buffer, event);
359 else if (!filter_check_discard(ftrace_file, entry, buffer, event))
360 trace_current_buffer_unlock_commit(buffer, event,
361 irq_flags, pc);
362 if (tt)
363 event_triggers_post_call(ftrace_file, tt);
364} 348}
365 349
366static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret) 350static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret)
@@ -370,10 +354,8 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret)
370 struct syscall_trace_exit *entry; 354 struct syscall_trace_exit *entry;
371 struct syscall_metadata *sys_data; 355 struct syscall_metadata *sys_data;
372 struct ring_buffer_event *event; 356 struct ring_buffer_event *event;
373 enum event_trigger_type tt = ETT_NONE;
374 struct ring_buffer *buffer; 357 struct ring_buffer *buffer;
375 unsigned long irq_flags; 358 unsigned long irq_flags;
376 unsigned long eflags;
377 int pc; 359 int pc;
378 int syscall_nr; 360 int syscall_nr;
379 361
@@ -386,14 +368,8 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret)
386 if (!ftrace_file) 368 if (!ftrace_file)
387 return; 369 return;
388 370
389 eflags = ftrace_file->flags; 371 if (ftrace_trigger_soft_disabled(ftrace_file))
390 372 return;
391 if (!(eflags & FTRACE_EVENT_FL_TRIGGER_COND)) {
392 if (eflags & FTRACE_EVENT_FL_TRIGGER_MODE)
393 event_triggers_call(ftrace_file, NULL);
394 if (eflags & FTRACE_EVENT_FL_SOFT_DISABLED)
395 return;
396 }
397 373
398 sys_data = syscall_nr_to_meta(syscall_nr); 374 sys_data = syscall_nr_to_meta(syscall_nr);
399 if (!sys_data) 375 if (!sys_data)
@@ -413,16 +389,8 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret)
413 entry->nr = syscall_nr; 389 entry->nr = syscall_nr;
414 entry->ret = syscall_get_return_value(current, regs); 390 entry->ret = syscall_get_return_value(current, regs);
415 391
416 if (eflags & FTRACE_EVENT_FL_TRIGGER_COND) 392 event_trigger_unlock_commit(ftrace_file, buffer, event, entry,
417 tt = event_triggers_call(ftrace_file, entry); 393 irq_flags, pc);
418
419 if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, &ftrace_file->flags))
420 ring_buffer_discard_commit(buffer, event);
421 else if (!filter_check_discard(ftrace_file, entry, buffer, event))
422 trace_current_buffer_unlock_commit(buffer, event,
423 irq_flags, pc);
424 if (tt)
425 event_triggers_post_call(ftrace_file, tt);
426} 394}
427 395
428static int reg_event_syscall_enter(struct ftrace_event_file *file, 396static int reg_event_syscall_enter(struct ftrace_event_file *file,