From: Masami Hiramatsu <mhiramat@kernel.org>
To: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>,
Ingo Molnar <mingo@kernel.org>, X86 ML <x86@kernel.org>,
Daniel Xu <dxu@dxuuu.xyz>,
linux-kernel@vger.kernel.org, bpf@vger.kernel.org,
kuba@kernel.org, mingo@redhat.com, ast@kernel.org,
tglx@linutronix.de, kernel-team@fb.com, yhs@fb.com,
Steven Rostedt <rostedt@goodmis.org>
Subject: Re: [RFC PATCH -tip 3/3] x86/kprobes,orc: Unwind optprobe trampoline correctly
Date: Thu, 1 Apr 2021 11:19:50 +0900 [thread overview]
Message-ID: <20210401111950.79b61063e8c87d6a39ec371e@kernel.org> (raw)
In-Reply-To: <20210401104452.e442afd995d32afecf991301@kernel.org>
On Thu, 1 Apr 2021 10:44:52 +0900
Masami Hiramatsu <mhiramat@kernel.org> wrote:
> On Wed, 31 Mar 2021 10:57:36 -0500
> Josh Poimboeuf <jpoimboe@redhat.com> wrote:
>
> > On Wed, Mar 31, 2021 at 02:44:56PM +0900, Masami Hiramatsu wrote:
> > > +#ifdef CONFIG_UNWINDER_ORC
> > > +unsigned long recover_optprobe_trampoline(unsigned long addr, unsigned long *sp)
> > > +{
> > > + unsigned long offset, entry, probe_addr;
> > > + struct optimized_kprobe *op;
> > > + struct orc_entry *orc;
> > > +
> > > + entry = find_kprobe_optinsn_slot_entry(addr);
> > > + if (!entry)
> > > + return addr;
> > > +
> > > + offset = addr - entry;
> > > +
> > > + /* Decode arg1 and get the optprobe */
> > > + op = (void *)extract_set_arg1((void *)(entry + TMPL_MOVE_IDX));
> > > + if (!op)
> > > + return addr;
> > > +
> > > + probe_addr = (unsigned long)op->kp.addr;
> > > +
> > > + if (offset < TMPL_END_IDX) {
> > > + orc = orc_find((unsigned long)optprobe_template_func + offset);
> > > + if (!orc || orc->sp_reg != ORC_REG_SP)
> > > + return addr;
> > > + /*
> > > + * Since optprobe trampoline doesn't push caller on the stack,
> > > + * need to decrement 1 stack entry size
> > > + */
> > > + *sp += orc->sp_offset - sizeof(long);
> > > + return probe_addr;
> > > + } else {
> > > + return probe_addr + offset - TMPL_END_IDX;
> > > + }
> > > +}
> > > +#endif
> >
> > Hm, I'd like to avoid intertwining kprobes and ORC like this.
> >
> > ORC unwinds other generated code by assuming the generated code uses a
> > frame pointer. Could we do that here?
>
> No, because the optprobe is not a function call. I considered to make
> it call, but since it has to execute copied instructions directly on
> the trampoline code (without changing stack frame) it is not possible.
>
> > With CONFIG_FRAME_POINTER, unwinding works because SAVE_REGS_STRING has
> > ENCODE_FRAME_POINTER, but that's not going to work for ORC.
>
> Even in that case, the problem is that any interrupt can happen
> before doing ENCODE_FRAME_POINTER. I think this ENCODE_FRAME_POINTER
> in the SAVE_REGS_STRING is for probing right before the target
> function setup a frame pointer.
>
> > Instead of these patches, can we 'push %rbp; mov %rsp, %rbp' at the
> > beginning of the template and 'pop %rbp' at the end?
>
> No, since the trampoline code is not called, it is jumped into.
> This means there is no "return address" in the stack. If we setup
> the frame, there is no return address, thus it might stop there.
> (Moreover, optprobe can copy multiple instructins on trampoline
> buffer, since relative jump consumes 5bytes. where is the "return address"?)
>
> >
> > I guess SAVE_REGS_STRING would need to be smart enough to push the
> > original saved version of %rbp. Of course then that breaks the
> > kretprobe_trampoline() usage, so it may need to be a separate macro.
> >
> > [ Or make the same change to kretprobe_trampoline(). Then the other
> > patch set wouldn't be needed either ;-) ]
>
> Hmm, I don't think it is a good idea which making such change on the
> optimized (hot) path only for the stack tracing. Moreover, that maybe
> not transparent with the stack made by int3.
>
> > Of course the downside is, when you get an interrupt during the frame
> > pointer setup, unwinding is broken. But I think that's acceptable for
> > generated code. We've lived with that limitation for all code, with
> > CONFIG_FRAME_POINTER, for many years.
>
> But above code can fix such issue too. To fix a corner case, non-generic
> code may be required, even it is not so simple.
Hmm, I would like to confirm your policy on ORC unwinder. If it doesn't
care the stacktrace from the interrupt handler, I think your suggestion
is OK. But in that case, from a developer viewpoint, I need to recommend
users to configure CONFIG_UNWIND_FRAME=y when CONFIG_KPROBES=y.
> > Eventually we may want to have a way to register generated code (and the
> > ORC for it).
I see, but the generated code usually does not have a generic way to
handle it. E.g. bpf has a solid entry point, but kretprobe trampoline's
entry point is any "RET", optprobe trampoline's entry point is a jump
which is also generated (patched) ...
Thank you,
--
Masami Hiramatsu <mhiramat@kernel.org>
next prev parent reply other threads:[~2021-04-01 2:21 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-31 5:44 [RFC PATCH -tip 0/3] x86/kprobes,orc: Fix ORC unwinder to unwind stack with optimized probe Masami Hiramatsu
2021-03-31 5:44 ` [RFC PATCH -tip 1/3] x86/kprobes: Add ORC information to optprobe template Masami Hiramatsu
2021-03-31 5:44 ` [RFC PATCH -tip 2/3] kprobes: Add functions to find instruction buffer entry address Masami Hiramatsu
2021-03-31 5:44 ` [RFC PATCH -tip 3/3] x86/kprobes,orc: Unwind optprobe trampoline correctly Masami Hiramatsu
2021-03-31 15:57 ` Josh Poimboeuf
2021-04-01 1:44 ` Masami Hiramatsu
2021-04-01 2:19 ` Masami Hiramatsu [this message]
2021-04-01 1:54 ` Masami Hiramatsu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210401111950.79b61063e8c87d6a39ec371e@kernel.org \
--to=mhiramat@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=dxu@dxuuu.xyz \
--cc=jpoimboe@redhat.com \
--cc=kernel-team@fb.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=mingo@redhat.com \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.