diff options
Diffstat (limited to 'tools/lib/bpf/btf.c')
| -rw-r--r-- | tools/lib/bpf/btf.c | 20 | 
1 files changed, 15 insertions, 5 deletions
diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c index 3d1c25fc97ae..bfef3d606b54 100644 --- a/tools/lib/bpf/btf.c +++ b/tools/lib/bpf/btf.c @@ -657,22 +657,32 @@ int btf__finalize_data(struct bpf_object *obj, struct btf *btf)  int btf__load(struct btf *btf)  { -	__u32 log_buf_size = BPF_LOG_BUF_SIZE; +	__u32 log_buf_size = 0;  	char *log_buf = NULL;  	int err = 0;  	if (btf->fd >= 0)  		return -EEXIST; -	log_buf = malloc(log_buf_size); -	if (!log_buf) -		return -ENOMEM; +retry_load: +	if (log_buf_size) { +		log_buf = malloc(log_buf_size); +		if (!log_buf) +			return -ENOMEM; -	*log_buf = 0; +		*log_buf = 0; +	}  	btf->fd = bpf_load_btf(btf->data, btf->data_size,  			       log_buf, log_buf_size, false);  	if (btf->fd < 0) { +		if (!log_buf || errno == ENOSPC) { +			log_buf_size = max((__u32)BPF_LOG_BUF_SIZE, +					   log_buf_size << 1); +			free(log_buf); +			goto retry_load; +		} +  		err = -errno;  		pr_warn("Error loading BTF: %s(%d)\n", strerror(errno), errno);  		if (*log_buf)  |