aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/lib/bpf/libbpf.c5
-rw-r--r--tools/lib/bpf/libbpf.h3
-rw-r--r--tools/perf/util/bpf-loader.c27
3 files changed, 15 insertions, 20 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 0412182fb365..7eb7fb26e999 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -1230,10 +1230,9 @@ int bpf_program__set_private(struct bpf_program *prog,
1230 return 0; 1230 return 0;
1231} 1231}
1232 1232
1233int bpf_program__get_private(struct bpf_program *prog, void **ppriv) 1233void *bpf_program__priv(struct bpf_program *prog)
1234{ 1234{
1235 *ppriv = prog->priv; 1235 return prog ? prog->priv : ERR_PTR(-EINVAL);
1236 return 0;
1237} 1236}
1238 1237
1239const char *bpf_program__title(struct bpf_program *prog, bool needs_copy) 1238const char *bpf_program__title(struct bpf_program *prog, bool needs_copy)
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
index ea65775e8302..372cecbde207 100644
--- a/tools/lib/bpf/libbpf.h
+++ b/tools/lib/bpf/libbpf.h
@@ -81,8 +81,7 @@ typedef void (*bpf_program_clear_priv_t)(struct bpf_program *,
81int bpf_program__set_private(struct bpf_program *prog, void *priv, 81int bpf_program__set_private(struct bpf_program *prog, void *priv,
82 bpf_program_clear_priv_t clear_priv); 82 bpf_program_clear_priv_t clear_priv);
83 83
84int bpf_program__get_private(struct bpf_program *prog, 84void *bpf_program__priv(struct bpf_program *prog);
85 void **ppriv);
86 85
87const char *bpf_program__title(struct bpf_program *prog, bool needs_copy); 86const char *bpf_program__title(struct bpf_program *prog, bool needs_copy);
88 87
diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index c19010e6cefb..1907d5313960 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -380,15 +380,14 @@ preproc_gen_prologue(struct bpf_program *prog, int n,
380 struct bpf_insn *orig_insns, int orig_insns_cnt, 380 struct bpf_insn *orig_insns, int orig_insns_cnt,
381 struct bpf_prog_prep_result *res) 381 struct bpf_prog_prep_result *res)
382{ 382{
383 struct bpf_prog_priv *priv = bpf_program__priv(prog);
383 struct probe_trace_event *tev; 384 struct probe_trace_event *tev;
384 struct perf_probe_event *pev; 385 struct perf_probe_event *pev;
385 struct bpf_prog_priv *priv;
386 struct bpf_insn *buf; 386 struct bpf_insn *buf;
387 size_t prologue_cnt = 0; 387 size_t prologue_cnt = 0;
388 int i, err; 388 int i, err;
389 389
390 err = bpf_program__get_private(prog, (void **)&priv); 390 if (IS_ERR(priv) || !priv)
391 if (err || !priv)
392 goto errout; 391 goto errout;
393 392
394 pev = &priv->pev; 393 pev = &priv->pev;
@@ -535,13 +534,12 @@ static int map_prologue(struct perf_probe_event *pev, int *mapping,
535 534
536static int hook_load_preprocessor(struct bpf_program *prog) 535static int hook_load_preprocessor(struct bpf_program *prog)
537{ 536{
537 struct bpf_prog_priv *priv = bpf_program__priv(prog);
538 struct perf_probe_event *pev; 538 struct perf_probe_event *pev;
539 struct bpf_prog_priv *priv;
540 bool need_prologue = false; 539 bool need_prologue = false;
541 int err, i; 540 int err, i;
542 541
543 err = bpf_program__get_private(prog, (void **)&priv); 542 if (IS_ERR(priv) || !priv) {
544 if (err || !priv) {
545 pr_debug("Internal error when hook preprocessor\n"); 543 pr_debug("Internal error when hook preprocessor\n");
546 return -BPF_LOADER_ERRNO__INTERNAL; 544 return -BPF_LOADER_ERRNO__INTERNAL;
547 } 545 }
@@ -607,9 +605,11 @@ int bpf__probe(struct bpf_object *obj)
607 if (err) 605 if (err)
608 goto out; 606 goto out;
609 607
610 err = bpf_program__get_private(prog, (void **)&priv); 608 priv = bpf_program__priv(prog);
611 if (err || !priv) 609 if (IS_ERR(priv) || !priv) {
610 err = PTR_ERR(priv);
612 goto out; 611 goto out;
612 }
613 pev = &priv->pev; 613 pev = &priv->pev;
614 614
615 err = convert_perf_probe_events(pev, 1); 615 err = convert_perf_probe_events(pev, 1);
@@ -645,13 +645,12 @@ int bpf__unprobe(struct bpf_object *obj)
645{ 645{
646 int err, ret = 0; 646 int err, ret = 0;
647 struct bpf_program *prog; 647 struct bpf_program *prog;
648 struct bpf_prog_priv *priv;
649 648
650 bpf_object__for_each_program(prog, obj) { 649 bpf_object__for_each_program(prog, obj) {
650 struct bpf_prog_priv *priv = bpf_program__priv(prog);
651 int i; 651 int i;
652 652
653 err = bpf_program__get_private(prog, (void **)&priv); 653 if (IS_ERR(priv) || !priv)
654 if (err || !priv)
655 continue; 654 continue;
656 655
657 for (i = 0; i < priv->pev.ntevs; i++) { 656 for (i = 0; i < priv->pev.ntevs; i++) {
@@ -702,14 +701,12 @@ int bpf__foreach_tev(struct bpf_object *obj,
702 int err; 701 int err;
703 702
704 bpf_object__for_each_program(prog, obj) { 703 bpf_object__for_each_program(prog, obj) {
704 struct bpf_prog_priv *priv = bpf_program__priv(prog);
705 struct probe_trace_event *tev; 705 struct probe_trace_event *tev;
706 struct perf_probe_event *pev; 706 struct perf_probe_event *pev;
707 struct bpf_prog_priv *priv;
708 int i, fd; 707 int i, fd;
709 708
710 err = bpf_program__get_private(prog, 709 if (IS_ERR(priv) || !priv) {
711 (void **)&priv);
712 if (err || !priv) {
713 pr_debug("bpf: failed to get private field\n"); 710 pr_debug("bpf: failed to get private field\n");
714 return -BPF_LOADER_ERRNO__INTERNAL; 711 return -BPF_LOADER_ERRNO__INTERNAL;
715 } 712 }