|
@@ -1978,12 +1978,27 @@ int __weak ftrace_arch_code_modify_post_process(void)
|
|
|
|
|
|
void ftrace_modify_all_code(int command)
|
|
|
{
|
|
|
+ int update = command & FTRACE_UPDATE_TRACE_FUNC;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If the ftrace_caller calls a ftrace_ops func directly,
|
|
|
+ * we need to make sure that it only traces functions it
|
|
|
+ * expects to trace. When doing the switch of functions,
|
|
|
+ * we need to update to the ftrace_ops_list_func first
|
|
|
+ * before the transition between old and new calls are set,
|
|
|
+ * as the ftrace_ops_list_func will check the ops hashes
|
|
|
+ * to make sure the ops are having the right functions
|
|
|
+ * traced.
|
|
|
+ */
|
|
|
+ if (update)
|
|
|
+ ftrace_update_ftrace_func(ftrace_ops_list_func);
|
|
|
+
|
|
|
if (command & FTRACE_UPDATE_CALLS)
|
|
|
ftrace_replace_code(1);
|
|
|
else if (command & FTRACE_DISABLE_CALLS)
|
|
|
ftrace_replace_code(0);
|
|
|
|
|
|
- if (command & FTRACE_UPDATE_TRACE_FUNC)
|
|
|
+ if (update && ftrace_trace_function != ftrace_ops_list_func)
|
|
|
ftrace_update_ftrace_func(ftrace_trace_function);
|
|
|
|
|
|
if (command & FTRACE_START_FUNC_RET)
|