From: Toke Høiland-Jørgensen <toke@xxxxxxxxxx> When pinning a map, store the pin path in struct bpf_map so it can be re-used later for un-pinning. This simplifies the later addition of per-map pin paths. Signed-off-by: Toke Høiland-Jørgensen <toke@xxxxxxxxxx> --- tools/lib/bpf/libbpf.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index cccfd9355134..b4fdd8ee3bbd 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -226,6 +226,7 @@ struct bpf_map { void *priv; bpf_map_clear_priv_t clear_priv; enum libbpf_map_type libbpf_type; + char *pin_path; }; struct bpf_secdata { @@ -1929,6 +1930,7 @@ int bpf_map__reuse_fd(struct bpf_map *map, int fd) if (err) goto err_close_new_fd; free(map->name); + zfree(&map->pin_path); map->fd = new_fd; map->name = new_name; @@ -4022,6 +4024,7 @@ int bpf_map__pin(struct bpf_map *map, const char *path) return -errno; } + map->pin_path = strdup(path); pr_debug("pinned map '%s'\n", path); return 0; @@ -4031,6 +4034,9 @@ int bpf_map__unpin(struct bpf_map *map, const char *path) { int err; + if (!path) + path = map->pin_path; + err = check_path(path); if (err) return err; @@ -4044,6 +4050,7 @@ int bpf_map__unpin(struct bpf_map *map, const char *path) if (err != 0) return -errno; pr_debug("unpinned map '%s'\n", path); + zfree(&map->pin_path); return 0; } @@ -4088,17 +4095,10 @@ int bpf_object__pin_maps(struct bpf_object *obj, const char *path) err_unpin_maps: while ((map = bpf_map__prev(map, obj))) { - char buf[PATH_MAX]; - int len; - - len = snprintf(buf, PATH_MAX, "%s/%s", path, - bpf_map__name(map)); - if (len < 0) - continue; - else if (len >= PATH_MAX) + if (!map->pin_path) continue; - bpf_map__unpin(map, buf); + bpf_map__unpin(map, NULL); } return err; @@ -4248,6 +4248,7 @@ void bpf_object__close(struct bpf_object *obj) for (i = 0; i < obj->nr_maps; i++) { zfree(&obj->maps[i].name); + zfree(&obj->maps[i].pin_path); if (obj->maps[i].clear_priv) obj->maps[i].clear_priv(&obj->maps[i], obj->maps[i].priv);