diff options
Diffstat (limited to 'kernel/trace/trace_events.c')
| -rw-r--r-- | kernel/trace/trace_events.c | 16 | 
1 files changed, 15 insertions, 1 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index ec0f9aa4e151..1b87157edbff 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -2213,6 +2213,7 @@ void trace_event_eval_update(struct trace_eval_map **map, int len)  {  	struct trace_event_call *call, *p;  	const char *last_system = NULL; +	bool first = false;  	int last_i;  	int i; @@ -2220,15 +2221,28 @@ void trace_event_eval_update(struct trace_eval_map **map, int len)  	list_for_each_entry_safe(call, p, &ftrace_events, list) {  		/* events are usually grouped together with systems */  		if (!last_system || call->class->system != last_system) { +			first = true;  			last_i = 0;  			last_system = call->class->system;  		} +		/* +		 * Since calls are grouped by systems, the likelyhood that the +		 * next call in the iteration belongs to the same system as the +		 * previous call is high. As an optimization, we skip seaching +		 * for a map[] that matches the call's system if the last call +		 * was from the same system. That's what last_i is for. If the +		 * call has the same system as the previous call, then last_i +		 * will be the index of the first map[] that has a matching +		 * system. +		 */  		for (i = last_i; i < len; i++) {  			if (call->class->system == map[i]->system) {  				/* Save the first system if need be */ -				if (!last_i) +				if (first) {  					last_i = i; +					first = false; +				}  				update_event_printk(call, map[i]);  			}  		}  | 
