|
@@ -1379,6 +1379,59 @@ int bpf_map__pin(struct bpf_map *map, const char *path)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int bpf_object__pin(struct bpf_object *obj, const char *path)
|
|
|
+{
|
|
|
+ struct bpf_program *prog;
|
|
|
+ struct bpf_map *map;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ if (!obj)
|
|
|
+ return -ENOENT;
|
|
|
+
|
|
|
+ if (!obj->loaded) {
|
|
|
+ pr_warning("object not yet loaded; load it first\n");
|
|
|
+ return -ENOENT;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = make_dir(path);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ bpf_map__for_each(map, obj) {
|
|
|
+ char buf[PATH_MAX];
|
|
|
+ int len;
|
|
|
+
|
|
|
+ len = snprintf(buf, PATH_MAX, "%s/%s", path,
|
|
|
+ bpf_map__name(map));
|
|
|
+ if (len < 0)
|
|
|
+ return -EINVAL;
|
|
|
+ else if (len >= PATH_MAX)
|
|
|
+ return -ENAMETOOLONG;
|
|
|
+
|
|
|
+ err = bpf_map__pin(map, buf);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ bpf_object__for_each_program(prog, obj) {
|
|
|
+ char buf[PATH_MAX];
|
|
|
+ int len;
|
|
|
+
|
|
|
+ len = snprintf(buf, PATH_MAX, "%s/%s", path,
|
|
|
+ prog->section_name);
|
|
|
+ if (len < 0)
|
|
|
+ return -EINVAL;
|
|
|
+ else if (len >= PATH_MAX)
|
|
|
+ return -ENAMETOOLONG;
|
|
|
+
|
|
|
+ err = bpf_program__pin(prog, buf);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
void bpf_object__close(struct bpf_object *obj)
|
|
|
{
|
|
|
size_t i;
|