Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> writes: > On Tue, Oct 22, 2019 at 11:13 AM Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: >> >> 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? > > I'd probably do strcmp(map->pin_path, path), if path is specified. > This will support existing use cases, will allow NULL if we don't want > to bother remembering pin_path, will prevent weird use case of pinning > to one path, but unpinning another one. So something like if (path && map->pin_path && strcmp(path, map->pin_path)) return -EINVAL else if (!path) path = map->pin_path; ? > Ideally, all this pinning will just be done declaratively and will > happen automatically, so users won't even have to know about this API > :) Yeah, that's where I'm hoping to get to. But, well, the pin/unpin functions already exist so we do need to keep them working... -Toke