Commit 2ed905c5 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Alexei Starovoitov

bpf: Enforce preallocation for instrumentation programs on RT

Aside of the general unsafety of run-time map allocation for
instrumentation type programs RT enabled kernels have another constraint:

The instrumentation programs are invoked with preemption disabled, but the
memory allocator spinlocks cannot be acquired in atomic context because
they are converted to 'sleeping' spinlocks on RT.

Therefore enforce map preallocation for these programs types when RT is
enabled.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200224145642.648784007@linutronix.de
parent 94dacdbd
...@@ -8168,16 +8168,21 @@ static int check_map_prog_compatibility(struct bpf_verifier_env *env, ...@@ -8168,16 +8168,21 @@ static int check_map_prog_compatibility(struct bpf_verifier_env *env,
* of the memory allocator or at a place where a recursion into the * of the memory allocator or at a place where a recursion into the
* memory allocator would see inconsistent state. * memory allocator would see inconsistent state.
* *
* For now running such programs is allowed for backwards * On RT enabled kernels run-time allocation of all trace type
* compatibility reasons, but warnings are emitted so developers are * programs is strictly prohibited due to lock type constraints. On
* made aware of the unsafety and can fix their programs before this * !RT kernels it is allowed for backwards compatibility reasons for
* is enforced. * now, but warnings are emitted so developers are made aware of
* the unsafety and can fix their programs before this is enforced.
*/ */
if (is_tracing_prog_type(prog->type) && !is_preallocated_map(map)) { if (is_tracing_prog_type(prog->type) && !is_preallocated_map(map)) {
if (prog->type == BPF_PROG_TYPE_PERF_EVENT) { if (prog->type == BPF_PROG_TYPE_PERF_EVENT) {
verbose(env, "perf_event programs can only use preallocated hash map\n"); verbose(env, "perf_event programs can only use preallocated hash map\n");
return -EINVAL; return -EINVAL;
} }
if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
verbose(env, "trace type programs can only use preallocated hash map\n");
return -EINVAL;
}
WARN_ONCE(1, "trace type BPF program uses run-time allocation\n"); WARN_ONCE(1, "trace type BPF program uses run-time allocation\n");
verbose(env, "trace type programs with run-time allocated hash maps are unsafe. Switch to preallocated hash maps.\n"); verbose(env, "trace type programs with run-time allocated hash maps are unsafe. Switch to preallocated hash maps.\n");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment