The verifier currently limits direct offsets into a map to 512MiB to avoid overflow during pointer arithmetic. However, this prevents arena maps from using direct addressing instructions to access data at the end of > 512MiB arena maps. This is necessary when moving arena globals to the end of the arena instead of the front. Relax the limitation for direct offsets into arena maps to 4GiB, the maximum arena size. Signed-off-by: Emil Tsalapatis --- kernel/bpf/verifier.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 098dd7f21c89..a64cc5caf4aa 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -21084,13 +21084,13 @@ static int resolve_pseudo_ldimm64(struct bpf_verifier_env *env) } else { u32 off = insn[1].imm; - if (off >= BPF_MAX_VAR_OFF) { - verbose(env, "direct value offset of %u is not allowed\n", off); + if (!map->ops->map_direct_value_addr) { + verbose(env, "no direct value access support for this map type\n"); return -EINVAL; } - if (!map->ops->map_direct_value_addr) { - verbose(env, "no direct value access support for this map type\n"); + if (off >= BPF_MAX_VAR_OFF && map->map_type != BPF_MAP_TYPE_ARENA) { + verbose(env, "direct value offset of %u is not allowed\n", off); return -EINVAL; } -- 2.49.0