]> granicus.if.org Git - strace/commitdiff
bpf: use indexed lookups where appropriate
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 16 May 2018 10:58:32 +0000 (10:58 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 16 May 2018 10:58:32 +0000 (10:58 +0000)
* 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
bpf_filter.c
print_fields.h
xlat/bpf_attach_type.in
xlat/bpf_class.in
xlat/bpf_map_types.in
xlat/bpf_map_update_elem_flags.in
xlat/bpf_prog_types.in
xlat/ebpf_class.in

diff --git a/bpf.c b/bpf.c
index b915303f84c87528b298acfd6b01a35011d33f14..a1eb635bd1abf979e77913a406402efd27864065 100644 (file)
--- 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,
index 8936f7e0b0da77181b71fa63a313436cef004842..a5ea0e3b6e46551a8a94793c9efbc931b90486de 100644 (file)
 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:
index ff3ebbc3fd32226017e84b33c68144c093785ee5..2e025768bfbbb025a63d003da237fd4b5fe3da9c 100644 (file)
                              (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.
index ad912b7f081760958837b4747f456f3f70ab91c5..2f78992d68186dba24112db3f962b38198105042 100644 (file)
@@ -1,3 +1,4 @@
+#value_indexed
 BPF_CGROUP_INET_INGRESS 0
 BPF_CGROUP_INET_EGRESS 1
 BPF_CGROUP_INET_SOCK_CREATE 2
index 8088cba5a7f164608683a1bd44780851badf873e..69f6d166662c0c5981f28e60f78626f58769b43b 100644 (file)
@@ -1,3 +1,4 @@
+#value_indexed
 BPF_LD         0x0
 BPF_LDX                0x1
 BPF_ST         0x2
index 3f74d2a88ca74794bed78334d1254e306cbecf9d..99b08c82d7e781a48b87cc137a9c77e900568065 100644 (file)
@@ -1,3 +1,4 @@
+#value_indexed
 BPF_MAP_TYPE_UNSPEC 0
 BPF_MAP_TYPE_HASH 1
 BPF_MAP_TYPE_ARRAY 2
index 6b1d61fc5b1e92e18d618c8fbbe8d2b3a4bf3c08..e9322ea6b402821b470f44be3f2f11f1701c0410 100644 (file)
@@ -1,3 +1,4 @@
+#value_indexed
 BPF_ANY 0
 BPF_NOEXIST 1
 BPF_EXIST 2
index 8038c9ecb2b2bbb60bc10c33105b176ff4620524..f57a6993f5705c0fc0fb1ed0417aea2d06fd45b6 100644 (file)
@@ -1,3 +1,4 @@
+#value_indexed
 BPF_PROG_TYPE_UNSPEC 0
 BPF_PROG_TYPE_SOCKET_FILTER 1
 BPF_PROG_TYPE_KPROBE 2
index 8a0e11a9dbcf9c9472922b03598536ac76114fae..c1a82fc251f43f295d2c78fb3694706da826618a 100644 (file)
@@ -1,3 +1,4 @@
+#value_indexed
 BPF_LD         0x0
 BPF_LDX                0x1
 BPF_ST         0x2