diff options
| author | Dmitry Torokhov <[email protected]> | 2022-10-09 22:30:23 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2022-10-09 22:30:23 -0700 | 
| commit | 5f8f8574c7f5585b09a9623f0f13462e4eb67b4d (patch) | |
| tree | 8f1d5e88bf9604a9e39fbcce0e37b3d8cee451bb /tools/lib/bpf/bpf.c | |
| parent | e62563db857f81d75c5726a35bc0180bed6d1540 (diff) | |
| parent | fe5b6aaef72a0f7daa06e7960e0bee45c2984e41 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.1 merge window.
Diffstat (limited to 'tools/lib/bpf/bpf.c')
| -rw-r--r-- | tools/lib/bpf/bpf.c | 209 | 
1 files changed, 36 insertions, 173 deletions
| diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 240186aac8e6..efcc06dafbd9 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -147,10 +147,6 @@ int bump_rlimit_memlock(void)  {  	struct rlimit rlim; -	/* this the default in libbpf 1.0, but for now user has to opt-in explicitly */ -	if (!(libbpf_mode & LIBBPF_STRICT_AUTO_RLIMIT_MEMLOCK)) -		return 0; -  	/* if kernel supports memcg-based accounting, skip bumping RLIMIT_MEMLOCK */  	if (memlock_bumped || kernel_supports(NULL, FEAT_MEMCG_ACCOUNT))  		return 0; @@ -233,11 +229,10 @@ alloc_zero_tailing_info(const void *orecord, __u32 cnt,  	return info;  } -DEFAULT_VERSION(bpf_prog_load_v0_6_0, bpf_prog_load, LIBBPF_0.6.0) -int bpf_prog_load_v0_6_0(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) +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)  {  	void *finfo = NULL, *linfo = NULL;  	const char *func_info, *line_info; @@ -384,94 +379,6 @@ done:  	return libbpf_err_errno(fd);  } -__attribute__((alias("bpf_load_program_xattr2"))) -int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr, -			   char *log_buf, size_t log_buf_sz); - -static int bpf_load_program_xattr2(const struct bpf_load_program_attr *load_attr, -				   char *log_buf, size_t log_buf_sz) -{ -	LIBBPF_OPTS(bpf_prog_load_opts, p); - -	if (!load_attr || !log_buf != !log_buf_sz) -		return libbpf_err(-EINVAL); - -	p.expected_attach_type = load_attr->expected_attach_type; -	switch (load_attr->prog_type) { -	case BPF_PROG_TYPE_STRUCT_OPS: -	case BPF_PROG_TYPE_LSM: -		p.attach_btf_id = load_attr->attach_btf_id; -		break; -	case BPF_PROG_TYPE_TRACING: -	case BPF_PROG_TYPE_EXT: -		p.attach_btf_id = load_attr->attach_btf_id; -		p.attach_prog_fd = load_attr->attach_prog_fd; -		break; -	default: -		p.prog_ifindex = load_attr->prog_ifindex; -		p.kern_version = load_attr->kern_version; -	} -	p.log_level = load_attr->log_level; -	p.log_buf = log_buf; -	p.log_size = log_buf_sz; -	p.prog_btf_fd = load_attr->prog_btf_fd; -	p.func_info_rec_size = load_attr->func_info_rec_size; -	p.func_info_cnt = load_attr->func_info_cnt; -	p.func_info = load_attr->func_info; -	p.line_info_rec_size = load_attr->line_info_rec_size; -	p.line_info_cnt = load_attr->line_info_cnt; -	p.line_info = load_attr->line_info; -	p.prog_flags = load_attr->prog_flags; - -	return bpf_prog_load(load_attr->prog_type, load_attr->name, load_attr->license, -			     load_attr->insns, load_attr->insns_cnt, &p); -} - -int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns, -		     size_t insns_cnt, const char *license, -		     __u32 kern_version, char *log_buf, -		     size_t log_buf_sz) -{ -	struct bpf_load_program_attr load_attr; - -	memset(&load_attr, 0, sizeof(struct bpf_load_program_attr)); -	load_attr.prog_type = type; -	load_attr.expected_attach_type = 0; -	load_attr.name = NULL; -	load_attr.insns = insns; -	load_attr.insns_cnt = insns_cnt; -	load_attr.license = license; -	load_attr.kern_version = kern_version; - -	return bpf_load_program_xattr2(&load_attr, log_buf, log_buf_sz); -} - -int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns, -		       size_t insns_cnt, __u32 prog_flags, const char *license, -		       __u32 kern_version, char *log_buf, size_t log_buf_sz, -		       int log_level) -{ -	union bpf_attr attr; -	int fd; - -	bump_rlimit_memlock(); - -	memset(&attr, 0, sizeof(attr)); -	attr.prog_type = type; -	attr.insn_cnt = (__u32)insns_cnt; -	attr.insns = ptr_to_u64(insns); -	attr.license = ptr_to_u64(license); -	attr.log_buf = ptr_to_u64(log_buf); -	attr.log_size = log_buf_sz; -	attr.log_level = log_level; -	log_buf[0] = 0; -	attr.kern_version = kern_version; -	attr.prog_flags = prog_flags; - -	fd = sys_bpf_prog_load(&attr, sizeof(attr), PROG_LOAD_ATTEMPTS); -	return libbpf_err_errno(fd); -} -  int bpf_map_update_elem(int fd, const void *key, const void *value,  			__u64 flags)  { @@ -672,11 +579,20 @@ int bpf_obj_pin(int fd, const char *pathname)  int bpf_obj_get(const char *pathname)  { +	return bpf_obj_get_opts(pathname, NULL); +} + +int bpf_obj_get_opts(const char *pathname, const struct bpf_obj_get_opts *opts) +{  	union bpf_attr attr;  	int fd; +	if (!OPTS_VALID(opts, bpf_obj_get_opts)) +		return libbpf_err(-EINVAL); +  	memset(&attr, 0, sizeof(attr));  	attr.pathname = ptr_to_u64((void *)pathname); +	attr.file_flags = OPTS_GET(opts, file_flags, 0);  	fd = sys_bpf_fd(BPF_OBJ_GET, &attr, sizeof(attr));  	return libbpf_err_errno(fd); @@ -888,80 +804,48 @@ int bpf_iter_create(int link_fd)  	return libbpf_err_errno(fd);  } -int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags, -		   __u32 *attach_flags, __u32 *prog_ids, __u32 *prog_cnt) +int bpf_prog_query_opts(int target_fd, +			enum bpf_attach_type type, +			struct bpf_prog_query_opts *opts)  {  	union bpf_attr attr;  	int ret; +	if (!OPTS_VALID(opts, bpf_prog_query_opts)) +		return libbpf_err(-EINVAL); +  	memset(&attr, 0, sizeof(attr)); +  	attr.query.target_fd	= target_fd;  	attr.query.attach_type	= type; -	attr.query.query_flags	= query_flags; -	attr.query.prog_cnt	= *prog_cnt; -	attr.query.prog_ids	= ptr_to_u64(prog_ids); +	attr.query.query_flags	= OPTS_GET(opts, query_flags, 0); +	attr.query.prog_cnt	= OPTS_GET(opts, prog_cnt, 0); +	attr.query.prog_ids	= ptr_to_u64(OPTS_GET(opts, prog_ids, NULL)); +	attr.query.prog_attach_flags = ptr_to_u64(OPTS_GET(opts, prog_attach_flags, NULL));  	ret = sys_bpf(BPF_PROG_QUERY, &attr, sizeof(attr)); -	if (attach_flags) -		*attach_flags = attr.query.attach_flags; -	*prog_cnt = attr.query.prog_cnt; - -	return libbpf_err_errno(ret); -} - -int bpf_prog_test_run(int prog_fd, int repeat, void *data, __u32 size, -		      void *data_out, __u32 *size_out, __u32 *retval, -		      __u32 *duration) -{ -	union bpf_attr attr; -	int ret; - -	memset(&attr, 0, sizeof(attr)); -	attr.test.prog_fd = prog_fd; -	attr.test.data_in = ptr_to_u64(data); -	attr.test.data_out = ptr_to_u64(data_out); -	attr.test.data_size_in = size; -	attr.test.repeat = repeat; - -	ret = sys_bpf(BPF_PROG_TEST_RUN, &attr, sizeof(attr)); - -	if (size_out) -		*size_out = attr.test.data_size_out; -	if (retval) -		*retval = attr.test.retval; -	if (duration) -		*duration = attr.test.duration; +	OPTS_SET(opts, attach_flags, attr.query.attach_flags); +	OPTS_SET(opts, prog_cnt, attr.query.prog_cnt);  	return libbpf_err_errno(ret);  } -int bpf_prog_test_run_xattr(struct bpf_prog_test_run_attr *test_attr) +int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags, +		   __u32 *attach_flags, __u32 *prog_ids, __u32 *prog_cnt)  { -	union bpf_attr attr; +	LIBBPF_OPTS(bpf_prog_query_opts, opts);  	int ret; -	if (!test_attr->data_out && test_attr->data_size_out > 0) -		return libbpf_err(-EINVAL); +	opts.query_flags = query_flags; +	opts.prog_ids = prog_ids; +	opts.prog_cnt = *prog_cnt; -	memset(&attr, 0, sizeof(attr)); -	attr.test.prog_fd = test_attr->prog_fd; -	attr.test.data_in = ptr_to_u64(test_attr->data_in); -	attr.test.data_out = ptr_to_u64(test_attr->data_out); -	attr.test.data_size_in = test_attr->data_size_in; -	attr.test.data_size_out = test_attr->data_size_out; -	attr.test.ctx_in = ptr_to_u64(test_attr->ctx_in); -	attr.test.ctx_out = ptr_to_u64(test_attr->ctx_out); -	attr.test.ctx_size_in = test_attr->ctx_size_in; -	attr.test.ctx_size_out = test_attr->ctx_size_out; -	attr.test.repeat = test_attr->repeat; +	ret = bpf_prog_query_opts(target_fd, type, &opts); -	ret = sys_bpf(BPF_PROG_TEST_RUN, &attr, sizeof(attr)); - -	test_attr->data_size_out = attr.test.data_size_out; -	test_attr->ctx_size_out = attr.test.ctx_size_out; -	test_attr->retval = attr.test.retval; -	test_attr->duration = attr.test.duration; +	if (attach_flags) +		*attach_flags = opts.attach_flags; +	*prog_cnt = opts.prog_cnt;  	return libbpf_err_errno(ret);  } @@ -1162,27 +1046,6 @@ int bpf_btf_load(const void *btf_data, size_t btf_size, const struct bpf_btf_loa  	return libbpf_err_errno(fd);  } -int bpf_load_btf(const void *btf, __u32 btf_size, char *log_buf, __u32 log_buf_size, bool do_log) -{ -	LIBBPF_OPTS(bpf_btf_load_opts, opts); -	int fd; - -retry: -	if (do_log && log_buf && log_buf_size) { -		opts.log_buf = log_buf; -		opts.log_size = log_buf_size; -		opts.log_level = 1; -	} - -	fd = bpf_btf_load(btf, btf_size, &opts); -	if (fd < 0 && !do_log && log_buf && log_buf_size) { -		do_log = true; -		goto retry; -	} - -	return libbpf_err_errno(fd); -} -  int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, __u32 *buf_len,  		      __u32 *prog_id, __u32 *fd_type, __u64 *probe_offset,  		      __u64 *probe_addr) |