|
@@ -381,12 +381,19 @@ static int function_stat_show(struct seq_file *m, void *v)
|
|
|
{
|
|
|
struct ftrace_profile *rec = v;
|
|
|
char str[KSYM_SYMBOL_LEN];
|
|
|
+ int ret = 0;
|
|
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
|
|
- static DEFINE_MUTEX(mutex);
|
|
|
static struct trace_seq s;
|
|
|
unsigned long long avg;
|
|
|
unsigned long long stddev;
|
|
|
#endif
|
|
|
+ mutex_lock(&ftrace_profile_lock);
|
|
|
+
|
|
|
+ /* we raced with function_profile_reset() */
|
|
|
+ if (unlikely(rec->counter == 0)) {
|
|
|
+ ret = -EBUSY;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
kallsyms_lookup(rec->ip, NULL, NULL, NULL, str);
|
|
|
seq_printf(m, " %-30.30s %10lu", str, rec->counter);
|
|
@@ -408,7 +415,6 @@ static int function_stat_show(struct seq_file *m, void *v)
|
|
|
do_div(stddev, (rec->counter - 1) * 1000);
|
|
|
}
|
|
|
|
|
|
- mutex_lock(&mutex);
|
|
|
trace_seq_init(&s);
|
|
|
trace_print_graph_duration(rec->time, &s);
|
|
|
trace_seq_puts(&s, " ");
|
|
@@ -416,11 +422,12 @@ static int function_stat_show(struct seq_file *m, void *v)
|
|
|
trace_seq_puts(&s, " ");
|
|
|
trace_print_graph_duration(stddev, &s);
|
|
|
trace_print_seq(m, &s);
|
|
|
- mutex_unlock(&mutex);
|
|
|
#endif
|
|
|
seq_putc(m, '\n');
|
|
|
+out:
|
|
|
+ mutex_unlock(&ftrace_profile_lock);
|
|
|
|
|
|
- return 0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static void ftrace_profile_reset(struct ftrace_profile_stat *stat)
|