|
@@ -2213,6 +2213,7 @@ void trace_event_eval_update(struct trace_eval_map **map, int len)
|
|
{
|
|
{
|
|
struct trace_event_call *call, *p;
|
|
struct trace_event_call *call, *p;
|
|
const char *last_system = NULL;
|
|
const char *last_system = NULL;
|
|
|
|
+ bool first = false;
|
|
int last_i;
|
|
int last_i;
|
|
int 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) {
|
|
list_for_each_entry_safe(call, p, &ftrace_events, list) {
|
|
/* events are usually grouped together with systems */
|
|
/* events are usually grouped together with systems */
|
|
if (!last_system || call->class->system != last_system) {
|
|
if (!last_system || call->class->system != last_system) {
|
|
|
|
+ first = true;
|
|
last_i = 0;
|
|
last_i = 0;
|
|
last_system = call->class->system;
|
|
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++) {
|
|
for (i = last_i; i < len; i++) {
|
|
if (call->class->system == map[i]->system) {
|
|
if (call->class->system == map[i]->system) {
|
|
/* Save the first system if need be */
|
|
/* Save the first system if need be */
|
|
- if (!last_i)
|
|
|
|
|
|
+ if (first) {
|
|
last_i = i;
|
|
last_i = i;
|
|
|
|
+ first = false;
|
|
|
|
+ }
|
|
update_event_printk(call, map[i]);
|
|
update_event_printk(call, map[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|