diff options
Diffstat (limited to 'tools/lib/bpf/btf.c')
-rw-r--r-- | tools/lib/bpf/btf.c | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c index 4324eb47d214..46db0a3b5cb7 100644 --- a/tools/lib/bpf/btf.c +++ b/tools/lib/bpf/btf.c | |||
@@ -367,8 +367,6 @@ void btf__free(struct btf *btf) | |||
367 | 367 | ||
368 | struct btf *btf__new(__u8 *data, __u32 size) | 368 | struct btf *btf__new(__u8 *data, __u32 size) |
369 | { | 369 | { |
370 | __u32 log_buf_size = 0; | ||
371 | char *log_buf = NULL; | ||
372 | struct btf *btf; | 370 | struct btf *btf; |
373 | int err; | 371 | int err; |
374 | 372 | ||
@@ -378,15 +376,6 @@ struct btf *btf__new(__u8 *data, __u32 size) | |||
378 | 376 | ||
379 | btf->fd = -1; | 377 | btf->fd = -1; |
380 | 378 | ||
381 | log_buf = malloc(BPF_LOG_BUF_SIZE); | ||
382 | if (!log_buf) { | ||
383 | err = -ENOMEM; | ||
384 | goto done; | ||
385 | } | ||
386 | |||
387 | *log_buf = 0; | ||
388 | log_buf_size = BPF_LOG_BUF_SIZE; | ||
389 | |||
390 | btf->data = malloc(size); | 379 | btf->data = malloc(size); |
391 | if (!btf->data) { | 380 | if (!btf->data) { |
392 | err = -ENOMEM; | 381 | err = -ENOMEM; |
@@ -396,17 +385,6 @@ struct btf *btf__new(__u8 *data, __u32 size) | |||
396 | memcpy(btf->data, data, size); | 385 | memcpy(btf->data, data, size); |
397 | btf->data_size = size; | 386 | btf->data_size = size; |
398 | 387 | ||
399 | btf->fd = bpf_load_btf(btf->data, btf->data_size, | ||
400 | log_buf, log_buf_size, false); | ||
401 | |||
402 | if (btf->fd == -1) { | ||
403 | err = -errno; | ||
404 | pr_warning("Error loading BTF: %s(%d)\n", strerror(errno), errno); | ||
405 | if (log_buf && *log_buf) | ||
406 | pr_warning("%s\n", log_buf); | ||
407 | goto done; | ||
408 | } | ||
409 | |||
410 | err = btf_parse_hdr(btf); | 388 | err = btf_parse_hdr(btf); |
411 | if (err) | 389 | if (err) |
412 | goto done; | 390 | goto done; |
@@ -418,8 +396,6 @@ struct btf *btf__new(__u8 *data, __u32 size) | |||
418 | err = btf_parse_type_sec(btf); | 396 | err = btf_parse_type_sec(btf); |
419 | 397 | ||
420 | done: | 398 | done: |
421 | free(log_buf); | ||
422 | |||
423 | if (err) { | 399 | if (err) { |
424 | btf__free(btf); | 400 | btf__free(btf); |
425 | return ERR_PTR(err); | 401 | return ERR_PTR(err); |
@@ -428,6 +404,36 @@ done: | |||
428 | return btf; | 404 | return btf; |
429 | } | 405 | } |
430 | 406 | ||
407 | int btf__load(struct btf *btf) | ||
408 | { | ||
409 | __u32 log_buf_size = BPF_LOG_BUF_SIZE; | ||
410 | char *log_buf = NULL; | ||
411 | int err = 0; | ||
412 | |||
413 | if (btf->fd >= 0) | ||
414 | return -EEXIST; | ||
415 | |||
416 | log_buf = malloc(log_buf_size); | ||
417 | if (!log_buf) | ||
418 | return -ENOMEM; | ||
419 | |||
420 | *log_buf = 0; | ||
421 | |||
422 | btf->fd = bpf_load_btf(btf->data, btf->data_size, | ||
423 | log_buf, log_buf_size, false); | ||
424 | if (btf->fd < 0) { | ||
425 | err = -errno; | ||
426 | pr_warning("Error loading BTF: %s(%d)\n", strerror(errno), errno); | ||
427 | if (*log_buf) | ||
428 | pr_warning("%s\n", log_buf); | ||
429 | goto done; | ||
430 | } | ||
431 | |||
432 | done: | ||
433 | free(log_buf); | ||
434 | return err; | ||
435 | } | ||
436 | |||
431 | int btf__fd(const struct btf *btf) | 437 | int btf__fd(const struct btf *btf) |
432 | { | 438 | { |
433 | return btf->fd; | 439 | return btf->fd; |