On Tue, Oct 22, 2019 at 11:45 AM Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: > > 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)) can we unpin not pinned map? sounds like an error condition? so: if (!map->pin_path) return -EWHATAREYOUDOING; if (path && strcmp(path, map->pin_path)) return -EHUH; path = map->pin_path; /* or just use map->ping_path explicitly */ ... proceed ... > 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