* Re: [RFC PATCH -next v2 3/4] arm64/ftrace: support dynamically allocated trampolines
[not found] ` <Yo4eWqHA/IjNElNN@FVFF77S0Q05N>
@ 2022-05-30 1:03 ` Masami Hiramatsu
2022-05-30 12:38 ` Jiri Olsa
0 siblings, 1 reply; 3+ messages in thread
From: Masami Hiramatsu @ 2022-05-30 1:03 UTC (permalink / raw)
To: Mark Rutland
Cc: Steven Rostedt, Wang ShaoBo, cj.chengjian, huawei.libin, xiexiuqi,
liwei391, linux-kernel, linux-arm-kernel, catalin.marinas, will,
zengshun.wu, Jiri Olsa, bpf
(Cc: BPF ML)
On Wed, 25 May 2022 13:17:30 +0100
Mark Rutland <mark.rutland@arm.com> wrote:
> On Thu, May 12, 2022 at 09:02:31PM +0900, Masami Hiramatsu wrote:
> > On Wed, 11 May 2022 11:12:07 -0400
> > Steven Rostedt <rostedt@goodmis.org> wrote:
> >
> > > On Wed, 11 May 2022 23:34:50 +0900
> > > Masami Hiramatsu <mhiramat@kernel.org> wrote:
> > >
> > > > OK, so fregs::regs will have a subset of pt_regs, and accessibility of
> > > > the registers depends on the architecture. If we can have a checker like
> > > >
> > > > ftrace_regs_exist(fregs, reg_offset)
> > >
> > > Or something. I'd have to see the use case.
> > >
> > > >
> > > > kprobe on ftrace or fprobe user (BPF) can filter user's requests.
> > > > I think I can introduce a flag for kprobes so that user can make a
> > > > kprobe handler only using a subset of registers.
> > > > Maybe similar filter code is also needed for BPF 'user space' library
> > > > because this check must be done when compiling BPF.
> > >
> > > Is there any other case without full regs that the user would want anything
> > > other than the args, stack pointer and instruction pointer?
> >
> > For the kprobes APIs/events, yes, it needs to access to the registers
> > which is used for local variables when probing inside the function body.
> > However at the function entry, I think almost no use case. (BTW, pstate
> > is a bit special, that may show the actual processor-level status
> > (context), so for the debugging, user might want to read it.)
>
> As before, if we really need PSTATE we *must* take an exception to get a
> reliable snapshot (or to alter the value). So I'd really like to split this
> into two cases:
>
> * Where users *really* need PSTATE (or arbitrary GPRs), they use kprobes. That
> always takes an exception and they can have a complete, real struct pt_regs.
>
> * Where users just need to capture a function call boundary, they use ftrace.
> That uses a trampoline without taking an exception, and they get the minimal
> set of registers relevant to the function call boundary (which does not
> include PSTATE or most GPRs).
I totally agree with this idea. The x86 is a special case, since the
-fentry option puts a call on the first instruction of the function entry,
I had to reuse the ftrace instead of swbp for kprobes.
But on arm64 (and other RISCs), we can use them properly.
My concern is that the eBPF depends on kprobe (pt_regs) interface, thus
I need to ask them that it is OK to not accessable to some part of
pt_regs (especially, PSTATE) if they puts probes on function entry
with ftrace (fprobe in this case.)
(Jiri and BPF developers)
Currently fprobe is only enabled on x86 for "multiple kprobes" BPF
interface, but in the future, it will be enabled on arm64. And at
that point, it will be only accessible to the regs for function
arguments. Is that OK for your use case? And will the BPF compiler
be able to restrict the user program to access only those registers
when using the "multiple kprobes"?
> > Thus the BPF use case via fprobes, I think there is no usecase.
> > My concern is that the BPF may allow user program to access any
> > field of pt_regs. Thus if the user miss-programmed, they may see
> > a wrong value (I guess the fregs is not zero-filled) for unsaved
> > registers.
> >
> > > That is, have a flag that says "only_args" or something, that says they
> > > will only get the registers for arguments, a stack pointer, and the
> > > instruction pointer (note, the fregs may not have the instruction pointer
> > > as that is passed to the the caller via the "ip" parameter. If the fregs
> > > needs that, we can add a "ftrace_regs_set_ip()" before calling the
> > > callback registered to the fprobe).
> >
> > Yes, that is what I'm thinking. If "only_args" flag is set, BPF runtime
> > must check the user program. And if it finds the program access the
> > unsaved registers, it should stop executing.
> >
> > BTW, "what register is saved" can be determined statically, thus I think
> > we just need the offset for checking (for fprobe usecase, since it will
> > set the ftrace_ops flag by itself.)
>
> For arm64 I'd like to make this static, and have ftrace *always* capture a
> minimal set of ftrace_regs, which would be:
>
> X0 to X8 inclusive
> SP
> PC
> LR
> FP
>
> Since X0 to X8 + SP is all that we need for arguments and return values (per
> the calling convention we use), and PC+LR+FP gives us everything we need for
> unwinding and live patching.
It would be good for me. So is it enabled with CONFIG_DYNAMIC_FTRACE_WITH_ARGS,
instead of CONFIG_DYNAMIC_FTRACE_WITH_REGS?
Thank you,
>
> I *might* want to add x18 to that when SCS is enabled, but I'm not immediately
> sure.
>
> Thanks,
> Mark.
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFC PATCH -next v2 3/4] arm64/ftrace: support dynamically allocated trampolines
2022-05-30 1:03 ` [RFC PATCH -next v2 3/4] arm64/ftrace: support dynamically allocated trampolines Masami Hiramatsu
@ 2022-05-30 12:38 ` Jiri Olsa
2022-05-31 1:00 ` Masami Hiramatsu
0 siblings, 1 reply; 3+ messages in thread
From: Jiri Olsa @ 2022-05-30 12:38 UTC (permalink / raw)
To: Masami Hiramatsu
Cc: Mark Rutland, Steven Rostedt, Wang ShaoBo, cj.chengjian,
huawei.libin, xiexiuqi, liwei391, linux-kernel, linux-arm-kernel,
catalin.marinas, will, zengshun.wu, bpf
On Mon, May 30, 2022 at 10:03:10AM +0900, Masami Hiramatsu wrote:
> (Cc: BPF ML)
>
> On Wed, 25 May 2022 13:17:30 +0100
> Mark Rutland <mark.rutland@arm.com> wrote:
>
> > On Thu, May 12, 2022 at 09:02:31PM +0900, Masami Hiramatsu wrote:
> > > On Wed, 11 May 2022 11:12:07 -0400
> > > Steven Rostedt <rostedt@goodmis.org> wrote:
> > >
> > > > On Wed, 11 May 2022 23:34:50 +0900
> > > > Masami Hiramatsu <mhiramat@kernel.org> wrote:
> > > >
> > > > > OK, so fregs::regs will have a subset of pt_regs, and accessibility of
> > > > > the registers depends on the architecture. If we can have a checker like
> > > > >
> > > > > ftrace_regs_exist(fregs, reg_offset)
> > > >
> > > > Or something. I'd have to see the use case.
> > > >
> > > > >
> > > > > kprobe on ftrace or fprobe user (BPF) can filter user's requests.
> > > > > I think I can introduce a flag for kprobes so that user can make a
> > > > > kprobe handler only using a subset of registers.
> > > > > Maybe similar filter code is also needed for BPF 'user space' library
> > > > > because this check must be done when compiling BPF.
> > > >
> > > > Is there any other case without full regs that the user would want anything
> > > > other than the args, stack pointer and instruction pointer?
> > >
> > > For the kprobes APIs/events, yes, it needs to access to the registers
> > > which is used for local variables when probing inside the function body.
> > > However at the function entry, I think almost no use case. (BTW, pstate
> > > is a bit special, that may show the actual processor-level status
> > > (context), so for the debugging, user might want to read it.)
> >
> > As before, if we really need PSTATE we *must* take an exception to get a
> > reliable snapshot (or to alter the value). So I'd really like to split this
> > into two cases:
> >
> > * Where users *really* need PSTATE (or arbitrary GPRs), they use kprobes. That
> > always takes an exception and they can have a complete, real struct pt_regs.
> >
> > * Where users just need to capture a function call boundary, they use ftrace.
> > That uses a trampoline without taking an exception, and they get the minimal
> > set of registers relevant to the function call boundary (which does not
> > include PSTATE or most GPRs).
>
> I totally agree with this idea. The x86 is a special case, since the
> -fentry option puts a call on the first instruction of the function entry,
> I had to reuse the ftrace instead of swbp for kprobes.
> But on arm64 (and other RISCs), we can use them properly.
>
> My concern is that the eBPF depends on kprobe (pt_regs) interface, thus
> I need to ask them that it is OK to not accessable to some part of
> pt_regs (especially, PSTATE) if they puts probes on function entry
> with ftrace (fprobe in this case.)
>
> (Jiri and BPF developers)
> Currently fprobe is only enabled on x86 for "multiple kprobes" BPF
> interface, but in the future, it will be enabled on arm64. And at
> that point, it will be only accessible to the regs for function
> arguments. Is that OK for your use case? And will the BPF compiler
I guess from practical POV registers for arguments and ip should be enough,
but whole pt_regs was already exposed to programs, so people can already use
any of them.. not sure it's good idea to restrict it
> be able to restrict the user program to access only those registers
> when using the "multiple kprobes"?
pt-regs pointer is provided to kprobe programs, I guess we could provide copy
of that with just available values
jirka
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFC PATCH -next v2 3/4] arm64/ftrace: support dynamically allocated trampolines
2022-05-30 12:38 ` Jiri Olsa
@ 2022-05-31 1:00 ` Masami Hiramatsu
0 siblings, 0 replies; 3+ messages in thread
From: Masami Hiramatsu @ 2022-05-31 1:00 UTC (permalink / raw)
To: Jiri Olsa
Cc: Mark Rutland, Steven Rostedt, Wang ShaoBo, cj.chengjian,
huawei.libin, xiexiuqi, liwei391, linux-kernel, linux-arm-kernel,
catalin.marinas, will, zengshun.wu, bpf
On Mon, 30 May 2022 14:38:31 +0200
Jiri Olsa <olsajiri@gmail.com> wrote:
> On Mon, May 30, 2022 at 10:03:10AM +0900, Masami Hiramatsu wrote:
> > (Cc: BPF ML)
> >
> > On Wed, 25 May 2022 13:17:30 +0100
> > Mark Rutland <mark.rutland@arm.com> wrote:
> >
> > > On Thu, May 12, 2022 at 09:02:31PM +0900, Masami Hiramatsu wrote:
> > > > On Wed, 11 May 2022 11:12:07 -0400
> > > > Steven Rostedt <rostedt@goodmis.org> wrote:
> > > >
> > > > > On Wed, 11 May 2022 23:34:50 +0900
> > > > > Masami Hiramatsu <mhiramat@kernel.org> wrote:
> > > > >
> > > > > > OK, so fregs::regs will have a subset of pt_regs, and accessibility of
> > > > > > the registers depends on the architecture. If we can have a checker like
> > > > > >
> > > > > > ftrace_regs_exist(fregs, reg_offset)
> > > > >
> > > > > Or something. I'd have to see the use case.
> > > > >
> > > > > >
> > > > > > kprobe on ftrace or fprobe user (BPF) can filter user's requests.
> > > > > > I think I can introduce a flag for kprobes so that user can make a
> > > > > > kprobe handler only using a subset of registers.
> > > > > > Maybe similar filter code is also needed for BPF 'user space' library
> > > > > > because this check must be done when compiling BPF.
> > > > >
> > > > > Is there any other case without full regs that the user would want anything
> > > > > other than the args, stack pointer and instruction pointer?
> > > >
> > > > For the kprobes APIs/events, yes, it needs to access to the registers
> > > > which is used for local variables when probing inside the function body.
> > > > However at the function entry, I think almost no use case. (BTW, pstate
> > > > is a bit special, that may show the actual processor-level status
> > > > (context), so for the debugging, user might want to read it.)
> > >
> > > As before, if we really need PSTATE we *must* take an exception to get a
> > > reliable snapshot (or to alter the value). So I'd really like to split this
> > > into two cases:
> > >
> > > * Where users *really* need PSTATE (or arbitrary GPRs), they use kprobes. That
> > > always takes an exception and they can have a complete, real struct pt_regs.
> > >
> > > * Where users just need to capture a function call boundary, they use ftrace.
> > > That uses a trampoline without taking an exception, and they get the minimal
> > > set of registers relevant to the function call boundary (which does not
> > > include PSTATE or most GPRs).
> >
> > I totally agree with this idea. The x86 is a special case, since the
> > -fentry option puts a call on the first instruction of the function entry,
> > I had to reuse the ftrace instead of swbp for kprobes.
> > But on arm64 (and other RISCs), we can use them properly.
> >
> > My concern is that the eBPF depends on kprobe (pt_regs) interface, thus
> > I need to ask them that it is OK to not accessable to some part of
> > pt_regs (especially, PSTATE) if they puts probes on function entry
> > with ftrace (fprobe in this case.)
> >
> > (Jiri and BPF developers)
> > Currently fprobe is only enabled on x86 for "multiple kprobes" BPF
> > interface, but in the future, it will be enabled on arm64. And at
> > that point, it will be only accessible to the regs for function
> > arguments. Is that OK for your use case? And will the BPF compiler
>
> I guess from practical POV registers for arguments and ip should be enough,
> but whole pt_regs was already exposed to programs, so people can already use
> any of them.. not sure it's good idea to restrict it
>
> > be able to restrict the user program to access only those registers
> > when using the "multiple kprobes"?
>
> pt-regs pointer is provided to kprobe programs, I guess we could provide copy
> of that with just available values
Yes, ftrace_regs already provides partial filled pt_regs (which registers
are valid is arch-dependent). Thus, my idea is changing fprobe's handler
interface to expose ftrace_regs instead of pt_regs, and the BPF handler
will extract the internal pt_regs.
If the BPF compiler can list which registers will be accessed form the
user program, the kernel side can filter it.
I think similar feature can be done in the kprobe-event (new fprobe event?).
Thank you,
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-05-31 1:00 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <YmLlmaXF00hPkOID@lakrids>
[not found] ` <20220426174749.b5372c5769af7bf901649a05@kernel.org>
[not found] ` <YnJUTuOIX9YoJq23@FVFF77S0Q05N>
[not found] ` <20220505121538.04773ac98e2a8ba17f675d39@kernel.org>
[not found] ` <20220509142203.6c4f2913@gandalf.local.home>
[not found] ` <20220510181012.d5cba23a2547f14d14f016b9@kernel.org>
[not found] ` <20220510104446.6d23b596@gandalf.local.home>
[not found] ` <20220511233450.40136cdf6a53eb32cd825be8@kernel.org>
[not found] ` <20220511111207.25d1a693@gandalf.local.home>
[not found] ` <20220512210231.f9178a98f20a37981b1e89e3@kernel.org>
[not found] ` <Yo4eWqHA/IjNElNN@FVFF77S0Q05N>
2022-05-30 1:03 ` [RFC PATCH -next v2 3/4] arm64/ftrace: support dynamically allocated trampolines Masami Hiramatsu
2022-05-30 12:38 ` Jiri Olsa
2022-05-31 1:00 ` Masami Hiramatsu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox