aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/bpf/syscall.c')
-rw-r--r--kernel/bpf/syscall.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 0fa20624707f..35dc466641f2 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -1034,14 +1034,9 @@ static void __bpf_prog_put_rcu(struct rcu_head *rcu)
1034static void __bpf_prog_put(struct bpf_prog *prog, bool do_idr_lock) 1034static void __bpf_prog_put(struct bpf_prog *prog, bool do_idr_lock)
1035{ 1035{
1036 if (atomic_dec_and_test(&prog->aux->refcnt)) { 1036 if (atomic_dec_and_test(&prog->aux->refcnt)) {
1037 int i;
1038
1039 /* bpf_prog_free_id() must be called first */ 1037 /* bpf_prog_free_id() must be called first */
1040 bpf_prog_free_id(prog, do_idr_lock); 1038 bpf_prog_free_id(prog, do_idr_lock);
1041 1039 bpf_prog_kallsyms_del_all(prog);
1042 for (i = 0; i < prog->aux->func_cnt; i++)
1043 bpf_prog_kallsyms_del(prog->aux->func[i]);
1044 bpf_prog_kallsyms_del(prog);
1045 1040
1046 call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu); 1041 call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu);
1047 } 1042 }
@@ -1358,9 +1353,7 @@ static int bpf_prog_load(union bpf_attr *attr)
1358 if (err < 0) 1353 if (err < 0)
1359 goto free_used_maps; 1354 goto free_used_maps;
1360 1355
1361 /* eBPF program is ready to be JITed */ 1356 prog = bpf_prog_select_runtime(prog, &err);
1362 if (!prog->bpf_func)
1363 prog = bpf_prog_select_runtime(prog, &err);
1364 if (err < 0) 1357 if (err < 0)
1365 goto free_used_maps; 1358 goto free_used_maps;
1366 1359
@@ -1384,6 +1377,7 @@ static int bpf_prog_load(union bpf_attr *attr)
1384 return err; 1377 return err;
1385 1378
1386free_used_maps: 1379free_used_maps:
1380 bpf_prog_kallsyms_del_subprogs(prog);
1387 free_used_maps(prog->aux); 1381 free_used_maps(prog->aux);
1388free_prog: 1382free_prog:
1389 bpf_prog_uncharge_memlock(prog); 1383 bpf_prog_uncharge_memlock(prog);