diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2020-10-15 20:37:01 +0200 | 
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2020-10-15 20:37:01 +0200 | 
| commit | 62b31a045757eac81fed94b19df47418a0818528 (patch) | |
| tree | 285fda56df8304dff6ba929bad65ddfb4e4fd726 /tools/lib/bpf/libbpf.c | |
| parent | cc51d171776f3a6acb6828bad0b780a4cacf5423 (diff) | |
| parent | c27e08820bc6cb7d483a8d87589bdbbbf10f2306 (diff) | |
Merge branch 'for-5.10/core' into for-linus
- nonblocking read semantics fix for hid-debug
Diffstat (limited to 'tools/lib/bpf/libbpf.c')
| -rw-r--r-- | tools/lib/bpf/libbpf.c | 40 | 
1 files changed, 24 insertions, 16 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 7be04e45d29c..0ad0b0491e1f 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -2264,7 +2264,7 @@ static int bpf_object__init_user_btf_maps(struct bpf_object *obj, bool strict,  		data = elf_getdata(scn, NULL);  	if (!scn || !data) {  		pr_warn("failed to get Elf_Data from map section %d (%s)\n", -			obj->efile.maps_shndx, MAPS_ELF_SEC); +			obj->efile.btf_maps_shndx, MAPS_ELF_SEC);  		return -EINVAL;  	} @@ -2434,6 +2434,8 @@ static int bpf_object__init_btf(struct bpf_object *obj,  				BTF_ELF_SEC, err);  			goto out;  		} +		/* enforce 8-byte pointers for BPF-targeted BTFs */ +		btf__set_pointer_size(obj->btf, 8);  		err = 0;  	}  	if (btf_ext_data) { @@ -2542,6 +2544,8 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)  		if (IS_ERR(kern_btf))  			return PTR_ERR(kern_btf); +		/* enforce 8-byte pointers for BPF-targeted BTFs */ +		btf__set_pointer_size(obj->btf, 8);  		bpf_object__sanitize_btf(obj, kern_btf);  	} @@ -3478,10 +3482,11 @@ bpf_object__probe_global_data(struct bpf_object *obj)  	map = bpf_create_map_xattr(&map_attr);  	if (map < 0) { -		cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); +		ret = -errno; +		cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg));  		pr_warn("Error in %s():%s(%d). Couldn't create simple array map.\n", -			__func__, cp, errno); -		return -errno; +			__func__, cp, -ret); +		return ret;  	}  	insns[0].imm = map; @@ -5194,7 +5199,8 @@ static int bpf_object__collect_st_ops_relos(struct bpf_object *obj,  static int bpf_object__collect_map_relos(struct bpf_object *obj,  					 GElf_Shdr *shdr, Elf_Data *data)  { -	int i, j, nrels, new_sz, ptr_sz = sizeof(void *); +	const int bpf_ptr_sz = 8, host_ptr_sz = sizeof(void *); +	int i, j, nrels, new_sz;  	const struct btf_var_secinfo *vi = NULL;  	const struct btf_type *sec, *var, *def;  	const struct btf_member *member; @@ -5243,7 +5249,7 @@ static int bpf_object__collect_map_relos(struct bpf_object *obj,  			vi = btf_var_secinfos(sec) + map->btf_var_idx;  			if (vi->offset <= rel.r_offset && -			    rel.r_offset + sizeof(void *) <= vi->offset + vi->size) +			    rel.r_offset + bpf_ptr_sz <= vi->offset + vi->size)  				break;  		}  		if (j == obj->nr_maps) { @@ -5279,17 +5285,20 @@ static int bpf_object__collect_map_relos(struct bpf_object *obj,  			return -EINVAL;  		moff = rel.r_offset - vi->offset - moff; -		if (moff % ptr_sz) +		/* here we use BPF pointer size, which is always 64 bit, as we +		 * are parsing ELF that was built for BPF target +		 */ +		if (moff % bpf_ptr_sz)  			return -EINVAL; -		moff /= ptr_sz; +		moff /= bpf_ptr_sz;  		if (moff >= map->init_slots_sz) {  			new_sz = moff + 1; -			tmp = realloc(map->init_slots, new_sz * ptr_sz); +			tmp = realloc(map->init_slots, new_sz * host_ptr_sz);  			if (!tmp)  				return -ENOMEM;  			map->init_slots = tmp;  			memset(map->init_slots + map->init_slots_sz, 0, -			       (new_sz - map->init_slots_sz) * ptr_sz); +			       (new_sz - map->init_slots_sz) * host_ptr_sz);  			map->init_slots_sz = new_sz;  		}  		map->init_slots[moff] = targ_map; @@ -6012,9 +6021,10 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path,  	}  	if (bpf_obj_pin(prog->instances.fds[instance], path)) { -		cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); +		err = -errno; +		cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));  		pr_warn("failed to pin program: %s\n", cp); -		return -errno; +		return err;  	}  	pr_debug("pinned program '%s'\n", path); @@ -8306,10 +8316,8 @@ bpf_program__attach_iter(struct bpf_program *prog,  	if (!OPTS_VALID(opts, bpf_iter_attach_opts))  		return ERR_PTR(-EINVAL); -	if (OPTS_HAS(opts, map_fd)) { -		target_fd = opts->map_fd; -		link_create_opts.flags = BPF_ITER_LINK_MAP_FD; -	} +	link_create_opts.iter_info = OPTS_GET(opts, link_info, (void *)0); +	link_create_opts.iter_info_len = OPTS_GET(opts, link_info_len, 0);  	prog_fd = bpf_program__fd(prog);  	if (prog_fd < 0) {  | 
