Re: [RFC PATCH v2 1/6] fprobe: Use fprobe_regs in fprobe entry handler
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Date: 2023-08-09 14:10:24
Also in:
bpf, lkml
Hi Florent, On Wed, 9 Aug 2023 12:28:38 +0200 Florent Revest [off-list ref] wrote:
On Mon, Aug 7, 2023 at 8:48 AM Masami Hiramatsu (Google) [off-list ref] wrote:quoted
From: Masami Hiramatsu (Google) <mhiramat@kernel.org> This allows fprobes to be available with CONFIG_DYNAMIC_FTRACE_WITH_ARGS instead of CONFIG_DYNAMIC_FTRACE_WITH_REGS, then we can enable fprobe on arm64.This patch lets fprobe code build on configs WITH_ARGS and !WITH_REGS but fprobe wouldn't run on these builds because fprobe still registers to ftrace with FTRACE_OPS_FL_SAVE_REGS, which would fail on !WITH_REGS. Shouldn't we also let the fprobe_init callers decide whether they want REGS or not ?
Ah, I think you meant FPROBE_EVENTS? Yes I forgot to add the dependency on it. But fprobe itself can work because fprobe just pass the ftrace_regs to the handlers. (Note that exit callback may not work until next patch)
quoted
static int kprobe_multi_link_handler(struct fprobe *fp, unsigned long fentry_ip, - unsigned long ret_ip, struct pt_regs *regs, + unsigned long ret_ip, struct ftrace_regs *fregs, void *data) { struct bpf_kprobe_multi_link *link; + struct pt_regs *regs = ftrace_get_regs(fregs); + + if (!regs) + return 0;(with the above comment addressed) this means that BPF multi_kprobe would successfully attach on builds WITH_ARGS but the programs would never actually run because here regs would be 0. This is a confusing failure mode for the user. I think that if multi_kprobe won't work (because we don't have a pt_regs conversion path yet), the user should be notified at attachment time that they won't be getting any events.
Yes, so I changed it will not be compiled in that case.
@@ -2460,7 +2460,7 @@ static int __init bpf_event_init(void) fs_initcall(bpf_event_init); #endif /* CONFIG_MODULES */ -#ifdef CONFIG_FPROBE +#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS struct bpf_kprobe_multi_link { struct bpf_link link; struct fprobe fp;
That's why I think kprobe_multi should inform fprobe_init that it wants FTRACE_OPS_FL_SAVE_REGS and fail if that's not possible (no trampoline for it for example)
Yeah, that's another possibility, but in the previous thread we discussed and agreed to introduce the ftrace_partial_regs() which will copy the partial registers from ftrace_regs to pt_regs. Thank you, -- Masami Hiramatsu (Google) [off-list ref]