diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/lib/bpf/libbpf.c | 34 | ||||
| -rw-r--r-- | tools/lib/bpf/libbpf.h | 4 | ||||
| -rw-r--r-- | tools/lib/bpf/libbpf.map | 2 | 
3 files changed, 36 insertions, 4 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 0eb10b681413..8f0c436d5880 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -4937,8 +4937,8 @@ int bpf_program__load(struct bpf_program *prog, char *license, __u32 kern_ver)  {  	int err = 0, fd, i, btf_id; -	if (prog->type == BPF_PROG_TYPE_TRACING || -	    prog->type == BPF_PROG_TYPE_EXT) { +	if ((prog->type == BPF_PROG_TYPE_TRACING || +	     prog->type == BPF_PROG_TYPE_EXT) && !prog->attach_btf_id) {  		btf_id = libbpf_find_attach_btf_id(prog);  		if (btf_id <= 0)  			return btf_id; @@ -6581,6 +6581,9 @@ static inline int __find_vmlinux_btf_id(struct btf *btf, const char *name,  	else  		err = btf__find_by_name_kind(btf, name, BTF_KIND_FUNC); +	if (err <= 0) +		pr_warn("%s is not found in vmlinux BTF\n", name); +  	return err;  } @@ -6653,8 +6656,6 @@ static int libbpf_find_attach_btf_id(struct bpf_program *prog)  			err = __find_vmlinux_btf_id(prog->obj->btf_vmlinux,  						    name + section_defs[i].len,  						    attach_type); -		if (err <= 0) -			pr_warn("%s is not found in vmlinux BTF\n", name);  		return err;  	}  	pr_warn("failed to identify btf_id based on ELF section name '%s'\n", name); @@ -8130,6 +8131,31 @@ void bpf_program__bpil_offs_to_addr(struct bpf_prog_info_linear *info_linear)  	}  } +int bpf_program__set_attach_target(struct bpf_program *prog, +				   int attach_prog_fd, +				   const char *attach_func_name) +{ +	int btf_id; + +	if (!prog || attach_prog_fd < 0 || !attach_func_name) +		return -EINVAL; + +	if (attach_prog_fd) +		btf_id = libbpf_find_prog_btf_id(attach_func_name, +						 attach_prog_fd); +	else +		btf_id = __find_vmlinux_btf_id(prog->obj->btf_vmlinux, +					       attach_func_name, +					       prog->expected_attach_type); + +	if (btf_id < 0) +		return btf_id; + +	prog->attach_btf_id = btf_id; +	prog->attach_prog_fd = attach_prog_fd; +	return 0; +} +  int parse_cpu_mask_str(const char *s, bool **mask, int *mask_sz)  {  	int err = 0, n, len, start, end = -1; diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 3fe12c9d1f92..02fc58a21a7f 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -334,6 +334,10 @@ LIBBPF_API void  bpf_program__set_expected_attach_type(struct bpf_program *prog,  				      enum bpf_attach_type type); +LIBBPF_API int +bpf_program__set_attach_target(struct bpf_program *prog, int attach_prog_fd, +			       const char *attach_func_name); +  LIBBPF_API bool bpf_program__is_socket_filter(const struct bpf_program *prog);  LIBBPF_API bool bpf_program__is_tracepoint(const struct bpf_program *prog);  LIBBPF_API bool bpf_program__is_raw_tracepoint(const struct bpf_program *prog); diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map index 45be19c9d752..7b014c8cdece 100644 --- a/tools/lib/bpf/libbpf.map +++ b/tools/lib/bpf/libbpf.map @@ -237,4 +237,6 @@ LIBBPF_0.0.7 {  } LIBBPF_0.0.6;  LIBBPF_0.0.8 { +	global: +		bpf_program__set_attach_target;  } LIBBPF_0.0.7;  | 
