Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> writes: > 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? See my other comment about programs exiting. For an example, see the XDP tutorial (just pretend for a moment that that TODO comment was actually there :)): https://github.com/xdp-project/xdp-tutorial/blob/master/basic04-pinning-maps/xdp_loader.c#L135 -Toke