bpf: convert temp arrays to kvcalloc
authorAlexei Starovoitov <ast@kernel.org>
Tue, 2 Apr 2019 04:27:43 +0000 (21:27 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 3 Apr 2019 23:27:38 +0000 (01:27 +0200)
Temporary arrays used during program verification need to be vmalloc-ed
to support large bpf programs.

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

index 94cf6efc5df6483c7288eb84500fb98eeb57d3fe..ad3494a881dad889039f7d9ee278f6c6f863ec8c 100644 (file)
@@ -5313,13 +5313,13 @@ static int check_cfg(struct bpf_verifier_env *env)
        int ret = 0;
        int i, t;
 
-       insn_state = kcalloc(insn_cnt, sizeof(int), GFP_KERNEL);
+       insn_state = kvcalloc(insn_cnt, sizeof(int), GFP_KERNEL);
        if (!insn_state)
                return -ENOMEM;
 
-       insn_stack = kcalloc(insn_cnt, sizeof(int), GFP_KERNEL);
+       insn_stack = kvcalloc(insn_cnt, sizeof(int), GFP_KERNEL);
        if (!insn_stack) {
-               kfree(insn_state);
+               kvfree(insn_state);
                return -ENOMEM;
        }
 
@@ -5417,8 +5417,8 @@ check_state:
        ret = 0; /* cfg looks good */
 
 err_free:
-       kfree(insn_state);
-       kfree(insn_stack);
+       kvfree(insn_state);
+       kvfree(insn_stack);
        return ret;
 }
 
@@ -7898,7 +7898,7 @@ static void free_states(struct bpf_verifier_env *env)
                        }
        }
 
-       kfree(env->explored_states);
+       kvfree(env->explored_states);
 }
 
 static void print_verification_stats(struct bpf_verifier_env *env)
@@ -7994,7 +7994,7 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr,
                        goto skip_full_check;
        }
 
-       env->explored_states = kcalloc(env->prog->len,
+       env->explored_states = kvcalloc(env->prog->len,
                                       sizeof(struct bpf_verifier_state_list *),
                                       GFP_USER);
        ret = -ENOMEM;