OSDN Git Service

tracing: Use temp buffer when filtering events
[android-x86/kernel.git] / kernel / trace / trace.h
index ee8691c..5167c36 100644 (file)
@@ -1065,12 +1065,41 @@ struct trace_subsystem_dir {
        int                             nr_events;
 };
 
-extern int filter_check_discard(struct trace_event_file *file, void *rec,
-                               struct ring_buffer *buffer,
-                               struct ring_buffer_event *event);
 extern int call_filter_check_discard(struct trace_event_call *call, void *rec,
                                     struct ring_buffer *buffer,
                                     struct ring_buffer_event *event);
+
+void trace_buffer_unlock_commit_regs(struct trace_array *tr,
+                                    struct ring_buffer *buffer,
+                                    struct ring_buffer_event *event,
+                                    unsigned long flags, int pc,
+                                    struct pt_regs *regs);
+
+static inline void trace_buffer_unlock_commit(struct trace_array *tr,
+                                             struct ring_buffer *buffer,
+                                             struct ring_buffer_event *event,
+                                             unsigned long flags, int pc)
+{
+       trace_buffer_unlock_commit_regs(tr, buffer, event, flags, pc, NULL);
+}
+
+DECLARE_PER_CPU(struct ring_buffer_event *, trace_buffered_event);
+DECLARE_PER_CPU(int, trace_buffered_event_cnt);
+void trace_buffered_event_disable(void);
+void trace_buffered_event_enable(void);
+
+static inline void
+__trace_event_discard_commit(struct ring_buffer *buffer,
+                            struct ring_buffer_event *event)
+{
+       if (this_cpu_read(trace_buffered_event) == event) {
+               /* Simply release the temp buffer */
+               this_cpu_dec(trace_buffered_event_cnt);
+               return;
+       }
+       ring_buffer_discard_commit(buffer, event);
+}
+
 /*
  * Helper function for event_trigger_unlock_commit{_regs}().
  * If there are event triggers attached to this event that requires
@@ -1096,12 +1125,14 @@ __event_trigger_test_discard(struct trace_event_file *file,
        if (eflags & EVENT_FILE_FL_TRIGGER_COND)
                *tt = event_triggers_call(file, entry);
 
-       if (test_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags))
-               ring_buffer_discard_commit(buffer, event);
-       else if (!filter_check_discard(file, entry, buffer, event))
-               return false;
+       if (test_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags) ||
+           (unlikely(file->flags & EVENT_FILE_FL_FILTERED) &&
+            !filter_match_preds(file->filter, entry))) {
+               __trace_event_discard_commit(buffer, event);
+               return true;
+       }
 
-       return true;
+       return false;
 }
 
 /**