From 940fe50f5a72d2624b217ccaf720b05f06a4dd90 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Tue, 12 Mar 2019 11:17:20 +0000 Subject: [PATCH] bpf: add support for new twelve fields in struct bpf_prog_info * bpf_attr.h (struct bpf_prog_info_struct): Add btf_id, func_info_rec_size, func_info, nr_func_info, nr_line_info, line_info, jited_line_info, nr_jited_line_info, line_info_rec_size, jited_line_info_rec_size, nr_prog_tags, and prog_tags fields. * bpf.c (struct obj_get_info_saved): Add func_info_rec_size, nr_func_info, nr_line_info, jited_line_info, nr_jited_line_info, line_info_rec_size, jited_line_info_rec_size, and nr_prog_tags fields. (print_bpf_prog_info): Decode the twelve fields introduced by Linux commits v5.0-rc1~129^2~209^2~16^2~8, v5.0-rc1~129^2~114^2~5^2~6, v5.0-rc1~129^2~114^2^2~2, and v5.0-rc1~129^2~15^2~22. * NEWS: Mention the latest bpf decoding enhancements. * tests/bpf-obj_get_info_by_fd.c (main): Update expected output. Resolves: https://github.com/strace/strace/issues/94 --- NEWS | 1 + bpf.c | 78 ++++++++++++++++++++++++++++++++++++++++++ bpf_attr.h | 14 +++++++- tests/bpf-obj_get_info_by_fd.c | 66 +++++++++++++++++++++++++++++++++++ 4 files changed, 158 insertions(+), 1 deletion(-) Index: strace-4.24/bpf.c =================================================================== --- strace-4.24.orig/bpf.c 2020-01-28 00:16:27.823183735 +0100 +++ strace-4.24/bpf.c 2020-01-28 00:16:43.588035268 +0100 @@ -432,6 +432,15 @@ uint32_t nr_jited_func_lens; uint64_t jited_ksyms; uint64_t jited_func_lens; + + uint32_t func_info_rec_size; + uint32_t nr_func_info; + uint32_t nr_line_info; + uint32_t nr_jited_line_info; + uint64_t jited_line_info; + uint32_t line_info_rec_size; + uint32_t jited_line_info_rec_size; + uint32_t nr_prog_tags; }; static void @@ -507,6 +516,15 @@ saved->jited_ksyms = info.jited_ksyms; saved->jited_func_lens = info.jited_func_lens; + saved->func_info_rec_size = info.func_info_rec_size; + saved->nr_func_info = info.nr_func_info; + saved->nr_line_info = info.nr_line_info; + saved->nr_jited_line_info = info.nr_jited_line_info; + saved->jited_line_info = info.jited_line_info; + saved->line_info_rec_size = info.line_info_rec_size; + saved->jited_line_info_rec_size = info.jited_line_info_rec_size; + saved->nr_prog_tags = info.nr_prog_tags; + return; } @@ -599,6 +617,66 @@ } printaddr64(info.jited_func_lens); + /* + * The next twelve fields were introduced by Linux commits + * v5.0-rc1~129^2~209^2~16^2~8 + * v5.0-rc1~129^2~114^2~5^2~6 + * v5.0-rc1~129^2~114^2^2~2 + * v5.0-rc1~129^2~15^2~22 + */ + if (len <= offsetof(struct bpf_prog_info_struct, btf_id)) + goto print_bpf_prog_info_end; + + PRINT_FIELD_U(", ", info, btf_id); + + tprints(", func_info_rec_size="); + if (saved->func_info_rec_size != info.func_info_rec_size) + tprintf("%" PRIu32 " => ", saved->func_info_rec_size); + tprintf("%" PRIu32, info.func_info_rec_size); + + PRINT_FIELD_ADDR64(", ", info, func_info); + + tprints(", nr_func_info="); + if (saved->nr_func_info != info.nr_func_info) + tprintf("%" PRIu32 " => ", saved->nr_func_info); + tprintf("%" PRIu32, info.nr_func_info); + + tprints(", nr_line_info="); + if (saved->nr_line_info != info.nr_line_info) + tprintf("%" PRIu32 " => ", saved->nr_line_info); + tprintf("%" PRIu32, info.nr_line_info); + + PRINT_FIELD_ADDR64(", ", info, line_info); + + tprints(", jited_line_info="); + if (saved->jited_line_info != info.jited_line_info) { + printaddr64(saved->jited_line_info); + tprints(" => "); + } + printaddr64(info.jited_line_info); + + tprints(", nr_jited_line_info="); + if (saved->nr_jited_line_info != info.nr_jited_line_info) + tprintf("%" PRIu32 " => ", saved->nr_jited_line_info); + tprintf("%" PRIu32, info.nr_jited_line_info); + + tprints(", line_info_rec_size="); + if (saved->line_info_rec_size != info.line_info_rec_size) + tprintf("%" PRIu32 " => ", saved->line_info_rec_size); + tprintf("%" PRIu32, info.line_info_rec_size); + + tprints(", jited_line_info_rec_size="); + if (saved->jited_line_info_rec_size != info.jited_line_info_rec_size) + tprintf("%" PRIu32 " => ", saved->jited_line_info_rec_size); + tprintf("%" PRIu32, info.jited_line_info_rec_size); + + tprints(", nr_prog_tags="); + if (saved->nr_prog_tags != info.nr_prog_tags) + tprintf("%" PRIu32 " => ", saved->nr_prog_tags); + tprintf("%" PRIu32, info.nr_prog_tags); + + PRINT_FIELD_ADDR64(", ", info, prog_tags); + decode_attr_extra_data(tcp, info_buf, size, bpf_prog_info_struct_size); print_bpf_prog_info_end: Index: strace-4.24/bpf_attr.h =================================================================== --- strace-4.24.orig/bpf_attr.h 2020-01-28 00:16:27.823183735 +0100 +++ strace-4.24/bpf_attr.h 2020-01-28 00:16:43.588035268 +0100 @@ -276,10 +276,22 @@ uint32_t nr_jited_func_lens; uint64_t ATTRIBUTE_ALIGNED(8) jited_ksyms; uint64_t ATTRIBUTE_ALIGNED(8) jited_func_lens; + uint32_t btf_id; + uint32_t func_info_rec_size; + uint64_t ATTRIBUTE_ALIGNED(8) func_info; + uint32_t nr_func_info; + uint32_t nr_line_info; + uint64_t ATTRIBUTE_ALIGNED(8) line_info; + uint64_t ATTRIBUTE_ALIGNED(8) jited_line_info; + uint32_t nr_jited_line_info; + uint32_t line_info_rec_size; + uint32_t jited_line_info_rec_size; + uint32_t nr_prog_tags; + uint64_t ATTRIBUTE_ALIGNED(8) prog_tags; }; # define bpf_prog_info_struct_size \ sizeof(struct bpf_prog_info_struct) -# define expected_bpf_prog_info_struct_size 128 +# define expected_bpf_prog_info_struct_size 192 #endif /* !STRACE_BPF_ATTR_H */ Index: strace-4.24/tests/bpf-obj_get_info_by_fd.c =================================================================== --- strace-4.24.orig/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:27.823183735 +0100 +++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:43.589035258 +0100 @@ -360,6 +360,14 @@ prog_info->jited_prog_len = 0; prog_info->nr_jited_ksyms = 0; prog_info->nr_jited_func_lens = 0; + prog_info->func_info_rec_size = 0; + prog_info->nr_func_info = 0; + prog_info->nr_line_info = 0; + prog_info->nr_jited_line_info = 0; + prog_info->jited_line_info = 0; + prog_info->line_info_rec_size = 0; + prog_info->jited_line_info_rec_size = 0; + prog_info->nr_prog_tags = 0; memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info)); switch (i) { case 1: @@ -506,6 +514,64 @@ offsetof(struct bpf_prog_info_struct, jited_func_lens)) printf(", jited_func_lens=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, btf_id)) + PRINT_FIELD_U(", ", *prog_info, btf_id); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, func_info_rec_size)) { + printf(", func_info_rec_size=0"); + if (prog_info->func_info_rec_size) + printf(" => %u", prog_info->func_info_rec_size); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, func_info)) + printf(", func_info=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_func_info)) { + printf(", nr_func_info=0"); + if (prog_info->nr_func_info) + printf(" => %u", prog_info->nr_func_info); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_line_info)) { + printf(", nr_line_info=0"); + if (prog_info->nr_line_info) + printf(" => %u", prog_info->nr_line_info); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, line_info)) + printf(", line_info=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, jited_line_info)) + printf(", jited_line_info=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_jited_line_info)) { + printf(", nr_jited_line_info=0"); + if (prog_info->nr_jited_line_info) + printf(" => %u", prog_info->nr_jited_line_info); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, line_info_rec_size)) { + printf(", line_info_rec_size=0"); + if (prog_info->line_info_rec_size) + printf(" => %u", prog_info->line_info_rec_size); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, jited_line_info_rec_size)) { + printf(", jited_line_info_rec_size=0"); + if (prog_info->jited_line_info_rec_size) + printf(" => %u", prog_info->jited_line_info_rec_size); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_prog_tags)) { + printf(", nr_prog_tags=0"); + if (prog_info->nr_prog_tags) + printf(" => %u", prog_info->nr_prog_tags); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, prog_tags)) + printf(", prog_tags=NULL"); + printf("}"); # else /* !VERBOSE */ printf("%p", prog_info); Index: strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c =================================================================== --- strace-4.24.orig/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:37.300094485 +0100 +++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:49.360980900 +0100 @@ -360,6 +360,14 @@ prog_info->jited_prog_len = 0; prog_info->nr_jited_ksyms = 0; prog_info->nr_jited_func_lens = 0; + prog_info->func_info_rec_size = 0; + prog_info->nr_func_info = 0; + prog_info->nr_line_info = 0; + prog_info->nr_jited_line_info = 0; + prog_info->jited_line_info = 0; + prog_info->line_info_rec_size = 0; + prog_info->jited_line_info_rec_size = 0; + prog_info->nr_prog_tags = 0; memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info)); switch (i) { case 1: @@ -506,6 +514,64 @@ offsetof(struct bpf_prog_info_struct, jited_func_lens)) printf(", jited_func_lens=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, btf_id)) + PRINT_FIELD_U(", ", *prog_info, btf_id); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, func_info_rec_size)) { + printf(", func_info_rec_size=0"); + if (prog_info->func_info_rec_size) + printf(" => %u", prog_info->func_info_rec_size); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, func_info)) + printf(", func_info=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_func_info)) { + printf(", nr_func_info=0"); + if (prog_info->nr_func_info) + printf(" => %u", prog_info->nr_func_info); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_line_info)) { + printf(", nr_line_info=0"); + if (prog_info->nr_line_info) + printf(" => %u", prog_info->nr_line_info); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, line_info)) + printf(", line_info=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, jited_line_info)) + printf(", jited_line_info=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_jited_line_info)) { + printf(", nr_jited_line_info=0"); + if (prog_info->nr_jited_line_info) + printf(" => %u", prog_info->nr_jited_line_info); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, line_info_rec_size)) { + printf(", line_info_rec_size=0"); + if (prog_info->line_info_rec_size) + printf(" => %u", prog_info->line_info_rec_size); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, jited_line_info_rec_size)) { + printf(", jited_line_info_rec_size=0"); + if (prog_info->jited_line_info_rec_size) + printf(" => %u", prog_info->jited_line_info_rec_size); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_prog_tags)) { + printf(", nr_prog_tags=0"); + if (prog_info->nr_prog_tags) + printf(" => %u", prog_info->nr_prog_tags); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, prog_tags)) + printf(", prog_tags=NULL"); + printf("}"); # else /* !VERBOSE */ printf("%p", prog_info); Index: strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c =================================================================== --- strace-4.24.orig/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:34.082124791 +0100 +++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:51.902956961 +0100 @@ -360,6 +360,14 @@ prog_info->jited_prog_len = 0; prog_info->nr_jited_ksyms = 0; prog_info->nr_jited_func_lens = 0; + prog_info->func_info_rec_size = 0; + prog_info->nr_func_info = 0; + prog_info->nr_line_info = 0; + prog_info->nr_jited_line_info = 0; + prog_info->jited_line_info = 0; + prog_info->line_info_rec_size = 0; + prog_info->jited_line_info_rec_size = 0; + prog_info->nr_prog_tags = 0; memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info)); switch (i) { case 1: @@ -506,6 +514,64 @@ offsetof(struct bpf_prog_info_struct, jited_func_lens)) printf(", jited_func_lens=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, btf_id)) + PRINT_FIELD_U(", ", *prog_info, btf_id); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, func_info_rec_size)) { + printf(", func_info_rec_size=0"); + if (prog_info->func_info_rec_size) + printf(" => %u", prog_info->func_info_rec_size); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, func_info)) + printf(", func_info=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_func_info)) { + printf(", nr_func_info=0"); + if (prog_info->nr_func_info) + printf(" => %u", prog_info->nr_func_info); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_line_info)) { + printf(", nr_line_info=0"); + if (prog_info->nr_line_info) + printf(" => %u", prog_info->nr_line_info); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, line_info)) + printf(", line_info=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, jited_line_info)) + printf(", jited_line_info=NULL"); + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_jited_line_info)) { + printf(", nr_jited_line_info=0"); + if (prog_info->nr_jited_line_info) + printf(" => %u", prog_info->nr_jited_line_info); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, line_info_rec_size)) { + printf(", line_info_rec_size=0"); + if (prog_info->line_info_rec_size) + printf(" => %u", prog_info->line_info_rec_size); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, jited_line_info_rec_size)) { + printf(", jited_line_info_rec_size=0"); + if (prog_info->jited_line_info_rec_size) + printf(" => %u", prog_info->jited_line_info_rec_size); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, nr_prog_tags)) { + printf(", nr_prog_tags=0"); + if (prog_info->nr_prog_tags) + printf(" => %u", prog_info->nr_prog_tags); + } + if (bpf_prog_get_info_attr.info_len > + offsetof(struct bpf_prog_info_struct, prog_tags)) + printf(", prog_tags=NULL"); + printf("}"); # else /* !VERBOSE */ printf("%p", prog_info);