mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	tracing: Rewrite filter logic to be simpler and faster
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 <viro@ZenIV.linux.org.uk> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
		
							parent
							
								
									478325f188
								
							
						
					
					
						commit
						80765597bc
					
				
					 2 changed files with 1005 additions and 1223 deletions
				
			
		| 
						 | 
					@ -1216,12 +1216,11 @@ struct ftrace_event_field {
 | 
				
			||||||
	int			is_signed;
 | 
						int			is_signed;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct prog_entry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct event_filter {
 | 
					struct event_filter {
 | 
				
			||||||
	int			n_preds;	/* Number assigned */
 | 
						struct prog_entry __rcu	*prog;
 | 
				
			||||||
	int			a_preds;	/* allocated */
 | 
						char			*filter_string;
 | 
				
			||||||
	struct filter_pred __rcu	*preds;
 | 
					 | 
				
			||||||
	struct filter_pred __rcu	*root;
 | 
					 | 
				
			||||||
	char				*filter_string;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct event_subsystem {
 | 
					struct event_subsystem {
 | 
				
			||||||
| 
						 | 
					@ -1413,12 +1412,8 @@ struct filter_pred {
 | 
				
			||||||
	unsigned short		*ops;
 | 
						unsigned short		*ops;
 | 
				
			||||||
	struct ftrace_event_field *field;
 | 
						struct ftrace_event_field *field;
 | 
				
			||||||
	int 			offset;
 | 
						int 			offset;
 | 
				
			||||||
	int 			not;
 | 
						int			not;
 | 
				
			||||||
	int 			op;
 | 
						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)
 | 
					static inline bool is_string_field(struct ftrace_event_field *field)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
		Reference in a new issue