Relax verifier's restriction that was meant to forbid tailcall usage
when subprog count was higher than 1.

Also, do not max out the stack depth of program that utilizes tailcalls.

Signed-off-by: Maciej Fijalkowski <maciej.fijalkow...@intel.com>
---
 kernel/bpf/verifier.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index f4955b4bf8a6..3ea769555246 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -4176,10 +4176,12 @@ static int check_map_func_compatibility(struct 
bpf_verifier_env *env,
        case BPF_FUNC_tail_call:
                if (map->map_type != BPF_MAP_TYPE_PROG_ARRAY)
                        goto error;
+#if !defined(CONFIG_X86_64) || !defined(CONFIG_BPF_JIT_ALWAYS_ON)
                if (env->subprog_cnt > 1) {
                        verbose(env, "tail_calls are not allowed in programs 
with bpf-to-bpf calls\n");
                        return -EINVAL;
                }
+#endif
                break;
        case BPF_FUNC_perf_event_read:
        case BPF_FUNC_perf_event_output:
@@ -10284,7 +10286,9 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
                         * the program array.
                         */
                        prog->cb_access = 1;
+#if !defined(CONFIG_X86_64) || !defined(CONFIG_BPF_JIT_ALWAYS_ON)
                        env->prog->aux->stack_depth = MAX_BPF_STACK;
+#endif
                        env->prog->aux->max_pkt_offset = MAX_PACKET_OFF;
 
                        /* mark bpf_tail_call as different opcode to avoid
-- 
2.20.1

Reply via email to