Re: [PATCH v2 3/9] LoongArch/ftrace: Add dynamic function tracer support

From: Qing Zhang
Date: Fri Sep 02 2022 - 20:39:18 EST




On 2022/9/1 上午10:59, Jeff Xie wrote:
On Fri, Aug 26, 2022 at 4:24 PM Qing Zhang <zhangqing@xxxxxxxxxxx> wrote:

The compiler has inserted 2 NOPs before the regular function prologue.
T series registers are available and safe because of LoongArch psABI.

At runtime, replace nop with bl to enable ftrace call and replace bl with
nop to disable ftrace call. The bl requires us to save the original RA value,
so here it saves RA at t0.
details are:

| Compiled | Disabled | Enabled |
+------------+------------------------+------------------------+
| nop | move t0, ra | move t0, ra |
| nop | nop | bl ftrace_caller |
| func_body | func_body | func_body |

The RA value will be recovered by ftrace_regs_entry, and restored into RA
before returning to the regular function prologue. When a function is not
being traced, the move t0, ra is not harmful.

1) ftrace_make_call, ftrace_make_nop (in kernel/ftrace.c)
The two functions turn each recorded call site of filtered functions
into a call to ftrace_caller or nops.

2) ftracce_update_ftrace_func (in kernel/ftrace.c)
turns the nops at ftrace_call into a call to a generic entry for
function tracers.

3) ftrace_caller (in kernel/mcount-dyn.S)
The entry where each _mcount call sites calls to once they are
filtered to be traced.

[...]


When use the option func_stack_trace for the function tracer, I found a issue:

Steps:
1. Enable the function tracer and the option func_stack_trace:

/sys/kernel/tracing # echo blk_update_request > ./set_ftrace_filter
/sys/kernel/tracing # echo 1 > ./options/func_stack_trace
/sys/kernel/tracing # echo function > ./current_tracer

2. Let the blk_update_request() be called.

# mount /dev/vda /tmp


3. cat ./trace
<idle>-0 [000] ..s1. 126.016445: blk_update_request
<-blk_mq_end_request
<idle>-0 [000] ..s1. 126.017937: <stack trace>
=> blk_mq_end_request

We can see only one stack trace.


I found the default unwinder(for loongson3_defconfig) is
CONFIG_UNWINDER_PROLOGUE, if switch it to CONFIG_UNWINDER_GUESS
it works well:

[...]

Maybe the issue happened on the CONFIG_UNWINDER_PROLOGUE, but I
haven't dug deep into it ;)

Hi, Jeff

Thanks a lot for your feedback!

I fixed it in v3, which was caused by the ftrace_regs_entry assembly not being considered by the prologue analyze method. :)

regards
-Qing