[PATCH] kprobes: Mark ftrace mcount handler functions nokprobe

liaochang (A) liaochang1 at huawei.com
Tue Sep 27 04:10:16 PDT 2022



在 2022/9/27 2:37, Steven Rostedt 写道:
> On Mon, 19 Sep 2022 16:45:33 +0800
> Liao Chang <liaochang1 at huawei.com> wrote:
> 
>> Mark ftrace mcount handler functions nokprobe since probing on these
>> functions probably reaches mcount recursivly during kprobe breakpoint
>> handler for some architecture(tested for riscv, arm64), and reenter
>> kprobe is treated as a fatal error, causes kernel panic.
> 
> This looks to me that the affected archs should be made more robust for this
> case than to add this to the generic code.

OK, i will fix this problem in arch related code, thanks for feedback.

> 
> -- Steve
> 
> 
>>
>> Pesudo code below demonstrate this problem:
>>
>>   mcount
>>     function_trace_call (probed)
>>       arch_breakpoint_handler
>>         arch_setup_singlestep [mcount]
>>           function_trace_call (probed)
>>             arch_breakpoint_handler
>>               reenter_kprobe
>>                 BUG
>>
>> Signed-off-by: Liao Chang <liaochang1 at huawei.com>
>> ---
>>  kernel/trace/trace_functions.c | 5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c
>> index 9f1bfbe105e8..440a678a8c7c 100644
>> --- a/kernel/trace/trace_functions.c
>> +++ b/kernel/trace/trace_functions.c
>> @@ -16,6 +16,7 @@
>>  #include <linux/ftrace.h>
>>  #include <linux/slab.h>
>>  #include <linux/fs.h>
>> +#include <linux/kprobes.h>
>>  
>>  #include "trace.h"
>>  
>> @@ -194,6 +195,7 @@ function_trace_call(unsigned long ip, unsigned long parent_ip,
>>  
>>  	ftrace_test_recursion_unlock(bit);
>>  }
>> +NOKPROBE_SYMBOL(function_trace_call);
>>  
>>  #ifdef CONFIG_UNWINDER_ORC
>>  /*
>> @@ -245,6 +247,7 @@ function_stack_trace_call(unsigned long ip, unsigned long parent_ip,
>>  	atomic_dec(&data->disabled);
>>  	local_irq_restore(flags);
>>  }
>> +NOKPROBE_SYMBOL(function_stack_trace_call);
>>  
>>  static inline bool is_repeat_check(struct trace_array *tr,
>>  				   struct trace_func_repeats *last_info,
>> @@ -321,6 +324,7 @@ function_no_repeats_trace_call(unsigned long ip, unsigned long parent_ip,
>>  out:
>>  	ftrace_test_recursion_unlock(bit);
>>  }
>> +NOKPROBE_SYMBOL(function_no_repeats_trace_call);
>>  
>>  static void
>>  function_stack_no_repeats_trace_call(unsigned long ip, unsigned long parent_ip,
>> @@ -363,6 +367,7 @@ function_stack_no_repeats_trace_call(unsigned long ip, unsigned long parent_ip,
>>  	atomic_dec(&data->disabled);
>>  	local_irq_restore(flags);
>>  }
>> +NOKPROBE_SYMBOL(function_stack_no_repeats_trace_call);
>>  
>>  static struct tracer_opt func_opts[] = {
>>  #ifdef CONFIG_STACKTRACE
> 
> 
> .

-- 
BR,
Liao, Chang



More information about the linux-riscv mailing list