diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
-rw-r--r-- | kernel/bpf/syscall.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 82eabd4e38ad..bcfc362de4f2 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c | |||
@@ -1332,18 +1332,26 @@ static void __bpf_prog_put_rcu(struct rcu_head *rcu) | |||
1332 | bpf_prog_free(aux->prog); | 1332 | bpf_prog_free(aux->prog); |
1333 | } | 1333 | } |
1334 | 1334 | ||
1335 | static void __bpf_prog_put_noref(struct bpf_prog *prog, bool deferred) | ||
1336 | { | ||
1337 | bpf_prog_kallsyms_del_all(prog); | ||
1338 | btf_put(prog->aux->btf); | ||
1339 | kvfree(prog->aux->func_info); | ||
1340 | bpf_prog_free_linfo(prog); | ||
1341 | |||
1342 | if (deferred) | ||
1343 | call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu); | ||
1344 | else | ||
1345 | __bpf_prog_put_rcu(&prog->aux->rcu); | ||
1346 | } | ||
1347 | |||
1335 | static void __bpf_prog_put(struct bpf_prog *prog, bool do_idr_lock) | 1348 | static void __bpf_prog_put(struct bpf_prog *prog, bool do_idr_lock) |
1336 | { | 1349 | { |
1337 | if (atomic_dec_and_test(&prog->aux->refcnt)) { | 1350 | if (atomic_dec_and_test(&prog->aux->refcnt)) { |
1338 | perf_event_bpf_event(prog, PERF_BPF_EVENT_PROG_UNLOAD, 0); | 1351 | perf_event_bpf_event(prog, PERF_BPF_EVENT_PROG_UNLOAD, 0); |
1339 | /* bpf_prog_free_id() must be called first */ | 1352 | /* bpf_prog_free_id() must be called first */ |
1340 | bpf_prog_free_id(prog, do_idr_lock); | 1353 | bpf_prog_free_id(prog, do_idr_lock); |
1341 | bpf_prog_kallsyms_del_all(prog); | 1354 | __bpf_prog_put_noref(prog, true); |
1342 | btf_put(prog->aux->btf); | ||
1343 | kvfree(prog->aux->func_info); | ||
1344 | bpf_prog_free_linfo(prog); | ||
1345 | |||
1346 | call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu); | ||
1347 | } | 1355 | } |
1348 | } | 1356 | } |
1349 | 1357 | ||
@@ -1741,11 +1749,12 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr) | |||
1741 | return err; | 1749 | return err; |
1742 | 1750 | ||
1743 | free_used_maps: | 1751 | free_used_maps: |
1744 | bpf_prog_free_linfo(prog); | 1752 | /* In case we have subprogs, we need to wait for a grace |
1745 | kvfree(prog->aux->func_info); | 1753 | * period before we can tear down JIT memory since symbols |
1746 | btf_put(prog->aux->btf); | 1754 | * are already exposed under kallsyms. |
1747 | bpf_prog_kallsyms_del_subprogs(prog); | 1755 | */ |
1748 | free_used_maps(prog->aux); | 1756 | __bpf_prog_put_noref(prog, prog->aux->func_cnt); |
1757 | return err; | ||
1749 | free_prog: | 1758 | free_prog: |
1750 | bpf_prog_uncharge_memlock(prog); | 1759 | bpf_prog_uncharge_memlock(prog); |
1751 | free_prog_sec: | 1760 | free_prog_sec: |