We should clear module from hash of all ops on ftrace_ops_list when module going, or the ops including these modules will be matched wrongly by new module loaded later.
Signed-off-by: Chengming Zhou <zhouchengm...@bytedance.com> Signed-off-by: Muchun Song <songmuc...@bytedance.com> --- kernel/trace/ftrace.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 1903b80db6eb..fca01a168ae5 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -6223,18 +6223,20 @@ clear_mod_from_hash(struct ftrace_page *pg, struct ftrace_hash *hash) /* Clear any records from hashs */ static void clear_mod_from_hashes(struct ftrace_page *pg) { - struct trace_array *tr; + struct ftrace_ops *op; - mutex_lock(&trace_types_lock); - list_for_each_entry(tr, &ftrace_trace_arrays, list) { - if (!tr->ops || !tr->ops->func_hash) + mutex_lock(&ftrace_lock); + + do_for_each_ftrace_op(op, ftrace_ops_list) { + if (!op->func_hash) continue; - mutex_lock(&tr->ops->func_hash->regex_lock); - clear_mod_from_hash(pg, tr->ops->func_hash->filter_hash); - clear_mod_from_hash(pg, tr->ops->func_hash->notrace_hash); - mutex_unlock(&tr->ops->func_hash->regex_lock); - } - mutex_unlock(&trace_types_lock); + mutex_lock(&op->func_hash->regex_lock); + clear_mod_from_hash(pg, op->func_hash->filter_hash); + clear_mod_from_hash(pg, op->func_hash->notrace_hash); + mutex_unlock(&op->func_hash->regex_lock); + } while_for_each_ftrace_op(op); + + mutex_unlock(&ftrace_lock); } static void ftrace_free_mod_map(struct rcu_head *rcu) -- 2.20.1