Lines Matching +full:can +full:- +full:fd
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2 /* Copyright (C) 2017-2018 Netronome Systems, Inc. */
81 /* Probe whether kernel switched from memlock-based (RLIMIT_MEMLOCK) to
82 * memcg-based memory accounting for BPF maps and programs. This was done in
83 * commit 97306be45fbe ("Merge branch 'switch to memcg-based memory
86 * Libbpf also offers to probe for memcg-based accounting vs rlimit, but does
90 * Instead, we can probe by lowering the process-based rlimit to 0, trying to
92 * memcg-based accounting is supported.
96 * that bpftool is single-threaded, this is fine to do here.
158 "mount --make-private %s failed: %s", in mnt_fs()
160 return -1; in mnt_fs()
165 "mount --bind %s %s failed: %s", in mnt_fs()
167 return -1; in mnt_fs()
174 snprintf(buff, bufflen, "mount -t %s %s %s failed: %s", in mnt_fs()
176 return -1; in mnt_fs()
189 err_str[ERR_MAX_LEN - 1] = '\0'; in mount_tracefs()
190 p_err("can't mount tracefs: %s", err_str); in mount_tracefs()
199 int fd = -1; in open_obj_pinned() local
208 fd = bpf_obj_get(pname); in open_obj_pinned()
209 if (fd < 0) { in open_obj_pinned()
221 return fd; in open_obj_pinned()
227 int fd; in open_obj_pinned_any() local
229 fd = open_obj_pinned(path, false); in open_obj_pinned_any()
230 if (fd < 0) in open_obj_pinned_any()
231 return -1; in open_obj_pinned_any()
233 type = get_fd_type(fd); in open_obj_pinned_any()
235 close(fd); in open_obj_pinned_any()
240 close(fd); in open_obj_pinned_any()
241 return -1; in open_obj_pinned_any()
244 return fd; in open_obj_pinned_any()
265 return -1; in create_and_mount_bpffs_dir()
276 if (access(parent_name, F_OK) == -1) { in create_and_mount_bpffs_dir()
277 p_err("can't create dir '%s' to pin BPF object: parent dir '%s' doesn't exist", in create_and_mount_bpffs_dir()
280 return -1; in create_and_mount_bpffs_dir()
287 p_err("no BPF file system found, not mounting it due to --nomount option"); in create_and_mount_bpffs_dir()
288 return -1; in create_and_mount_bpffs_dir()
301 err_str[ERR_MAX_LEN - 1] = '\0'; in create_and_mount_bpffs_dir()
302 p_err("can't mount BPF file system on given dir '%s': %s", in create_and_mount_bpffs_dir()
319 if (access(file_name, F_OK) != -1) { in mount_bpffs_for_file()
320 p_err("can't pin BPF object: path '%s' already exists", file_name); in mount_bpffs_for_file()
321 return -1; in mount_bpffs_for_file()
327 return -1; in mount_bpffs_for_file()
336 if (access(dir, F_OK) == -1) { in mount_bpffs_for_file()
337 p_err("can't pin BPF object: dir '%s' doesn't exist", dir); in mount_bpffs_for_file()
338 err = -1; in mount_bpffs_for_file()
343 p_err("no BPF file system found, not mounting it due to --nomount option"); in mount_bpffs_for_file()
344 err = -1; in mount_bpffs_for_file()
350 err_str[ERR_MAX_LEN - 1] = '\0'; in mount_bpffs_for_file()
351 p_err("can't mount BPF file system to pin the object '%s': %s", in mount_bpffs_for_file()
360 int do_pin_fd(int fd, const char *name) in do_pin_fd() argument
368 err = bpf_obj_pin(fd, name); in do_pin_fd()
370 p_err("can't pin the object (%s): %s", name, strerror(errno)); in do_pin_fd()
378 int fd; in do_pin_any() local
381 return -EINVAL; in do_pin_any()
383 fd = get_fd(&argc, &argv); in do_pin_any()
384 if (fd < 0) in do_pin_any()
385 return fd; in do_pin_any()
387 err = do_pin_fd(fd, *argv); in do_pin_any()
389 close(fd); in do_pin_any()
411 const char *prog_name = prog_info->name; in get_prog_full_name()
419 strlen(prog_info->name) < BPF_OBJ_NAME_LEN - 1) in get_prog_full_name()
422 if (!prog_info->btf_id || prog_info->nr_func_info == 0) in get_prog_full_name()
426 info.func_info_rec_size = prog_info->func_info_rec_size; in get_prog_full_name()
442 prog_name = btf__name_by_offset(prog_btf, func_type->name_off); in get_prog_full_name()
451 int get_fd_type(int fd) in get_fd_type() argument
457 snprintf(path, sizeof(path), "/proc/self/fd/%d", fd); in get_fd_type()
461 p_err("can't read link type: %s", strerror(errno)); in get_fd_type()
462 return -1; in get_fd_type()
465 p_err("can't read link type: path too long!"); in get_fd_type()
466 return -1; in get_fd_type()
469 if (strstr(buf, "bpf-map")) in get_fd_type()
471 else if (strstr(buf, "bpf-prog")) in get_fd_type()
473 else if (strstr(buf, "bpf-link")) in get_fd_type()
479 char *get_fdinfo(int fd, const char *key) in get_fdinfo() argument
487 snprintf(path, sizeof(path), "/proc/self/fdinfo/%d", fd); in get_fdinfo()
511 line[len - 1] = '\0'; in get_fdinfo()
551 int fd, err = 0; in do_build_table_cb() local
557 fd = open_obj_pinned(fpath, true); in do_build_table_cb()
558 if (fd < 0) in do_build_table_cb()
561 objtype = get_fd_type(fd); in do_build_table_cb()
566 if (bpf_prog_get_info_by_fd(fd, &pinned_info, &len)) in do_build_table_cb()
571 err = -1; in do_build_table_cb()
584 close(fd); in do_build_table_cb()
600 return -1; in build_pinned_obj_table()
606 char *path = mntent->mnt_dir; in build_pinned_obj_table()
608 if (strncmp(mntent->mnt_type, "bpf", 3) != 0) in build_pinned_obj_table()
627 free(entry->pvalue); in delete_pinned_obj_table()
646 p_err("Can't get # of possible cpus: %s", strerror(-cpus)); in get_possible_cpus()
647 exit(-1); in get_possible_cpus()
660 p_err("Can't stat /proc/self: %s", strerror(errno)); in ifindex_to_name_ns()
674 int fd; in read_sysfs_hex_int() local
676 fd = open(path, O_RDONLY); in read_sysfs_hex_int()
677 if (fd < 0) { in read_sysfs_hex_int()
678 p_err("Can't open %s: %s", path, strerror(errno)); in read_sysfs_hex_int()
679 return -1; in read_sysfs_hex_int()
682 len = read(fd, vendor_id_buf, sizeof(vendor_id_buf)); in read_sysfs_hex_int()
683 close(fd); in read_sysfs_hex_int()
685 p_err("Can't read %s: %s", path, strerror(errno)); in read_sysfs_hex_int()
686 return -1; in read_sysfs_hex_int()
690 return -1; in read_sysfs_hex_int()
716 p_err("Can't get net device name for ifindex %d: %s", ifindex, in ifindex_to_arch()
723 p_err("Can't get device vendor id for %s", devname); in ifindex_to_arch()
734 p_info("Unknown NFP device ID, assuming it is NFP-6xxx arch"); in ifindex_to_arch()
736 return "NFP-6xxx"; in ifindex_to_arch()
740 p_err("Can't get arch name for device vendor id 0x%04x", in ifindex_to_arch()
786 return -1; in parse_u32_arg()
791 p_err("can't parse %s as %s", **argv, what); in parse_u32_arg()
792 return -1; in parse_u32_arg()
810 int fd, nb_fds = 0; in prog_fd_by_nametag() local
827 fd = bpf_prog_get_fd_by_id(id); in prog_fd_by_nametag()
828 if (fd < 0) { in prog_fd_by_nametag()
829 p_err("can't get prog by id (%u): %s", in prog_fd_by_nametag()
834 err = bpf_prog_get_info_by_fd(fd, &info, &len); in prog_fd_by_nametag()
836 p_err("can't get prog info (%u): %s", in prog_fd_by_nametag()
842 close(fd); in prog_fd_by_nametag()
847 get_prog_full_name(&info, fd, prog_name, in prog_fd_by_nametag()
850 close(fd); in prog_fd_by_nametag()
863 (*fds)[nb_fds++] = fd; in prog_fd_by_nametag()
867 close(fd); in prog_fd_by_nametag()
869 while (--nb_fds >= 0) in prog_fd_by_nametag()
871 return -1; in prog_fd_by_nametag()
884 p_err("can't parse %s as ID", **argv); in prog_parse_fds()
885 return -1; in prog_parse_fds()
892 return -1; in prog_parse_fds()
903 p_err("can't parse tag"); in prog_parse_fds()
904 return -1; in prog_parse_fds()
915 if (strlen(name) > MAX_PROG_FULL_NAME - 1) { in prog_parse_fds()
916 p_err("can't parse name"); in prog_parse_fds()
917 return -1; in prog_parse_fds()
932 return -1; in prog_parse_fds()
937 return -1; in prog_parse_fds()
943 int nb_fds, fd; in prog_parse_fd() local
948 return -1; in prog_parse_fd()
954 while (nb_fds--) in prog_parse_fd()
957 fd = -1; in prog_parse_fd()
961 fd = fds[0]; in prog_parse_fd()
964 return fd; in prog_parse_fd()
970 int fd, nb_fds = 0; in map_fd_by_name() local
987 fd = bpf_map_get_fd_by_id(id); in map_fd_by_name()
988 if (fd < 0) { in map_fd_by_name()
989 p_err("can't get map by id (%u): %s", in map_fd_by_name()
994 err = bpf_map_get_info_by_fd(fd, &info, &len); in map_fd_by_name()
996 p_err("can't get map info (%u): %s", in map_fd_by_name()
1002 close(fd); in map_fd_by_name()
1014 (*fds)[nb_fds++] = fd; in map_fd_by_name()
1018 close(fd); in map_fd_by_name()
1020 while (--nb_fds >= 0) in map_fd_by_name()
1022 return -1; in map_fd_by_name()
1035 p_err("can't parse %s as ID", **argv); in map_parse_fds()
1036 return -1; in map_parse_fds()
1043 return -1; in map_parse_fds()
1052 if (strlen(name) > BPF_OBJ_NAME_LEN - 1) { in map_parse_fds()
1053 p_err("can't parse name"); in map_parse_fds()
1054 return -1; in map_parse_fds()
1069 return -1; in map_parse_fds()
1074 return -1; in map_parse_fds()
1080 int nb_fds, fd; in map_parse_fd() local
1085 return -1; in map_parse_fd()
1091 while (nb_fds--) in map_parse_fd()
1094 fd = -1; in map_parse_fd()
1098 fd = fds[0]; in map_parse_fd()
1101 return fd; in map_parse_fd()
1108 int fd; in map_parse_fd_and_info() local
1110 fd = map_parse_fd(argc, argv); in map_parse_fd_and_info()
1111 if (fd < 0) in map_parse_fd_and_info()
1112 return -1; in map_parse_fd_and_info()
1114 err = bpf_map_get_info_by_fd(fd, info, info_len); in map_parse_fd_and_info()
1116 p_err("can't get map info: %s", strerror(errno)); in map_parse_fd_and_info()
1117 close(fd); in map_parse_fd_and_info()
1121 return fd; in map_parse_fd_and_info()
1177 return -EINVAL; in pathname_concat()
1179 return -ENAMETOOLONG; in pathname_concat()