|
@@ -1535,7 +1535,7 @@ int bpf__apply_obj_config(void)
|
|
|
(strcmp(name, \
|
|
|
bpf_map__name(pos)) == 0))
|
|
|
|
|
|
-int bpf__setup_output_event(struct perf_evlist *evlist, const char *name)
|
|
|
+struct perf_evsel *bpf__setup_output_event(struct perf_evlist *evlist, const char *name)
|
|
|
{
|
|
|
struct bpf_map_priv *tmpl_priv = NULL;
|
|
|
struct bpf_object *obj, *tmp;
|
|
@@ -1548,7 +1548,7 @@ int bpf__setup_output_event(struct perf_evlist *evlist, const char *name)
|
|
|
struct bpf_map_priv *priv = bpf_map__priv(map);
|
|
|
|
|
|
if (IS_ERR(priv))
|
|
|
- return -BPF_LOADER_ERRNO__INTERNAL;
|
|
|
+ return ERR_PTR(-BPF_LOADER_ERRNO__INTERNAL);
|
|
|
|
|
|
/*
|
|
|
* No need to check map type: type should have been
|
|
@@ -1561,20 +1561,20 @@ int bpf__setup_output_event(struct perf_evlist *evlist, const char *name)
|
|
|
}
|
|
|
|
|
|
if (!need_init)
|
|
|
- return 0;
|
|
|
+ return NULL;
|
|
|
|
|
|
if (!tmpl_priv) {
|
|
|
char *event_definition = NULL;
|
|
|
|
|
|
if (asprintf(&event_definition, "bpf-output/no-inherit=1,name=%s/", name) < 0)
|
|
|
- return -ENOMEM;
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
err = parse_events(evlist, event_definition, NULL);
|
|
|
free(event_definition);
|
|
|
|
|
|
if (err) {
|
|
|
pr_debug("ERROR: failed to create the \"%s\" bpf-output event\n", name);
|
|
|
- return -err;
|
|
|
+ return ERR_PTR(-err);
|
|
|
}
|
|
|
|
|
|
evsel = perf_evlist__last(evlist);
|
|
@@ -1584,37 +1584,38 @@ int bpf__setup_output_event(struct perf_evlist *evlist, const char *name)
|
|
|
struct bpf_map_priv *priv = bpf_map__priv(map);
|
|
|
|
|
|
if (IS_ERR(priv))
|
|
|
- return -BPF_LOADER_ERRNO__INTERNAL;
|
|
|
+ return ERR_PTR(-BPF_LOADER_ERRNO__INTERNAL);
|
|
|
if (priv)
|
|
|
continue;
|
|
|
|
|
|
if (tmpl_priv) {
|
|
|
priv = bpf_map_priv__clone(tmpl_priv);
|
|
|
if (!priv)
|
|
|
- return -ENOMEM;
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
err = bpf_map__set_priv(map, priv, bpf_map_priv__clear);
|
|
|
if (err) {
|
|
|
bpf_map_priv__clear(map, priv);
|
|
|
- return err;
|
|
|
+ return ERR_PTR(err);
|
|
|
}
|
|
|
} else if (evsel) {
|
|
|
struct bpf_map_op *op;
|
|
|
|
|
|
op = bpf_map__add_newop(map, NULL);
|
|
|
if (IS_ERR(op))
|
|
|
- return PTR_ERR(op);
|
|
|
+ return ERR_PTR(PTR_ERR(op));
|
|
|
op->op_type = BPF_MAP_OP_SET_EVSEL;
|
|
|
op->v.evsel = evsel;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
+ return evsel;
|
|
|
}
|
|
|
|
|
|
int bpf__setup_stdout(struct perf_evlist *evlist)
|
|
|
{
|
|
|
- return bpf__setup_output_event(evlist, "__bpf_stdout__");
|
|
|
+ struct perf_evsel *evsel = bpf__setup_output_event(evlist, "__bpf_stdout__");
|
|
|
+ return IS_ERR(evsel) ? PTR_ERR(evsel) : 0;
|
|
|
}
|
|
|
|
|
|
#define ERRNO_OFFSET(e) ((e) - __BPF_LOADER_ERRNO__START)
|