Re: [PATCH bpf-next 1/3] libbpf: Store map pin path in struct bpf_map
From: Toke Høiland-Jørgensen <hidden>
Date: 2019-10-22 19:06:36
Also in:
bpf
Andrii Nakryiko [off-list ref] writes:
On Tue, Oct 22, 2019 at 11:45 AM Toke Høiland-Jørgensen [off-list ref] wrote:quoted
Andrii Nakryiko [off-list ref] writes:quoted
On Tue, Oct 22, 2019 at 11:13 AM Toke Høiland-Jørgensen [off-list ref] wrote:quoted
Andrii Nakryiko [off-list ref] writes:quoted
On Tue, Oct 22, 2019 at 9:08 AM Toke Høiland-Jørgensen [off-list ref] wrote:quoted
From: Toke Høiland-Jørgensen <redacted> 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 <redacted> --- 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 :)quoted
quoted
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.quoted
quoted
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