Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> writes: > On Tue, Oct 22, 2019 at 9:08 AM Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: >> >> 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); >> > > While you are touching this function, can you please also fix error > handling in it? We should store -errno locally on error, before we > call close() which might change errno. Didn't actually look much at the surrounding function, TBH. I do expect that I will need to go poke into this for the follow-on "automatic reuse of pinned maps" series anyway. But sure, I can do a bit of cleanup in a standalone patch first :) >> 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); > > if (!map->pin_path) { > err = -errno; > goto err_close_new_fd; > } Right. >> 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; > > This semantics is kind of weird. Given we now remember pin_path, > should we instead check that user-provided path is actually correct > and matches what we stored? Alternatively, bpf_map__unpin() w/o path > argument looks like a cleaner API. Yeah, I guess the function without a path argument would make the most sense. However, we can't really change the API of bpf_map__unpin() (unless you're proposing a symbol-versioned new version?). Dunno if it's worth it to include a new, somewhat oddly-named, function to achieve this? For the internal libbpf uses at least it's easy enough for the caller to just go bpf_map__unpin(map, map->pin_path), so I could also just drop this change? WDYT? -Toke