|
@@ -672,17 +672,63 @@ errout:
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int
|
|
|
|
+parse_events_config_bpf(struct parse_events_evlist *data,
|
|
|
|
+ struct bpf_object *obj,
|
|
|
|
+ struct list_head *head_config)
|
|
|
|
+{
|
|
|
|
+ struct parse_events_term *term;
|
|
|
|
+ int error_pos;
|
|
|
|
+
|
|
|
|
+ if (!head_config || list_empty(head_config))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ list_for_each_entry(term, head_config, list) {
|
|
|
|
+ char errbuf[BUFSIZ];
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ if (term->type_term != PARSE_EVENTS__TERM_TYPE_USER) {
|
|
|
|
+ snprintf(errbuf, sizeof(errbuf),
|
|
|
|
+ "Invalid config term for BPF object");
|
|
|
|
+ errbuf[BUFSIZ - 1] = '\0';
|
|
|
|
+
|
|
|
|
+ data->error->idx = term->err_term;
|
|
|
|
+ data->error->str = strdup(errbuf);
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = bpf__config_obj(obj, term, NULL, &error_pos);
|
|
|
|
+ if (err) {
|
|
|
|
+ bpf__strerror_config_obj(obj, term, NULL,
|
|
|
|
+ &error_pos, err, errbuf,
|
|
|
|
+ sizeof(errbuf));
|
|
|
|
+ data->error->help = strdup(
|
|
|
|
+"Hint:\tValid config term:\n"
|
|
|
|
+" \tmap:[<arraymap>].value=[value]\n"
|
|
|
|
+" \t(add -v to see detail)");
|
|
|
|
+ data->error->str = strdup(errbuf);
|
|
|
|
+ if (err == -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE)
|
|
|
|
+ data->error->idx = term->err_val;
|
|
|
|
+ else
|
|
|
|
+ data->error->idx = term->err_term + error_pos;
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
int parse_events_load_bpf(struct parse_events_evlist *data,
|
|
int parse_events_load_bpf(struct parse_events_evlist *data,
|
|
struct list_head *list,
|
|
struct list_head *list,
|
|
char *bpf_file_name,
|
|
char *bpf_file_name,
|
|
- bool source)
|
|
|
|
|
|
+ bool source,
|
|
|
|
+ struct list_head *head_config)
|
|
{
|
|
{
|
|
struct bpf_object *obj;
|
|
struct bpf_object *obj;
|
|
|
|
+ int err;
|
|
|
|
|
|
obj = bpf__prepare_load(bpf_file_name, source);
|
|
obj = bpf__prepare_load(bpf_file_name, source);
|
|
if (IS_ERR(obj)) {
|
|
if (IS_ERR(obj)) {
|
|
char errbuf[BUFSIZ];
|
|
char errbuf[BUFSIZ];
|
|
- int err;
|
|
|
|
|
|
|
|
err = PTR_ERR(obj);
|
|
err = PTR_ERR(obj);
|
|
|
|
|
|
@@ -700,7 +746,10 @@ int parse_events_load_bpf(struct parse_events_evlist *data,
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
- return parse_events_load_bpf_obj(data, list, obj);
|
|
|
|
|
|
+ err = parse_events_load_bpf_obj(data, list, obj);
|
|
|
|
+ if (err)
|
|
|
|
+ return err;
|
|
|
|
+ return parse_events_config_bpf(data, obj, head_config);
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
static int
|