Skip to content

Commit

Permalink
tracing: Rewrite filter logic to be simpler and faster
Browse files Browse the repository at this point in the history
Al Viro reviewed the filter logic of ftrace trace events and found it to be
very troubling. It creates a binary tree based on the logic operators and
walks it during tracing. He sent myself and Tom Zanussi a long explanation
(and formal proof) of how to do the string parsing better and end up with a
program array that can be simply iterated to come up with the correct
results.

I took his ideas and his pseudo code and rewrote the filter logic based on
them. In doing so, I was able to remove a lot of code, and have a much more
condensed filter logic in the process. I wrote a very long comment
describing the methadology that Al proposed in my own words. For more info
on how this works, read the comment above predicate_parse().

Suggested-by: Al Viro <[email protected]>
Signed-off-by: Steven Rostedt (VMware) <[email protected]>
  • Loading branch information
rostedt committed Mar 14, 2018
1 parent 478325f commit 8076559
Show file tree
Hide file tree
Showing 2 changed files with 1,054 additions and 1,272 deletions.
15 changes: 5 additions & 10 deletions kernel/trace/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -1216,12 +1216,11 @@ struct ftrace_event_field {
int is_signed;
};

struct prog_entry;

struct event_filter {
int n_preds; /* Number assigned */
int a_preds; /* allocated */
struct filter_pred __rcu *preds;
struct filter_pred __rcu *root;
char *filter_string;
struct prog_entry __rcu *prog;
char *filter_string;
};

struct event_subsystem {
Expand Down Expand Up @@ -1413,12 +1412,8 @@ struct filter_pred {
unsigned short *ops;
struct ftrace_event_field *field;
int offset;
int not;
int not;
int op;
unsigned short index;
unsigned short parent;
unsigned short left;
unsigned short right;
};

static inline bool is_string_field(struct ftrace_event_field *field)
Expand Down
Loading

0 comments on commit 8076559

Please sign in to comment.