mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	libbpf: Improve logging around BPF program loading
Add missing "prog '%s': " prefixes in few places and use consistently
markers for beginning and end of program load logs. Here's an example of
log output:
libbpf: prog 'handler': BPF program load failed: Permission denied
libbpf: -- BEGIN PROG LOAD LOG ---
arg#0 reference type('UNKNOWN ') size cannot be determined: -22
; out1 = in1;
0: (18) r1 = 0xffffc9000cdcc000
2: (61) r1 = *(u32 *)(r1 +0)
...
81: (63) *(u32 *)(r4 +0) = r5
 R1_w=map_value(id=0,off=16,ks=4,vs=20,imm=0) R4=map_value(id=0,off=400,ks=4,vs=16,imm=0)
invalid access to map value, value_size=16 off=400 size=4
R4 min value is outside of the allowed memory range
processed 63 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
 -- END PROG LOAD LOG --
libbpf: failed to load program 'handler'
libbpf: failed to load object 'test_skeleton'
The entire verifier log, including BEGIN and END markers are now always
youtput during a single print callback call. This should make it much
easier to post-process or parse it, if necessary. It's not an explicit
API guarantee, but it can be reasonably expected to stay like that.
Also __bpf_object__open is renamed to bpf_object_open() as it's always
an adventure to find the exact function that implements bpf_object's
open phase, so drop the double underscored and use internal libbpf
naming convention.
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20211209193840.1248570-6-andrii@kernel.org
			
			
This commit is contained in:
		
							parent
							
								
									e0e3ea888c
								
							
						
					
					
						commit
						ad9a7f9644
					
				| @ -6662,8 +6662,10 @@ retry_load: | |||||||
| 	ret = bpf_prog_load(prog->type, prog_name, license, insns, insns_cnt, &load_attr); | 	ret = bpf_prog_load(prog->type, prog_name, license, insns, insns_cnt, &load_attr); | ||||||
| 
 | 
 | ||||||
| 	if (ret >= 0) { | 	if (ret >= 0) { | ||||||
| 		if (log_buf && load_attr.log_level) | 		if (log_buf && load_attr.log_level) { | ||||||
| 			pr_debug("verifier log:\n%s", log_buf); | 			pr_debug("prog '%s': -- BEGIN PROG LOAD LOG --\n%s-- END PROG LOAD LOG --\n", | ||||||
|  | 				 prog->name, log_buf); | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		if (obj->has_rodata && kernel_supports(obj, FEAT_PROG_BIND_MAP)) { | 		if (obj->has_rodata && kernel_supports(obj, FEAT_PROG_BIND_MAP)) { | ||||||
| 			struct bpf_map *map; | 			struct bpf_map *map; | ||||||
| @ -6676,8 +6678,8 @@ retry_load: | |||||||
| 
 | 
 | ||||||
| 				if (bpf_prog_bind_map(ret, bpf_map__fd(map), NULL)) { | 				if (bpf_prog_bind_map(ret, bpf_map__fd(map), NULL)) { | ||||||
| 					cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); | 					cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); | ||||||
| 					pr_warn("prog '%s': failed to bind .rodata map: %s\n", | 					pr_warn("prog '%s': failed to bind map '%s': %s\n", | ||||||
| 						prog->name, cp); | 						prog->name, map->real_name, cp); | ||||||
| 					/* Don't fail hard if can't bind rodata. */ | 					/* Don't fail hard if can't bind rodata. */ | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| @ -6691,23 +6693,22 @@ retry_load: | |||||||
| 	if (!log_buf || errno == ENOSPC) { | 	if (!log_buf || errno == ENOSPC) { | ||||||
| 		log_buf_size = max((size_t)BPF_LOG_BUF_SIZE, | 		log_buf_size = max((size_t)BPF_LOG_BUF_SIZE, | ||||||
| 				   log_buf_size << 1); | 				   log_buf_size << 1); | ||||||
| 
 |  | ||||||
| 		free(log_buf); | 		free(log_buf); | ||||||
| 		goto retry_load; | 		goto retry_load; | ||||||
| 	} | 	} | ||||||
| 	ret = errno ? -errno : -LIBBPF_ERRNO__LOAD; | 	ret = errno ? -errno : -LIBBPF_ERRNO__LOAD; | ||||||
| 	cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); | 	cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); | ||||||
| 	pr_warn("load bpf program failed: %s\n", cp); | 	pr_warn("prog '%s': BPF program load failed: %s\n", prog->name, cp); | ||||||
| 	pr_perm_msg(ret); | 	pr_perm_msg(ret); | ||||||
| 
 | 
 | ||||||
| 	if (log_buf && log_buf[0] != '\0') { | 	if (log_buf && log_buf[0] != '\0') { | ||||||
| 		ret = -LIBBPF_ERRNO__VERIFY; | 		ret = -LIBBPF_ERRNO__VERIFY; | ||||||
| 		pr_warn("-- BEGIN DUMP LOG ---\n"); | 		pr_warn("prog '%s': -- BEGIN PROG LOAD LOG --\n%s-- END PROG LOAD LOG --\n", | ||||||
| 		pr_warn("\n%s\n", log_buf); | 			prog->name, log_buf); | ||||||
| 		pr_warn("-- END LOG --\n"); | 	} | ||||||
| 	} else if (insns_cnt >= BPF_MAXINSNS) { | 	if (insns_cnt >= BPF_MAXINSNS) { | ||||||
| 		pr_warn("Program too large (%d insns), at most %d insns\n", | 		pr_warn("prog '%s': program too large (%d insns), at most %d insns\n", | ||||||
| 			insns_cnt, BPF_MAXINSNS); | 			prog->name, insns_cnt, BPF_MAXINSNS); | ||||||
| 		ret = -LIBBPF_ERRNO__PROG2BIG; | 		ret = -LIBBPF_ERRNO__PROG2BIG; | ||||||
| 	} else if (prog->type != BPF_PROG_TYPE_KPROBE) { | 	} else if (prog->type != BPF_PROG_TYPE_KPROBE) { | ||||||
| 		/* Wrong program type? */ | 		/* Wrong program type? */ | ||||||
| @ -6931,8 +6932,7 @@ static int bpf_object_init_progs(struct bpf_object *obj, const struct bpf_object | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static struct bpf_object * | static struct bpf_object *bpf_object_open(const char *path, const void *obj_buf, size_t obj_buf_sz, | ||||||
| __bpf_object__open(const char *path, const void *obj_buf, size_t obj_buf_sz, |  | ||||||
| 					  const struct bpf_object_open_opts *opts) | 					  const struct bpf_object_open_opts *opts) | ||||||
| { | { | ||||||
| 	const char *obj_name, *kconfig, *btf_tmp_path; | 	const char *obj_name, *kconfig, *btf_tmp_path; | ||||||
| @ -7033,7 +7033,7 @@ __bpf_object__open_xattr(struct bpf_object_open_attr *attr, int flags) | |||||||
| 		return NULL; | 		return NULL; | ||||||
| 
 | 
 | ||||||
| 	pr_debug("loading %s\n", attr->file); | 	pr_debug("loading %s\n", attr->file); | ||||||
| 	return __bpf_object__open(attr->file, NULL, 0, &opts); | 	return bpf_object_open(attr->file, NULL, 0, &opts); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct bpf_object *bpf_object__open_xattr(struct bpf_object_open_attr *attr) | struct bpf_object *bpf_object__open_xattr(struct bpf_object_open_attr *attr) | ||||||
| @ -7059,7 +7059,7 @@ bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts) | |||||||
| 
 | 
 | ||||||
| 	pr_debug("loading %s\n", path); | 	pr_debug("loading %s\n", path); | ||||||
| 
 | 
 | ||||||
| 	return libbpf_ptr(__bpf_object__open(path, NULL, 0, opts)); | 	return libbpf_ptr(bpf_object_open(path, NULL, 0, opts)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct bpf_object * | struct bpf_object * | ||||||
| @ -7069,7 +7069,7 @@ bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, | |||||||
| 	if (!obj_buf || obj_buf_sz == 0) | 	if (!obj_buf || obj_buf_sz == 0) | ||||||
| 		return libbpf_err_ptr(-EINVAL); | 		return libbpf_err_ptr(-EINVAL); | ||||||
| 
 | 
 | ||||||
| 	return libbpf_ptr(__bpf_object__open(NULL, obj_buf, obj_buf_sz, opts)); | 	return libbpf_ptr(bpf_object_open(NULL, obj_buf, obj_buf_sz, opts)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct bpf_object * | struct bpf_object * | ||||||
| @ -7086,7 +7086,7 @@ bpf_object__open_buffer(const void *obj_buf, size_t obj_buf_sz, | |||||||
| 	if (!obj_buf || obj_buf_sz == 0) | 	if (!obj_buf || obj_buf_sz == 0) | ||||||
| 		return errno = EINVAL, NULL; | 		return errno = EINVAL, NULL; | ||||||
| 
 | 
 | ||||||
| 	return libbpf_ptr(__bpf_object__open(NULL, obj_buf, obj_buf_sz, &opts)); | 	return libbpf_ptr(bpf_object_open(NULL, obj_buf, obj_buf_sz, &opts)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int bpf_object_unload(struct bpf_object *obj) | static int bpf_object_unload(struct bpf_object *obj) | ||||||
|  | |||||||
| @ -217,14 +217,16 @@ static bool found; | |||||||
| static int libbpf_debug_print(enum libbpf_print_level level, | static int libbpf_debug_print(enum libbpf_print_level level, | ||||||
| 			      const char *format, va_list args) | 			      const char *format, va_list args) | ||||||
| { | { | ||||||
| 	char *log_buf; | 	const char *log_buf; | ||||||
| 
 | 
 | ||||||
| 	if (level != LIBBPF_WARN || | 	if (level != LIBBPF_WARN || | ||||||
| 	    strcmp(format, "libbpf: \n%s\n")) { | 	    !strstr(format, "-- BEGIN PROG LOAD LOG --")) { | ||||||
| 		vprintf(format, args); | 		vprintf(format, args); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/* skip prog_name */ | ||||||
|  | 	va_arg(args, char *); | ||||||
| 	log_buf = va_arg(args, char *); | 	log_buf = va_arg(args, char *); | ||||||
| 	if (!log_buf) | 	if (!log_buf) | ||||||
| 		goto out; | 		goto out; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Andrii Nakryiko
						Andrii Nakryiko