Skip to content

Commit 920d16a

Browse files
alan-maguireanakryiko
authored andcommitted
libbpf: BTF dumper support for typed data
Add a BTF dumper for typed data, so that the user can dump a typed version of the data provided. The API is int btf_dump__dump_type_data(struct btf_dump *d, __u32 id, void *data, size_t data_sz, const struct btf_dump_type_data_opts *opts); ...where the id is the BTF id of the data pointed to by the "void *" argument; for example the BTF id of "struct sk_buff" for a "struct skb *" data pointer. Options supported are - a starting indent level (indent_lvl) - a user-specified indent string which will be printed once per indent level; if NULL, tab is chosen but any string <= 32 chars can be provided. - a set of boolean options to control dump display, similar to those used for BPF helper bpf_snprintf_btf(). Options are - compact : omit newlines and other indentation - skip_names: omit member names - emit_zeroes: show zero-value members Default output format is identical to that dumped by bpf_snprintf_btf(), for example a "struct sk_buff" representation would look like this: struct sk_buff){ (union){ (struct){ .next = (struct sk_buff *)0xffffffffffffffff, .prev = (struct sk_buff *)0xffffffffffffffff, (union){ .dev = (struct net_device *)0xffffffffffffffff, .dev_scratch = (long unsigned int)18446744073709551615, }, }, ... If the data structure is larger than the *data_sz* number of bytes that are available in *data*, as much of the data as possible will be dumped and -E2BIG will be returned. This is useful as tracers will sometimes not be able to capture all of the data associated with a type; for example a "struct task_struct" is ~16k. Being able to specify that only a subset is available is important for such cases. On success, the amount of data dumped is returned. Signed-off-by: Alan Maguire <alan.maguire@oracle.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/1626362126-27775-2-git-send-email-alan.maguire@oracle.com
1 parent 334faa5 commit 920d16a

File tree

3 files changed

+834
-5
lines changed

3 files changed

+834
-5
lines changed

tools/lib/bpf/btf.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,25 @@ LIBBPF_API int
184184
btf_dump__emit_type_decl(struct btf_dump *d, __u32 id,
185185
const struct btf_dump_emit_type_decl_opts *opts);
186186

187+
188+
struct btf_dump_type_data_opts {
189+
/* size of this struct, for forward/backward compatibility */
190+
size_t sz;
191+
const char *indent_str;
192+
int indent_level;
193+
/* below match "show" flags for bpf_show_snprintf() */
194+
bool compact; /* no newlines/indentation */
195+
bool skip_names; /* skip member/type names */
196+
bool emit_zeroes; /* show 0-valued fields */
197+
size_t :0;
198+
};
199+
#define btf_dump_type_data_opts__last_field emit_zeroes
200+
201+
LIBBPF_API int
202+
btf_dump__dump_type_data(struct btf_dump *d, __u32 id,
203+
const void *data, size_t data_sz,
204+
const struct btf_dump_type_data_opts *opts);
205+
187206
/*
188207
* A set of helpers for easier BTF types handling
189208
*/

0 commit comments

Comments
 (0)