diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
-rw-r--r-- | kernel/bpf/syscall.c | 12 |
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) | |||
1034 | static void __bpf_prog_put(struct bpf_prog *prog, bool do_idr_lock) | 1034 | static 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 | ||
1386 | free_used_maps: | 1379 | free_used_maps: |
1380 | bpf_prog_kallsyms_del_subprogs(prog); | ||
1387 | free_used_maps(prog->aux); | 1381 | free_used_maps(prog->aux); |
1388 | free_prog: | 1382 | free_prog: |
1389 | bpf_prog_uncharge_memlock(prog); | 1383 | bpf_prog_uncharge_memlock(prog); |