On Wed, 3 Apr 2024 09:40:48 +0900
Masami Hiramatsu (Google) <mhira...@kernel.org> wrote:

> OK, for me, this last sentence is preferred for the help message. That 
> explains
> what this is for. 
> 
>         All callbacks that attach to the function tracing have some sort
>         of protection against recursion. This option is only to verify that
>        ftrace (and other users of ftrace_test_recursion_trylock()) are not
>         called outside of RCU, as if they are, it can cause a race.
>         But it also has a noticeable overhead when enabled.
> 
> BTW, how much overhead does this introduce? and the race case a kernel crash?
> or just messed up the ftrace buffer?

There's a hypothetical race where it can cause a use after free.

That is, after you shutdown ftrace, you need to call synchronize_rcu_tasks(),
which requires RCU to be watching. There's a theoretical case where that
task calls the trampoline and misses the synchronization. Note, these
locations are with preemption disabled, as rcu is always watching when
preemption is enabled. Thus it would be extremely fast where as the
synchronize_rcu_tasks() is rather slow.

We also have synchronize_rcu_tasks_rude() which would actually keep the
trace from happening, as it would schedule on each CPU forcing all CPUs to
have RCU watching.

I have never heard of this race being hit. I guess it could happen on a VM
where a vCPU gets preempted at the right moment for a long time and the
other CPUs synchronize.

But like lockdep, where deadlocks can crash the kernel, we don't enable it
for production.

The overhead is another function call within the function tracer. I had
numbers before, but I guess I could run tests again and get new numbers.

Thanks,

-- Steve

Reply via email to