Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bpf, verifier: avoid retpoline for map push/pop/peek operation

Extend prior work from 09772d92cd5a ("bpf: avoid retpoline for
lookup/update/delete calls on maps") to also apply to the recently
added map helpers that perform push/pop/peek operations so that
the indirect call can be avoided.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Daniel Borkmann and committed by
Alexei Starovoitov
84430d42 ad38911d

+24 -1
+24 -1
kernel/bpf/verifier.c
··· 6178 6178 if (prog->jit_requested && BITS_PER_LONG == 64 && 6179 6179 (insn->imm == BPF_FUNC_map_lookup_elem || 6180 6180 insn->imm == BPF_FUNC_map_update_elem || 6181 - insn->imm == BPF_FUNC_map_delete_elem)) { 6181 + insn->imm == BPF_FUNC_map_delete_elem || 6182 + insn->imm == BPF_FUNC_map_push_elem || 6183 + insn->imm == BPF_FUNC_map_pop_elem || 6184 + insn->imm == BPF_FUNC_map_peek_elem)) { 6182 6185 aux = &env->insn_aux_data[i + delta]; 6183 6186 if (bpf_map_ptr_poisoned(aux)) 6184 6187 goto patch_call_imm; ··· 6214 6211 BUILD_BUG_ON(!__same_type(ops->map_update_elem, 6215 6212 (int (*)(struct bpf_map *map, void *key, void *value, 6216 6213 u64 flags))NULL)); 6214 + BUILD_BUG_ON(!__same_type(ops->map_push_elem, 6215 + (int (*)(struct bpf_map *map, void *value, 6216 + u64 flags))NULL)); 6217 + BUILD_BUG_ON(!__same_type(ops->map_pop_elem, 6218 + (int (*)(struct bpf_map *map, void *value))NULL)); 6219 + BUILD_BUG_ON(!__same_type(ops->map_peek_elem, 6220 + (int (*)(struct bpf_map *map, void *value))NULL)); 6221 + 6217 6222 switch (insn->imm) { 6218 6223 case BPF_FUNC_map_lookup_elem: 6219 6224 insn->imm = BPF_CAST_CALL(ops->map_lookup_elem) - ··· 6233 6222 continue; 6234 6223 case BPF_FUNC_map_delete_elem: 6235 6224 insn->imm = BPF_CAST_CALL(ops->map_delete_elem) - 6225 + __bpf_call_base; 6226 + continue; 6227 + case BPF_FUNC_map_push_elem: 6228 + insn->imm = BPF_CAST_CALL(ops->map_push_elem) - 6229 + __bpf_call_base; 6230 + continue; 6231 + case BPF_FUNC_map_pop_elem: 6232 + insn->imm = BPF_CAST_CALL(ops->map_pop_elem) - 6233 + __bpf_call_base; 6234 + continue; 6235 + case BPF_FUNC_map_peek_elem: 6236 + insn->imm = BPF_CAST_CALL(ops->map_peek_elem) - 6236 6237 __bpf_call_base; 6237 6238 continue; 6238 6239 }