Re: [PATCH 1/2] arm64: ftrace: enable single ftrace_ops for direct calls

Jiri Olsa <[email protected]> Sun, 2 Aug 2026 22:44:27 +0200
Newsgroups org.kernel.vger.linux-trace-kernel,org.infradead.lists.linux-arm-kernel,org.kernel.vger.bpf,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest
Message-ID <am-sK_buCVI3khJv@krava>
On Fri, Jul 31, 2026 at 10:30:37AM +0800, Leon Hwang wrote:
> On 30/7/26 18:58, Jiri Olsa wrote:
> > On Thu, Jul 30, 2026 at 11:05:42AM +0800, Leon Hwang wrote:
> >> On 29/7/26 19:56, Jiri Olsa wrote:
> >>> On Mon, Jul 27, 2026 at 10:28:43PM +0800, Leon Hwang wrote:
> >>>> The BPF tracing multi link updates several direct-call sites through one
> >>>> ftrace_ops. Its implementation is therefore gated by
> >>>> HAVE_SINGLE_FTRACE_DIRECT_OPS in addition to
> >>>> DYNAMIC_FTRACE_WITH_DIRECT_CALLS.
> >>>>
> >>>> Select HAVE_SINGLE_FTRACE_DIRECT_OPS whenever arm64 enables dynamic ftrace
> >>>> direct calls. This enables BPF tracing multi links on arm64. Also
> >>>> generalize the unreachable-trampoline comment because the single-ops path
> >>>> does not use ops->direct_call.
> >>>
> >>> hi,
> >>> iirc arm needs ops->direct_call for trampolines to work properly,
> >>> that's the reason we enabled single ftrace_ops on x86 only:
> >>>
> >>>   424f6a361096 bpf,x86: Use single ftrace_ops for direct calls
> >>>
> >>> I don't understand the arm usage of op->direct_call, but it looks like
> >>> (codex thinks) that the fast path won't always work without op->direct_call
> >>> being set
> >>
> >>
> >> In theory, op->direct_call is the fallback for the case:
> >> HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS=y, out-of-range target, and non-BPF
> >> direct ops. This is what Codex thinks about.
> >>
> >> However, after searching the call sites of
> >> register_ftrace_direct()/__modify_ftrace_direct() in kernel, which would
> >> set ops->direct_call, the actual callers are in bpf/trampoline.c, which
> >> have been gated with HAVE_SINGLE_FTRACE_DIRECT_OPS. That said, for
> >> normal usage of HAVE_SINGLE_FTRACE_DIRECT_OPS=y, op->direct_call is unused.
> >>
> >> If someone uses register_ftrace_direct() or
> >> modify_ftrace_direct/_nolock() outside BPF in the future,
> >> op->direct_call will be used.
> > 
> > so any 2nd user on the same function triggers the slow path,
> > and that's fine, the single_ops handles slow path correctly
> > 
> > but IIUC the out-of-range target will now always go through slow path,
> > which in current code it doesn't, right?
> > 
> 
> Right.
> 
> Pls see the sibling thread with Ihor. With in-range BPF trampoline
> allocation, the slow-path regression should mostly disappear.
> 
> Let's continue the discussion in that thread.

please paste the link/subject for that thread

thanks,
jirka