From cb3a15fe21b49c4b11f307882a828bfe99a37c4e Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Wed, 16 May 2018 10:58:32 +0000 Subject: [PATCH] bpf: use indexed lookups where appropriate * xlat/bpf_attach_type.in: Add "#value_indexed" directive. * xlat/bpf_class.in: Likewise. * xlat/bpf_map_types.in: Likewise. * xlat/bpf_map_update_elem_flags.in: Likewise. * xlat/bpf_prog_types.in: Likewise. * xlat/ebpf_class.in: Likewise. * bpf_filter.c (print_bpf_filter_code): Use printxval_index instead of printxval for decoding bpf_class and ebpf_class. * print_fields.h (PRINT_FIELD_XVAL_INDEX): New macro. * bpf.c: Use it instead of PRINT_FIELD_XVAL for decoding bpf_attach_type, bpf_map_types, bpf_map_update_elem_flags, and bpf_prog_types. --- bpf.c | 22 ++++++++++++---------- bpf_filter.c | 7 ++++--- print_fields.h | 8 ++++++++ xlat/bpf_attach_type.in | 1 + xlat/bpf_class.in | 1 + xlat/bpf_map_types.in | 1 + xlat/bpf_map_update_elem_flags.in | 1 + xlat/bpf_prog_types.in | 1 + xlat/ebpf_class.in | 1 + 9 files changed, 30 insertions(+), 13 deletions(-) diff --git a/bpf.c b/bpf.c index b915303f..a1eb635b 100644 --- a/bpf.c +++ b/bpf.c @@ -128,8 +128,8 @@ decode_attr_extra_data(struct tcb *const tcp, BEGIN_BPF_CMD_DECODER(BPF_MAP_CREATE) { - PRINT_FIELD_XVAL("{", attr, map_type, bpf_map_types, - "BPF_MAP_TYPE_???"); + PRINT_FIELD_XVAL_INDEX("{", attr, map_type, bpf_map_types, + "BPF_MAP_TYPE_???"); PRINT_FIELD_U(", ", attr, key_size); PRINT_FIELD_U(", ", attr, value_size); PRINT_FIELD_U(", ", attr, max_entries); @@ -198,8 +198,8 @@ BEGIN_BPF_CMD_DECODER(BPF_MAP_UPDATE_ELEM) PRINT_FIELD_FD("{", attr, map_fd, tcp); PRINT_FIELD_ADDR64(", ", attr, key); PRINT_FIELD_ADDR64(", ", attr, value); - PRINT_FIELD_XVAL(", ", attr, flags, bpf_map_update_elem_flags, - "BPF_???"); + PRINT_FIELD_XVAL_INDEX(", ", attr, flags, bpf_map_update_elem_flags, + "BPF_???"); } END_BPF_CMD_DECODER(RVAL_DECODED) @@ -220,8 +220,8 @@ END_BPF_CMD_DECODER(RVAL_DECODED) BEGIN_BPF_CMD_DECODER(BPF_PROG_LOAD) { - PRINT_FIELD_XVAL("{", attr, prog_type, bpf_prog_types, - "BPF_PROG_TYPE_???"); + PRINT_FIELD_XVAL_INDEX("{", attr, prog_type, bpf_prog_types, + "BPF_PROG_TYPE_???"); PRINT_FIELD_U(", ", attr, insn_cnt); PRINT_FIELD_ADDR64(", ", attr, insns); @@ -290,7 +290,8 @@ BEGIN_BPF_CMD_DECODER(BPF_PROG_ATTACH) { PRINT_FIELD_FD("{", attr, target_fd, tcp); PRINT_FIELD_FD(", ", attr, attach_bpf_fd, tcp); - PRINT_FIELD_XVAL(", ", attr, attach_type, bpf_attach_type, "BPF_???"); + PRINT_FIELD_XVAL_INDEX(", ", attr, attach_type, bpf_attach_type, + "BPF_???"); PRINT_FIELD_FLAGS(", ", attr, attach_flags, bpf_attach_flags, "BPF_F_???"); } @@ -299,7 +300,8 @@ END_BPF_CMD_DECODER(RVAL_DECODED) BEGIN_BPF_CMD_DECODER(BPF_PROG_DETACH) { PRINT_FIELD_FD("{", attr, target_fd, tcp); - PRINT_FIELD_XVAL(", ", attr, attach_type, bpf_attach_type, "BPF_???"); + PRINT_FIELD_XVAL_INDEX(", ", attr, attach_type, bpf_attach_type, + "BPF_???"); } END_BPF_CMD_DECODER(RVAL_DECODED) @@ -373,8 +375,8 @@ BEGIN_BPF_CMD_DECODER(BPF_PROG_QUERY) if (entering(tcp)) { PRINT_FIELD_FD("{query={", attr, target_fd, tcp); - PRINT_FIELD_XVAL(", ", attr, attach_type, bpf_attach_type, - "BPF_???"); + PRINT_FIELD_XVAL_INDEX(", ", attr, attach_type, bpf_attach_type, + "BPF_???"); PRINT_FIELD_FLAGS(", ", attr, query_flags, bpf_query_flags, "BPF_F_QUERY_???"); PRINT_FIELD_FLAGS(", ", attr, attach_flags, bpf_attach_flags, diff --git a/bpf_filter.c b/bpf_filter.c index 8936f7e0..a5ea0e3b 100644 --- a/bpf_filter.c +++ b/bpf_filter.c @@ -53,12 +53,13 @@ void print_bpf_filter_code(const uint16_t code, bool extended) { - const struct xlat *class = extended ? ebpf_class : bpf_class; const struct xlat *mode = extended ? ebpf_mode : bpf_mode; - uint16_t i = code & ~BPF_CLASS(code); - printxval(class, BPF_CLASS(code), "BPF_???"); + if (extended) + printxval_index(ebpf_class, BPF_CLASS(code), "BPF_???"); + else + printxval_index(bpf_class, BPF_CLASS(code), "BPF_???"); switch (BPF_CLASS(code)) { case BPF_ST: case BPF_STX: diff --git a/print_fields.h b/print_fields.h index ff3ebbc3..2e025768 100644 --- a/print_fields.h +++ b/print_fields.h @@ -99,6 +99,14 @@ (xlat_), NULL); \ } while (0) +#define PRINT_FIELD_XVAL_INDEX(prefix_, where_, field_, xlat_, dflt_) \ + do { \ + STRACE_PRINTF("%s%s=", (prefix_), #field_); \ + printxval_index((xlat_), \ + zero_extend_signed_to_ull((where_).field_), \ + (dflt_)); \ + } while (0) + /* * Generic "ID" printing. ID is considered unsigned except for the special value * of -1. diff --git a/xlat/bpf_attach_type.in b/xlat/bpf_attach_type.in index ad912b7f..2f78992d 100644 --- a/xlat/bpf_attach_type.in +++ b/xlat/bpf_attach_type.in @@ -1,3 +1,4 @@ +#value_indexed BPF_CGROUP_INET_INGRESS 0 BPF_CGROUP_INET_EGRESS 1 BPF_CGROUP_INET_SOCK_CREATE 2 diff --git a/xlat/bpf_class.in b/xlat/bpf_class.in index 8088cba5..69f6d166 100644 --- a/xlat/bpf_class.in +++ b/xlat/bpf_class.in @@ -1,3 +1,4 @@ +#value_indexed BPF_LD 0x0 BPF_LDX 0x1 BPF_ST 0x2 diff --git a/xlat/bpf_map_types.in b/xlat/bpf_map_types.in index 3f74d2a8..99b08c82 100644 --- a/xlat/bpf_map_types.in +++ b/xlat/bpf_map_types.in @@ -1,3 +1,4 @@ +#value_indexed BPF_MAP_TYPE_UNSPEC 0 BPF_MAP_TYPE_HASH 1 BPF_MAP_TYPE_ARRAY 2 diff --git a/xlat/bpf_map_update_elem_flags.in b/xlat/bpf_map_update_elem_flags.in index 6b1d61fc..e9322ea6 100644 --- a/xlat/bpf_map_update_elem_flags.in +++ b/xlat/bpf_map_update_elem_flags.in @@ -1,3 +1,4 @@ +#value_indexed BPF_ANY 0 BPF_NOEXIST 1 BPF_EXIST 2 diff --git a/xlat/bpf_prog_types.in b/xlat/bpf_prog_types.in index 8038c9ec..f57a6993 100644 --- a/xlat/bpf_prog_types.in +++ b/xlat/bpf_prog_types.in @@ -1,3 +1,4 @@ +#value_indexed BPF_PROG_TYPE_UNSPEC 0 BPF_PROG_TYPE_SOCKET_FILTER 1 BPF_PROG_TYPE_KPROBE 2 diff --git a/xlat/ebpf_class.in b/xlat/ebpf_class.in index 8a0e11a9..c1a82fc2 100644 --- a/xlat/ebpf_class.in +++ b/xlat/ebpf_class.in @@ -1,3 +1,4 @@ +#value_indexed BPF_LD 0x0 BPF_LDX 0x1 BPF_ST 0x2 -- 2.40.0