Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

bpftool: Use bpf_{btf,link,map,prog}_get_info_by_fd()

Use the new type-safe wrappers around bpf_obj_get_info_by_fd().

Split the bpf_obj_get_info_by_fd() call in build_btf_type_table() in
two, since knowing the type helps with the Memory Sanitizer.

Improve map_parse_fd_and_info() type safety by using
struct bpf_map_info * instead of void * for info.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Reviewed-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/bpf/20230214231221.249277-4-iii@linux.ibm.com

authored by

Ilya Leoshkevich and committed by
Andrii Nakryiko
38f0408e 629dfc66

+41 -36
+8 -5
tools/bpf/bpftool/btf.c
··· 537 537 len = sizeof(btf_info); 538 538 btf_info.name = ptr_to_u64(btf_name); 539 539 btf_info.name_len = sizeof(btf_name); 540 - err = bpf_obj_get_info_by_fd(btf_fd, &btf_info, &len); 540 + err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len); 541 541 close(btf_fd); 542 542 if (err) { 543 543 p_err("can't get BTF (ID %u) object info: %s", btf_id, strerror(errno)); ··· 606 606 if (fd < 0) 607 607 return -1; 608 608 609 - err = bpf_obj_get_info_by_fd(fd, &info, &len); 609 + err = bpf_prog_get_info_by_fd(fd, &info, &len); 610 610 if (err) { 611 611 p_err("can't get prog info: %s", strerror(errno)); 612 612 goto done; ··· 789 789 } 790 790 791 791 memset(info, 0, *len); 792 - err = bpf_obj_get_info_by_fd(fd, info, len); 792 + if (type == BPF_OBJ_PROG) 793 + err = bpf_prog_get_info_by_fd(fd, info, len); 794 + else 795 + err = bpf_map_get_info_by_fd(fd, info, len); 793 796 close(fd); 794 797 if (err) { 795 798 p_err("can't get %s info: %s", names[type], ··· 934 931 int err; 935 932 936 933 memset(&info, 0, sizeof(info)); 937 - err = bpf_obj_get_info_by_fd(fd, &info, &len); 934 + err = bpf_btf_get_info_by_fd(fd, &info, &len); 938 935 if (err) { 939 936 p_err("can't get BTF object info: %s", strerror(errno)); 940 937 return -1; ··· 946 943 info.name = ptr_to_u64(name); 947 944 len = sizeof(info); 948 945 949 - err = bpf_obj_get_info_by_fd(fd, &info, &len); 946 + err = bpf_btf_get_info_by_fd(fd, &info, &len); 950 947 if (err) { 951 948 p_err("can't get BTF object info: %s", strerror(errno)); 952 949 return -1;
+2 -2
tools/bpf/bpftool/btf_dumper.c
··· 57 57 if (prog_fd < 0) 58 58 goto print; 59 59 60 - err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 60 + err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len); 61 61 if (err) 62 62 goto print; 63 63 ··· 70 70 info.func_info_rec_size = finfo_rec_size; 71 71 info.func_info = ptr_to_u64(&finfo); 72 72 73 - err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); 73 + err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len); 74 74 if (err) 75 75 goto print; 76 76
+2 -2
tools/bpf/bpftool/cgroup.c
··· 82 82 if (fd < 0) 83 83 return; 84 84 85 - err = bpf_obj_get_info_by_fd(fd, &btf_info, &btf_len); 85 + err = bpf_btf_get_info_by_fd(fd, &btf_info, &btf_len); 86 86 if (err) 87 87 goto out; 88 88 ··· 108 108 if (prog_fd < 0) 109 109 return -1; 110 110 111 - if (bpf_obj_get_info_by_fd(prog_fd, &info, &info_len)) { 111 + if (bpf_prog_get_info_by_fd(prog_fd, &info, &info_len)) { 112 112 close(prog_fd); 113 113 return -1; 114 114 }
+7 -6
tools/bpf/bpftool/common.c
··· 353 353 info.func_info_rec_size = sizeof(finfo); 354 354 info.func_info = ptr_to_u64(&finfo); 355 355 356 - if (bpf_obj_get_info_by_fd(prog_fd, &info, &info_len)) 356 + if (bpf_prog_get_info_by_fd(prog_fd, &info, &info_len)) 357 357 goto copy_name; 358 358 359 359 prog_btf = btf__load_from_kernel_by_id(info.btf_id); ··· 488 488 goto out_close; 489 489 490 490 memset(&pinned_info, 0, sizeof(pinned_info)); 491 - if (bpf_obj_get_info_by_fd(fd, &pinned_info, &len)) 491 + if (bpf_prog_get_info_by_fd(fd, &pinned_info, &len)) 492 492 goto out_close; 493 493 494 494 path = strdup(fpath); ··· 756 756 goto err_close_fds; 757 757 } 758 758 759 - err = bpf_obj_get_info_by_fd(fd, &info, &len); 759 + err = bpf_prog_get_info_by_fd(fd, &info, &len); 760 760 if (err) { 761 761 p_err("can't get prog info (%u): %s", 762 762 id, strerror(errno)); ··· 916 916 goto err_close_fds; 917 917 } 918 918 919 - err = bpf_obj_get_info_by_fd(fd, &info, &len); 919 + err = bpf_map_get_info_by_fd(fd, &info, &len); 920 920 if (err) { 921 921 p_err("can't get map info (%u): %s", 922 922 id, strerror(errno)); ··· 1026 1026 return fd; 1027 1027 } 1028 1028 1029 - int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len) 1029 + int map_parse_fd_and_info(int *argc, char ***argv, struct bpf_map_info *info, 1030 + __u32 *info_len) 1030 1031 { 1031 1032 int err; 1032 1033 int fd; ··· 1036 1035 if (fd < 0) 1037 1036 return -1; 1038 1037 1039 - err = bpf_obj_get_info_by_fd(fd, info, info_len); 1038 + err = bpf_map_get_info_by_fd(fd, info, info_len); 1040 1039 if (err) { 1041 1040 p_err("can't get map info: %s", strerror(errno)); 1042 1041 close(fd);
+2 -2
tools/bpf/bpftool/link.c
··· 145 145 return prog_fd; 146 146 147 147 memset(info, 0, sizeof(*info)); 148 - err = bpf_obj_get_info_by_fd(prog_fd, info, &len); 148 + err = bpf_prog_get_info_by_fd(prog_fd, info, &len); 149 149 if (err) 150 150 p_err("can't get prog info: %s", strerror(errno)); 151 151 close(prog_fd); ··· 327 327 328 328 memset(&info, 0, sizeof(info)); 329 329 again: 330 - err = bpf_obj_get_info_by_fd(fd, &info, &len); 330 + err = bpf_link_get_info_by_fd(fd, &info, &len); 331 331 if (err) { 332 332 p_err("can't get link info: %s", 333 333 strerror(errno));
+2 -1
tools/bpf/bpftool/main.h
··· 168 168 int prog_parse_fds(int *argc, char ***argv, int **fds); 169 169 int map_parse_fd(int *argc, char ***argv); 170 170 int map_parse_fds(int *argc, char ***argv, int **fds); 171 - int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len); 171 + int map_parse_fd_and_info(int *argc, char ***argv, struct bpf_map_info *info, 172 + __u32 *info_len); 172 173 173 174 struct bpf_prog_linfo; 174 175 #if defined(HAVE_LLVM_SUPPORT) || defined(HAVE_LIBBFD_SUPPORT)
+4 -4
tools/bpf/bpftool/map.c
··· 638 638 if (json_output && nb_fds > 1) 639 639 jsonw_start_array(json_wtr); /* root array */ 640 640 for (i = 0; i < nb_fds; i++) { 641 - err = bpf_obj_get_info_by_fd(fds[i], &info, &len); 641 + err = bpf_map_get_info_by_fd(fds[i], &info, &len); 642 642 if (err) { 643 643 p_err("can't get map info: %s", 644 644 strerror(errno)); ··· 708 708 break; 709 709 } 710 710 711 - err = bpf_obj_get_info_by_fd(fd, &info, &len); 711 + err = bpf_map_get_info_by_fd(fd, &info, &len); 712 712 if (err) { 713 713 p_err("can't get map info: %s", strerror(errno)); 714 714 close(fd); ··· 764 764 int err, i; 765 765 766 766 for (i = 0; i < nb_fds; i++) { 767 - err = bpf_obj_get_info_by_fd(fds[i], &info, &len); 767 + err = bpf_map_get_info_by_fd(fds[i], &info, &len); 768 768 if (err) { 769 769 p_err("can't get map info: %s", strerror(errno)); 770 770 return -1; ··· 925 925 if (wtr && nb_fds > 1) 926 926 jsonw_start_array(wtr); /* root array */ 927 927 for (i = 0; i < nb_fds; i++) { 928 - if (bpf_obj_get_info_by_fd(fds[i], &info, &len)) { 928 + if (bpf_map_get_info_by_fd(fds[i], &info, &len)) { 929 929 p_err("can't get map info: %s", strerror(errno)); 930 930 break; 931 931 }
+11 -11
tools/bpf/bpftool/prog.c
··· 198 198 info.nr_map_ids = num_maps; 199 199 info.map_ids = ptr_to_u64(map_ids); 200 200 201 - err = bpf_obj_get_info_by_fd(fd, &info, &len); 201 + err = bpf_prog_get_info_by_fd(fd, &info, &len); 202 202 if (err || !info.nr_map_ids) 203 203 return; 204 204 ··· 231 231 232 232 memset(&prog_info, 0, sizeof(prog_info)); 233 233 prog_info_len = sizeof(prog_info); 234 - ret = bpf_obj_get_info_by_fd(prog_fd, &prog_info, &prog_info_len); 234 + ret = bpf_prog_get_info_by_fd(prog_fd, &prog_info, &prog_info_len); 235 235 if (ret) 236 236 return NULL; 237 237 ··· 248 248 prog_info.map_ids = ptr_to_u64(map_ids); 249 249 prog_info_len = sizeof(prog_info); 250 250 251 - ret = bpf_obj_get_info_by_fd(prog_fd, &prog_info, &prog_info_len); 251 + ret = bpf_prog_get_info_by_fd(prog_fd, &prog_info, &prog_info_len); 252 252 if (ret) 253 253 goto free_map_ids; 254 254 ··· 259 259 260 260 memset(map_info, 0, sizeof(*map_info)); 261 261 map_info_len = sizeof(*map_info); 262 - ret = bpf_obj_get_info_by_fd(map_fd, map_info, &map_info_len); 262 + ret = bpf_map_get_info_by_fd(map_fd, map_info, &map_info_len); 263 263 if (ret < 0) { 264 264 close(map_fd); 265 265 goto free_map_ids; ··· 580 580 __u32 len = sizeof(info); 581 581 int err; 582 582 583 - err = bpf_obj_get_info_by_fd(fd, &info, &len); 583 + err = bpf_prog_get_info_by_fd(fd, &info, &len); 584 584 if (err) { 585 585 p_err("can't get prog info: %s", strerror(errno)); 586 586 return -1; ··· 949 949 for (i = 0; i < nb_fds; i++) { 950 950 memset(&info, 0, sizeof(info)); 951 951 952 - err = bpf_obj_get_info_by_fd(fds[i], &info, &info_len); 952 + err = bpf_prog_get_info_by_fd(fds[i], &info, &info_len); 953 953 if (err) { 954 954 p_err("can't get prog info: %s", strerror(errno)); 955 955 break; ··· 961 961 break; 962 962 } 963 963 964 - err = bpf_obj_get_info_by_fd(fds[i], &info, &info_len); 964 + err = bpf_prog_get_info_by_fd(fds[i], &info, &info_len); 965 965 if (err) { 966 966 p_err("can't get prog info: %s", strerror(errno)); 967 967 break; ··· 2170 2170 char *name = NULL; 2171 2171 int err; 2172 2172 2173 - err = bpf_obj_get_info_by_fd(tgt_fd, &info, &info_len); 2173 + err = bpf_prog_get_info_by_fd(tgt_fd, &info, &info_len); 2174 2174 if (err) { 2175 - p_err("failed to bpf_obj_get_info_by_fd for prog FD %d", tgt_fd); 2175 + p_err("failed to get info for prog FD %d", tgt_fd); 2176 2176 goto out; 2177 2177 } 2178 2178 ··· 2183 2183 2184 2184 func_info_rec_size = info.func_info_rec_size; 2185 2185 if (info.nr_func_info == 0) { 2186 - p_err("bpf_obj_get_info_by_fd for prog FD %d found 0 func_info", tgt_fd); 2186 + p_err("found 0 func_info for prog FD %d", tgt_fd); 2187 2187 goto out; 2188 2188 } 2189 2189 ··· 2192 2192 info.func_info_rec_size = func_info_rec_size; 2193 2193 info.func_info = ptr_to_u64(&func_info); 2194 2194 2195 - err = bpf_obj_get_info_by_fd(tgt_fd, &info, &info_len); 2195 + err = bpf_prog_get_info_by_fd(tgt_fd, &info, &info_len); 2196 2196 if (err) { 2197 2197 p_err("failed to get func_info for prog FD %d", tgt_fd); 2198 2198 goto out;
+3 -3
tools/bpf/bpftool/struct_ops.c
··· 151 151 return -1; 152 152 } 153 153 154 - err = bpf_obj_get_info_by_fd(fd, info, &info_len); 154 + err = bpf_map_get_info_by_fd(fd, info, &info_len); 155 155 if (err) { 156 156 p_err("can't get map info: %s", strerror(errno)); 157 157 close(fd); ··· 262 262 goto done; 263 263 } 264 264 265 - if (bpf_obj_get_info_by_fd(fd, info, &info_len)) { 265 + if (bpf_map_get_info_by_fd(fd, info, &info_len)) { 266 266 p_err("can't get map info: %s", strerror(errno)); 267 267 res.nr_errs++; 268 268 goto done; ··· 522 522 bpf_link__disconnect(link); 523 523 bpf_link__destroy(link); 524 524 525 - if (!bpf_obj_get_info_by_fd(bpf_map__fd(map), &info, 525 + if (!bpf_map_get_info_by_fd(bpf_map__fd(map), &info, 526 526 &info_len)) 527 527 p_info("Registered %s %s id %u", 528 528 get_kern_struct_ops_name(&info),