From: Josh Poimboeuf <jpoimboe@redhat.com>
To: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>, Borislav Petkov <bp@alien8.de>,
"H. Peter Anvin" <hpa@zytor.com>,
Song Liu <songliubraving@fb.com>,
Thomas Gleixner <tglx@linutronix.de>,
Steven Rostedt <rostedt@goodmis.org>,
Kairui Song <kasong@redhat.com>,
Daniel Borkmann <daniel@iogearbox.net>,
Alexei Starovoitov <ast@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
LKML <linux-kernel@vger.kernel.org>,
linux-tip-commits@vger.kernel.org
Subject: Re: [tip:x86/urgent] bpf: Fix ORC unwinding in non-JIT BPF code
Date: Mon, 8 Jul 2019 17:38:34 -0500 [thread overview]
Message-ID: <20190708223834.zx7u45a4uuu2yyol@treble> (raw)
In-Reply-To: <CAADnVQJqT8o=_6P6xHjwxrXqX9ToSb0cTfoOcm2Xcha3KRNNSw@mail.gmail.com>
On Mon, Jul 08, 2019 at 03:15:37PM -0700, Alexei Starovoitov wrote:
> > 2)
> >
> > After doing the first optimization, GCC then does another one which is
> > a little trickier. It replaces:
> >
> > select_insn:
> > jmp *jumptable(, %rax, 8)
> > ...
> > ALU64_ADD_X:
> > ...
> > jmp *jumptable(, %rax, 8)
> > ALU_ADD_X:
> > ...
> > jmp *jumptable(, %rax, 8)
> >
> > with
> >
> > select_insn:
> > mov jumptable, %r12
> > jmp *(%r12, %rax, 8)
> > ...
> > ALU64_ADD_X:
> > ...
> > jmp *(%r12, %rax, 8)
> > ALU_ADD_X:
> > ...
> > jmp *(%r12, %rax, 8)
> >
> > The problem is that it only moves the jumptable address into %r12
> > once, for the entire function, then it goes through multiple recursive
> > indirect jumps which rely on that %r12 value. But objtool isn't yet
> > smart enough to be able to track the value across multiple recursive
> > indirect jumps through the jump table.
> >
> > After some digging I found that the quick and easy fix is to disable
> > -fgcse. In fact, this seems to be recommended by the GCC manual, for
> > code like this:
> >
> > -fgcse
> > Perform a global common subexpression elimination pass. This
> > pass also performs global constant and copy propagation.
> >
> > Note: When compiling a program using computed gotos, a GCC
> > extension, you may get better run-time performance if you
> > disable the global common subexpression elimination pass by
> > adding -fno-gcse to the command line.
> >
> > Enabled at levels -O2, -O3, -Os.
> >
> > This code indeed relies extensively on computed gotos. I don't know
> > *why* disabling this optimization would improve performance. In fact
> > I really don't see how it could make much of a difference either way.
> >
> > Anyway, using -fno-gcse makes optimization #2 go away and makes
> > objtool happy, with only a fix for #1 needed.
> >
> > If -fno-gcse isn't an option, we might be able to fix objtool by using
> > the "first_jump_src" thing which Peter added, improving it such that
> > it also takes table jumps into account.
>
> Sorry for delay. I'm mostly offgrid until next week.
> As far as -fno-gcse.. I don't mind as long as it doesn't hurt performance.
> Which I suspect it will :(
> All these indirect gotos are there for performance.
> Single indirect goto and a bunch of jmp select_insn
> are way slower, since there is only one instruction
> for cpu branch predictor to work with.
> When every insn is followed by "jmp *jumptable"
> there is more room for cpu to speculate.
> It's been long time, but when I wrote it the difference
> between all indirect goto vs single indirect goto was almost 2x.
Just to clarify, -fno-gcse doesn't get rid of any of the indirect jumps.
It still has 166 indirect jumps. It just gets rid of the second
optimization, where the jumptable address is placed in a register.
If you have a benchmark which is relatively easy to use, I could try to
run some tests.
--
Josh
next prev parent reply other threads:[~2019-07-08 22:38 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-28 1:50 [PATCH v4 0/2] x86: bpf unwinder fixes Josh Poimboeuf
2019-06-28 1:50 ` [PATCH v4 1/2] objtool: Add support for C jump tables Josh Poimboeuf
2019-06-29 5:58 ` [tip:x86/urgent] " tip-bot for Josh Poimboeuf
2019-07-09 12:01 ` [tip:x86/debug] " tip-bot for Josh Poimboeuf
2019-06-28 1:50 ` [PATCH v4 2/2] bpf: Fix ORC unwinding in non-JIT BPF code Josh Poimboeuf
2019-06-28 15:37 ` Alexei Starovoitov
2019-06-29 5:58 ` [tip:x86/urgent] " tip-bot for Josh Poimboeuf
2019-07-06 20:29 ` Ingo Molnar
2019-07-07 1:32 ` Josh Poimboeuf
2019-07-07 5:52 ` Josh Poimboeuf
2019-07-08 22:15 ` Alexei Starovoitov
2019-07-08 22:38 ` Josh Poimboeuf [this message]
2019-07-08 22:49 ` Alexei Starovoitov
2019-07-08 22:53 ` Josh Poimboeuf
2019-07-08 23:02 ` Josh Poimboeuf
2019-07-08 23:16 ` Alexei Starovoitov
2019-07-09 17:47 ` Josh Poimboeuf
2019-07-09 18:02 ` Alexei Starovoitov
2019-07-09 19:17 ` Josh Poimboeuf
2019-07-09 19:26 ` Daniel Borkmann
2019-07-09 12:02 ` [tip:x86/debug] " tip-bot for Josh Poimboeuf
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=20190708223834.zx7u45a4uuu2yyol@treble \
--to=jpoimboe@redhat.com \
--cc=alexei.starovoitov@gmail.com \
--cc=ast@kernel.org \
--cc=bp@alien8.de \
--cc=daniel@iogearbox.net \
--cc=hpa@zytor.com \
--cc=kasong@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=songliubraving@fb.com \
--cc=tglx@linutronix.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®