From: Steven Rostedt (VMware) Date: Mon, 17 Apr 2017 14:22:29 +0000 (-0400) Subject: ftrace: Fix indexing of t_hash_start() from t_next() X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=fcdc71257923263d042236eaf62bae5e033757b5;p=GitHub%2Fmoto-9609%2Fandroid_kernel_motorola_exynos9610.git ftrace: Fix indexing of t_hash_start() from t_next() t_hash_start() does not increment *pos, where as t_next() must. But when t_next() does increment *pos, it must still pass in the original *pos to t_hash_start() otherwise it will skip the first instance: # cd /sys/kernel/debug/tracing # echo schedule:traceoff > set_ftrace_filter # echo do_IRQ:traceoff > set_ftrace_filter # echo call_rcu > set_ftrace_filter # cat set_ftrace_filter call_rcu schedule:traceoff:unlimited do_IRQ:traceoff:unlimited The above called t_hash_start() from t_start() as there was only one function (call_rcu), but if we add another function: # echo xfrm_policy_destroy_rcu >> set_ftrace_filter # cat set_ftrace_filter call_rcu xfrm_policy_destroy_rcu do_IRQ:traceoff:unlimited The "schedule:traceoff" disappears. Signed-off-by: Steven Rostedt (VMware) --- diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 4b6459a57fbc..b21a3e61ac74 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -3205,6 +3205,7 @@ static void * t_next(struct seq_file *m, void *v, loff_t *pos) { struct ftrace_iterator *iter = m->private; + loff_t l = *pos; /* t_hash_start() must use original pos */ void *ret; if (unlikely(ftrace_disabled)) @@ -3216,13 +3217,13 @@ t_next(struct seq_file *m, void *v, loff_t *pos) if (iter->flags & FTRACE_ITER_PRINTALL) { /* next must increment pos, and t_hash_start does not */ (*pos)++; - return t_hash_start(m, pos); + return t_hash_start(m, &l); } ret = t_func_next(m, pos); if (!ret) - return t_hash_start(m, pos); + return t_hash_start(m, &l); return ret; }