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)  static void __bpf_prog_put(struct bpf_prog *prog, bool do_idr_lock)  {  	if (atomic_dec_and_test(&prog->aux->refcnt)) { -		int i; -  		/* bpf_prog_free_id() must be called first */  		bpf_prog_free_id(prog, do_idr_lock); - -		for (i = 0; i < prog->aux->func_cnt; i++) -			bpf_prog_kallsyms_del(prog->aux->func[i]); -		bpf_prog_kallsyms_del(prog); +		bpf_prog_kallsyms_del_all(prog);  		call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu);  	} @@ -1358,9 +1353,7 @@ static int bpf_prog_load(union bpf_attr *attr)  	if (err < 0)  		goto free_used_maps; -	/* eBPF program is ready to be JITed */ -	if (!prog->bpf_func) -		prog = bpf_prog_select_runtime(prog, &err); +	prog = bpf_prog_select_runtime(prog, &err);  	if (err < 0)  		goto free_used_maps; @@ -1384,6 +1377,7 @@ static int bpf_prog_load(union bpf_attr *attr)  	return err;  free_used_maps: +	bpf_prog_kallsyms_del_subprogs(prog);  	free_used_maps(prog->aux);  free_prog:  	bpf_prog_uncharge_memlock(prog); | 
