diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
| -rw-r--r-- | kernel/bpf/syscall.c | 31 | 
1 files changed, 24 insertions, 7 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 250503482cda..941ca06d9dfa 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -1694,7 +1694,9 @@ static void __bpf_prog_put_noref(struct bpf_prog *prog, bool deferred)  {  	bpf_prog_kallsyms_del_all(prog);  	btf_put(prog->aux->btf); -	bpf_prog_free_linfo(prog); +	kvfree(prog->aux->jited_linfo); +	kvfree(prog->aux->linfo); +	kfree(prog->aux->kfunc_tab);  	if (prog->aux->attach_btf)  		btf_put(prog->aux->attach_btf); @@ -2549,6 +2551,9 @@ static int bpf_tracing_link_fill_link_info(const struct bpf_link *link,  		container_of(link, struct bpf_tracing_link, link);  	info->tracing.attach_type = tr_link->attach_type; +	bpf_trampoline_unpack_key(tr_link->trampoline->key, +				  &info->tracing.target_obj_id, +				  &info->tracing.target_btf_id);  	return 0;  } @@ -2643,14 +2648,25 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog,  	 *   target_btf_id using the link_create API.  	 *  	 * - if tgt_prog == NULL when this function was called using the old -         *   raw_tracepoint_open API, and we need a target from prog->aux -         * -         * The combination of no saved target in prog->aux, and no target -         * specified on load is illegal, and we reject that here. +	 *   raw_tracepoint_open API, and we need a target from prog->aux +	 * +	 * - if prog->aux->dst_trampoline and tgt_prog is NULL, the program +	 *   was detached and is going for re-attachment.  	 */  	if (!prog->aux->dst_trampoline && !tgt_prog) { -		err = -ENOENT; -		goto out_unlock; +		/* +		 * Allow re-attach for TRACING and LSM programs. If it's +		 * currently linked, bpf_trampoline_link_prog will fail. +		 * EXT programs need to specify tgt_prog_fd, so they +		 * re-attach in separate code path. +		 */ +		if (prog->type != BPF_PROG_TYPE_TRACING && +		    prog->type != BPF_PROG_TYPE_LSM) { +			err = -EINVAL; +			goto out_unlock; +		} +		btf_id = prog->aux->attach_btf_id; +		key = bpf_trampoline_compute_key(NULL, prog->aux->attach_btf, btf_id);  	}  	if (!prog->aux->dst_trampoline || @@ -2946,6 +2962,7 @@ attach_type_to_prog_type(enum bpf_attach_type attach_type)  		return BPF_PROG_TYPE_SK_MSG;  	case BPF_SK_SKB_STREAM_PARSER:  	case BPF_SK_SKB_STREAM_VERDICT: +	case BPF_SK_SKB_VERDICT:  		return BPF_PROG_TYPE_SK_SKB;  	case BPF_LIRC_MODE2:  		return BPF_PROG_TYPE_LIRC_MODE2;  |