From: Rick Edgecombe <rick.p.edgecombe@intel.com>
To: daniel@iogearbox.net, ast@fb.com
Cc: netdev@vger.kernel.org, ard.biesheuvel@linaro.org,
dave.hansen@intel.com, kristen@linux.intel.com,
Rick Edgecombe <rick.p.edgecombe@intel.com>
Subject: [RFC PATCH 0/4] Initial support for allocating BPF JITs in vmalloc for x86
Date: Tue, 5 Feb 2019 14:50:59 -0800 [thread overview]
Message-ID: <20190205225103.28296-1-rick.p.edgecombe@intel.com> (raw)
This introduces a new capability for BPF program JIT's to be located in vmalloc
space on x86_64. This can serve as a backup area for CONFIG_BPF_JIT_ALWAYS_ON in
case an unprivileged app uses all of the module space allowed by bpf_jit_limit.
In order to allow for calls from the increased distance of vmalloc from
kernel/module space, relative calls are emitted as full indirect calls if the
maximum relative call distance is exceeded. So the resulting performance of call
BPF instructions in this case is similar to the BPF interpreter.
Below is the results for the BPF unit test "BPF_MAXINSNS: Call heavy
transformations":
Config Duration 1 Duration 2
--------------------------------------------------
JIT Modules 13304 14224
JIT Vmalloc 33711 26877
Interpreter 31931 28180
Retpoline JIT Modules 14517 13375
Retpoline JIT Vmalloc 65739 60281
Retpoline Interpreter 63097 61141
Since this benchmark is made up of only calls to the kernel text, it suggests
real world performance shouldn't ever be worse than the interpreter.
The logic for when to use vmalloc, is that we use module space unless it is
full, or, we are not CAP_SYS_ADMIN and bpf_jit_limit is exceeded. So vmalloc is
only used when either the insertion would fail, or BPF would fallback to the
interpreter. So there should be no run time regression when used in these
scenarios.
Todo:
- This passes all the unit tests, but could use further verification that the
compiler will still always converge.
- Fix ARM after "bpf: Charge bpf jit limit in bpf_jit_alloc_exec" change
- Update documentation for bpf_jit_limit
Possible future optimizations:
- Look at re-mapping some text in vmalloc so that calls can be in relative jump
range. For example, a BPF library program could maybe be re-mapped multiple
times so that a copy is always near the caller and so we could use the faster
calls.
Rick Edgecombe (4):
bpf, x64: Implement BPF call retpoline
bpf, x64: Increase distance for bpf calls
bpf: Charge bpf jit limit in bpf_jit_alloc_exec
bpf, x64: Enable unprivlidged jit in vmalloc
arch/x86/include/asm/nospec-branch.h | 45 +++++++-
arch/x86/net/bpf_jit_comp.c | 149 ++++++++++++++++++++++-----
include/linux/filter.h | 3 +
kernel/bpf/core.c | 20 ++--
4 files changed, 183 insertions(+), 34 deletions(-)
--
2.17.1
next reply other threads:[~2019-02-05 22:54 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-05 22:50 Rick Edgecombe [this message]
2019-02-05 22:51 ` [RFC PATCH 1/4] bpf, x64: Implement BPF call retpoline Rick Edgecombe
2019-02-05 22:51 ` [RFC PATCH 2/4] bpf, x64: Increase distance for bpf calls Rick Edgecombe
2019-02-05 22:51 ` [RFC PATCH 3/4] bpf: Charge bpf jit limit in bpf_jit_alloc_exec Rick Edgecombe
2019-02-05 22:51 ` [RFC PATCH 4/4] bpf, x64: Enable unprivlidged jit in vmalloc Rick Edgecombe
2019-02-06 0:35 ` [RFC PATCH 0/4] Initial support for allocating BPF JITs in vmalloc for x86 Alexei Starovoitov
2019-02-06 1:11 ` Edgecombe, Rick P
2019-02-06 1:40 ` Alexei Starovoitov
2019-02-06 15:38 ` Daniel Borkmann
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=20190205225103.28296-1-rick.p.edgecombe@intel.com \
--to=rick.p.edgecombe@intel.com \
--cc=ard.biesheuvel@linaro.org \
--cc=ast@fb.com \
--cc=daniel@iogearbox.net \
--cc=dave.hansen@intel.com \
--cc=kristen@linux.intel.com \
--cc=netdev@vger.kernel.org \
/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