From 27bd13d3664a6047e9431e01bd13fc04cc5e373b Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 12 Mar 2019 11:17:20 +0000
Subject: [PATCH] bpf: add support for btf_* fields in struct bpf_map_info
* bpf_attr.h (struct bpf_map_info_struct): Add btf_fd, btf_key_type_id,
and btf_value_type_id fields.
* bpf.c (print_bpf_map_info): Decode btf_fd, btf_key_type_id,
and btf_value_type_id fields introduced by Linux commits
v4.18-rc1~114^2~223^2~21^2~4 and v4.18-rc1~114^2~148^2~7^2~2.
* tests/bpf-obj_get_info_by_fd.c (main): Update expected output.
---
bpf.c | 10 ++++++++++
bpf_attr.h | 7 +++++--
tests/bpf-obj_get_info_by_fd.c | 9 +++++++++
3 files changed, 24 insertions(+), 2 deletions(-)
Index: strace-4.24/bpf.c
===================================================================
--- strace-4.24.orig/bpf.c 2020-01-28 00:15:26.973756792 +0100
+++ strace-4.24/bpf.c 2020-01-28 00:15:59.919446522 +0100
@@ -466,6 +466,16 @@
PRINT_FIELD_DEV(", ", info, netns_dev);
PRINT_FIELD_U(", ", info, netns_ino);
+ /*
+ * The next three fields were introduced by Linux commits
+ * v4.18-rc1~114^2~223^2~21^2~4 and v4.18-rc1~114^2~148^2~7^2~2.
+ */
+ if (len <= offsetof(struct bpf_map_info_struct, btf_id))
+ goto print_bpf_map_info_end;
+ PRINT_FIELD_U(", ", info, btf_id);
+ PRINT_FIELD_U(", ", info, btf_key_type_id);
+ PRINT_FIELD_U(", ", info, btf_value_type_id);
+
decode_attr_extra_data(tcp, info_buf, size, bpf_map_info_struct_size);
print_bpf_map_info_end:
Index: strace-4.24/bpf_attr.h
===================================================================
--- strace-4.24.orig/bpf_attr.h 2020-01-28 00:15:26.974756783 +0100
+++ strace-4.24/bpf_attr.h 2020-01-28 00:15:59.919446522 +0100
@@ -242,11 +242,14 @@
*/
uint64_t ATTRIBUTE_ALIGNED(8) netns_dev; /* skip check */
uint64_t ATTRIBUTE_ALIGNED(8) netns_ino; /* skip check */
+ uint32_t btf_id;
+ uint32_t btf_key_type_id;
+ uint32_t btf_value_type_id;
};
# define bpf_map_info_struct_size \
- sizeof(struct bpf_map_info_struct)
-# define expected_bpf_map_info_struct_size 64
+ offsetofend(struct bpf_map_info_struct, btf_value_type_id)
+# define expected_bpf_map_info_struct_size 76
struct bpf_prog_info_struct {
uint32_t type;
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:15:26.974756783 +0100
+++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:59.920446513 +0100
@@ -324,6 +324,15 @@
if (bpf_map_get_info_attr.info_len >
offsetof(struct bpf_map_info_struct, netns_ino))
printf(", netns_ino=%" PRIu64, map_info->netns_ino);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_id))
+ PRINT_FIELD_U(", ", *map_info, btf_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_key_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_key_type_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_value_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_value_type_id);
printf("}");
#else /* !VERBOSE */
printf("%p", map_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:15:51.739523557 +0100
+++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:14.855305862 +0100
@@ -324,6 +324,15 @@
if (bpf_map_get_info_attr.info_len >
offsetof(struct bpf_map_info_struct, netns_ino))
printf(", netns_ino=%" PRIu64, map_info->netns_ino);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_id))
+ PRINT_FIELD_U(", ", *map_info, btf_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_key_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_key_type_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_value_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_value_type_id);
printf("}");
#else /* !VERBOSE */
printf("%p", map_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:15:55.110491811 +0100
+++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:23.096228252 +0100
@@ -324,6 +324,15 @@
if (bpf_map_get_info_attr.info_len >
offsetof(struct bpf_map_info_struct, netns_ino))
printf(", netns_ino=%" PRIu64, map_info->netns_ino);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_id))
+ PRINT_FIELD_U(", ", *map_info, btf_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_key_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_key_type_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_value_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_value_type_id);
printf("}");
#else /* !VERBOSE */
printf("%p", map_info);