Message ID | 1683342439-3677-1-git-send-email-yangpc@wangsu.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 2a36c26fe3b8e2cf39e15e80ba1abc889a75da4f |
Delegated to: | BPF |
Headers | show |
Series | [v2,bpf-next] bpftool: Support bpffs mountpoint as pin path for prog loadall | expand |
2023-05-06 11:07 UTC+0800 ~ Pengcheng Yang <yangpc@wangsu.com> > Currently, when using prog loadall, if the pin path is a bpffs > mountpoint, bpffs will be repeatedly mounted to the parent directory > of the bpffs mountpoint path. > > For example, > $ bpftool prog loadall test.o /sys/fs/bpf > currently bpffs will be repeatedly mounted to /sys/fs. > > Signed-off-by: Pengcheng Yang <yangpc@wangsu.com> Reviewed-by: Quentin Monnet <quentin@isovalent.com> Thanks!
Hello: This patch was applied to bpf/bpf-next.git (master) by Daniel Borkmann <daniel@iogearbox.net>: On Sat, 6 May 2023 11:07:19 +0800 you wrote: > Currently, when using prog loadall, if the pin path is a bpffs > mountpoint, bpffs will be repeatedly mounted to the parent directory > of the bpffs mountpoint path. > > For example, > $ bpftool prog loadall test.o /sys/fs/bpf > currently bpffs will be repeatedly mounted to /sys/fs. > > [...] Here is the summary with links: - [v2,bpf-next] bpftool: Support bpffs mountpoint as pin path for prog loadall https://git.kernel.org/bpf/bpf-next/c/2a36c26fe3b8 You are awesome, thank you!
diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index 1360c82ae732..cc6e6aae2447 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -68,7 +68,7 @@ void p_info(const char *fmt, ...) va_end(ap); } -static bool is_bpffs(char *path) +static bool is_bpffs(const char *path) { struct statfs st_fs; @@ -244,13 +244,16 @@ int open_obj_pinned_any(const char *path, enum bpf_obj_type exp_type) return fd; } -int mount_bpffs_for_pin(const char *name) +int mount_bpffs_for_pin(const char *name, bool is_dir) { char err_str[ERR_MAX_LEN]; char *file; char *dir; int err = 0; + if (is_dir && is_bpffs(name)) + return err; + file = malloc(strlen(name) + 1); if (!file) { p_err("mem alloc failed"); @@ -286,7 +289,7 @@ int do_pin_fd(int fd, const char *name) { int err; - err = mount_bpffs_for_pin(name); + err = mount_bpffs_for_pin(name, false); if (err) return err; diff --git a/tools/bpf/bpftool/iter.c b/tools/bpf/bpftool/iter.c index 9a1d2365a297..6b0e5202ca7a 100644 --- a/tools/bpf/bpftool/iter.c +++ b/tools/bpf/bpftool/iter.c @@ -76,7 +76,7 @@ static int do_pin(int argc, char **argv) goto close_obj; } - err = mount_bpffs_for_pin(path); + err = mount_bpffs_for_pin(path, false); if (err) goto close_link; diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h index a49534d7eafa..b8bb08d10dec 100644 --- a/tools/bpf/bpftool/main.h +++ b/tools/bpf/bpftool/main.h @@ -142,7 +142,7 @@ const char *get_fd_type_name(enum bpf_obj_type type); char *get_fdinfo(int fd, const char *key); int open_obj_pinned(const char *path, bool quiet); int open_obj_pinned_any(const char *path, enum bpf_obj_type exp_type); -int mount_bpffs_for_pin(const char *name); +int mount_bpffs_for_pin(const char *name, bool is_dir); int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(int *, char ***)); int do_pin_fd(int fd, const char *name); diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index 91b6075b2db3..1f736dc29824 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -1739,7 +1739,7 @@ static int load_with_options(int argc, char **argv, bool first_prog_only) goto err_close_obj; } - err = mount_bpffs_for_pin(pinfile); + err = mount_bpffs_for_pin(pinfile, !first_prog_only); if (err) goto err_close_obj; diff --git a/tools/bpf/bpftool/struct_ops.c b/tools/bpf/bpftool/struct_ops.c index 57c3da70aa31..3ebc9fe91e0e 100644 --- a/tools/bpf/bpftool/struct_ops.c +++ b/tools/bpf/bpftool/struct_ops.c @@ -509,7 +509,7 @@ static int do_register(int argc, char **argv) if (argc == 1) linkdir = GET_ARG(); - if (linkdir && mount_bpffs_for_pin(linkdir)) { + if (linkdir && mount_bpffs_for_pin(linkdir, true)) { p_err("can't mount bpffs for pinning"); return -1; }
Currently, when using prog loadall, if the pin path is a bpffs mountpoint, bpffs will be repeatedly mounted to the parent directory of the bpffs mountpoint path. For example, $ bpftool prog loadall test.o /sys/fs/bpf currently bpffs will be repeatedly mounted to /sys/fs. Signed-off-by: Pengcheng Yang <yangpc@wangsu.com> --- v2: compatible with commit 0232b7889786 ("bpftool: Register struct_ops with a link.") tools/bpf/bpftool/common.c | 9 ++++++--- tools/bpf/bpftool/iter.c | 2 +- tools/bpf/bpftool/main.h | 2 +- tools/bpf/bpftool/prog.c | 2 +- tools/bpf/bpftool/struct_ops.c | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-)