bpf: Move to generic BTF show support, apply it to seq files/strings
generalize the "seq_show" seq file support in btf.c to support a generic show callback of which we support two instances; the current seq file show, and a show with snprintf() behaviour which instead writes the type data to a supplied string. Both classes of show function call btf_type_show() with different targets; the seq file or the string to be written. In the string case we need to track additional data - length left in string to write and length to return that we would have written (a la snprintf). By default show will display type information, field members and their types and values etc, and the information is indented based upon structure depth. Zeroed fields are omitted. Show however supports flags which modify its behaviour: BTF_SHOW_COMPACT - suppress newline/indent. BTF_SHOW_NONAME - suppress show of type and member names. BTF_SHOW_PTR_RAW - do not obfuscate pointer values. BTF_SHOW_UNSAFE - do not copy data to safe buffer before display. BTF_SHOW_ZERO - show zeroed values (by default they are not shown). Signed-off-by: Alan Maguire <alan.maguire@oracle.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/1601292670-1616-3-git-send-email-alan.maguire@oracle.com
This commit is contained in:
Родитель
76654e67f3
Коммит
31d0bc8163
|
@ -13,6 +13,7 @@ struct btf;
|
|||
struct btf_member;
|
||||
struct btf_type;
|
||||
union bpf_attr;
|
||||
struct btf_show;
|
||||
|
||||
extern const struct file_operations btf_fops;
|
||||
|
||||
|
@ -46,8 +47,43 @@ int btf_get_info_by_fd(const struct btf *btf,
|
|||
const struct btf_type *btf_type_id_size(const struct btf *btf,
|
||||
u32 *type_id,
|
||||
u32 *ret_size);
|
||||
|
||||
/*
|
||||
* Options to control show behaviour.
|
||||
* - BTF_SHOW_COMPACT: no formatting around type information
|
||||
* - BTF_SHOW_NONAME: no struct/union member names/types
|
||||
* - BTF_SHOW_PTR_RAW: show raw (unobfuscated) pointer values;
|
||||
* equivalent to %px.
|
||||
* - BTF_SHOW_ZERO: show zero-valued struct/union members; they
|
||||
* are not displayed by default
|
||||
* - BTF_SHOW_UNSAFE: skip use of bpf_probe_read() to safely read
|
||||
* data before displaying it.
|
||||
*/
|
||||
#define BTF_SHOW_COMPACT (1ULL << 0)
|
||||
#define BTF_SHOW_NONAME (1ULL << 1)
|
||||
#define BTF_SHOW_PTR_RAW (1ULL << 2)
|
||||
#define BTF_SHOW_ZERO (1ULL << 3)
|
||||
#define BTF_SHOW_UNSAFE (1ULL << 4)
|
||||
|
||||
void btf_type_seq_show(const struct btf *btf, u32 type_id, void *obj,
|
||||
struct seq_file *m);
|
||||
|
||||
/*
|
||||
* Copy len bytes of string representation of obj of BTF type_id into buf.
|
||||
*
|
||||
* @btf: struct btf object
|
||||
* @type_id: type id of type obj points to
|
||||
* @obj: pointer to typed data
|
||||
* @buf: buffer to write to
|
||||
* @len: maximum length to write to buf
|
||||
* @flags: show options (see above)
|
||||
*
|
||||
* Return: length that would have been/was copied as per snprintf, or
|
||||
* negative error.
|
||||
*/
|
||||
int btf_type_snprintf_show(const struct btf *btf, u32 type_id, void *obj,
|
||||
char *buf, int len, u64 flags);
|
||||
|
||||
int btf_get_fd_by_id(u32 id);
|
||||
u32 btf_id(const struct btf *btf);
|
||||
bool btf_member_is_reg_int(const struct btf *btf, const struct btf_type *s,
|
||||
|
|
1015
kernel/bpf/btf.c
1015
kernel/bpf/btf.c
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Загрузка…
Ссылка в новой задаче