diff options
Diffstat (limited to 'tools/lib/bpf/bpf.c')
| -rw-r--r-- | tools/lib/bpf/bpf.c | 25 | 
1 files changed, 16 insertions, 9 deletions
diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index e750b6f5fcc3..128ac723c4ea 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -230,9 +230,9 @@ alloc_zero_tailing_info(const void *orecord, __u32 cnt,  int bpf_prog_load(enum bpf_prog_type prog_type,  		  const char *prog_name, const char *license,  		  const struct bpf_insn *insns, size_t insn_cnt, -		  const struct bpf_prog_load_opts *opts) +		  struct bpf_prog_load_opts *opts)  { -	const size_t attr_sz = offsetofend(union bpf_attr, fd_array); +	const size_t attr_sz = offsetofend(union bpf_attr, log_true_size);  	void *finfo = NULL, *linfo = NULL;  	const char *func_info, *line_info;  	__u32 log_size, log_level, attach_prog_fd, attach_btf_obj_fd; @@ -290,10 +290,6 @@ int bpf_prog_load(enum bpf_prog_type prog_type,  	if (!!log_buf != !!log_size)  		return libbpf_err(-EINVAL); -	if (log_level > (4 | 2 | 1)) -		return libbpf_err(-EINVAL); -	if (log_level && !log_buf) -		return libbpf_err(-EINVAL);  	func_info_rec_size = OPTS_GET(opts, func_info_rec_size, 0);  	func_info = OPTS_GET(opts, func_info, NULL); @@ -316,6 +312,7 @@ int bpf_prog_load(enum bpf_prog_type prog_type,  	}  	fd = sys_bpf_prog_load(&attr, attr_sz, attempts); +	OPTS_SET(opts, log_true_size, attr.log_true_size);  	if (fd >= 0)  		return fd; @@ -356,6 +353,7 @@ int bpf_prog_load(enum bpf_prog_type prog_type,  		}  		fd = sys_bpf_prog_load(&attr, attr_sz, attempts); +		OPTS_SET(opts, log_true_size, attr.log_true_size);  		if (fd >= 0)  			goto done;  	} @@ -370,6 +368,7 @@ int bpf_prog_load(enum bpf_prog_type prog_type,  		attr.log_level = 1;  		fd = sys_bpf_prog_load(&attr, attr_sz, attempts); +		OPTS_SET(opts, log_true_size, attr.log_true_size);  	}  done:  	/* free() doesn't affect errno, so we don't need to restore it */ @@ -794,11 +793,17 @@ int bpf_link_update(int link_fd, int new_prog_fd,  	if (!OPTS_VALID(opts, bpf_link_update_opts))  		return libbpf_err(-EINVAL); +	if (OPTS_GET(opts, old_prog_fd, 0) && OPTS_GET(opts, old_map_fd, 0)) +		return libbpf_err(-EINVAL); +  	memset(&attr, 0, attr_sz);  	attr.link_update.link_fd = link_fd;  	attr.link_update.new_prog_fd = new_prog_fd;  	attr.link_update.flags = OPTS_GET(opts, flags, 0); -	attr.link_update.old_prog_fd = OPTS_GET(opts, old_prog_fd, 0); +	if (OPTS_GET(opts, old_prog_fd, 0)) +		attr.link_update.old_prog_fd = OPTS_GET(opts, old_prog_fd, 0); +	else if (OPTS_GET(opts, old_map_fd, 0)) +		attr.link_update.old_map_fd = OPTS_GET(opts, old_map_fd, 0);  	ret = sys_bpf(BPF_LINK_UPDATE, &attr, attr_sz);  	return libbpf_err_errno(ret); @@ -1078,9 +1083,9 @@ int bpf_raw_tracepoint_open(const char *name, int prog_fd)  	return libbpf_err_errno(fd);  } -int bpf_btf_load(const void *btf_data, size_t btf_size, const struct bpf_btf_load_opts *opts) +int bpf_btf_load(const void *btf_data, size_t btf_size, struct bpf_btf_load_opts *opts)  { -	const size_t attr_sz = offsetofend(union bpf_attr, btf_log_level); +	const size_t attr_sz = offsetofend(union bpf_attr, btf_log_true_size);  	union bpf_attr attr;  	char *log_buf;  	size_t log_size; @@ -1123,6 +1128,8 @@ int bpf_btf_load(const void *btf_data, size_t btf_size, const struct bpf_btf_loa  		attr.btf_log_level = 1;  		fd = sys_bpf_fd(BPF_BTF_LOAD, &attr, attr_sz);  	} + +	OPTS_SET(opts, log_true_size, attr.btf_log_true_size);  	return libbpf_err_errno(fd);  }  |