For prog array maps, the type of the owner program, and the JIT-ed state
of that program, are available from the file descriptor information
under /proc. Add them to "bpftool map show" output. Example output:

    # bpftool map show
    158225: prog_array  name jmp_table  flags 0x0
        key 4B  value 4B  max_entries 8  memlock 4096B
        owner_prog_type flow_dissector  owner jited
    # bpftool --json --pretty map show
    [{
            "id": 1337,
            "type": "prog_array",
            "name": "jmp_table",
            "flags": 0,
            "bytes_key": 4,
            "bytes_value": 4,
            "max_entries": 8,
            "bytes_memlock": 4096,
            "owner_prog_type": "flow_dissector",
            "owner_jited": true
        }
    ]

As we move the table used for associating names to program types,
complete it with the missing types (lwt_seg6local and sk_reuseport).
Also add missing types to the help message for "bpftool prog"
(sk_reuseport and flow_dissector).

Suggested-by: Daniel Borkmann <dan...@iogearbox.net>
Signed-off-by: Quentin Monnet <quentin.mon...@netronome.com>
Acked-by: Jakub Kicinski <jakub.kicin...@netronome.com>
---
 tools/bpf/bpftool/main.h | 26 +++++++++++++++++++++++++
 tools/bpf/bpftool/map.c  | 50 ++++++++++++++++++++++++++++++++++++++++++++++--
 tools/bpf/bpftool/prog.c | 25 +-----------------------
 3 files changed, 75 insertions(+), 26 deletions(-)

diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h
index 7431669fae0a..2761981669c8 100644
--- a/tools/bpf/bpftool/main.h
+++ b/tools/bpf/bpftool/main.h
@@ -78,6 +78,32 @@
 #define HELP_SPEC_MAP                                                  \
        "MAP := { id MAP_ID | pinned FILE }"
 
+static const char * const prog_type_name[] = {
+       [BPF_PROG_TYPE_UNSPEC]                  = "unspec",
+       [BPF_PROG_TYPE_SOCKET_FILTER]           = "socket_filter",
+       [BPF_PROG_TYPE_KPROBE]                  = "kprobe",
+       [BPF_PROG_TYPE_SCHED_CLS]               = "sched_cls",
+       [BPF_PROG_TYPE_SCHED_ACT]               = "sched_act",
+       [BPF_PROG_TYPE_TRACEPOINT]              = "tracepoint",
+       [BPF_PROG_TYPE_XDP]                     = "xdp",
+       [BPF_PROG_TYPE_PERF_EVENT]              = "perf_event",
+       [BPF_PROG_TYPE_CGROUP_SKB]              = "cgroup_skb",
+       [BPF_PROG_TYPE_CGROUP_SOCK]             = "cgroup_sock",
+       [BPF_PROG_TYPE_LWT_IN]                  = "lwt_in",
+       [BPF_PROG_TYPE_LWT_OUT]                 = "lwt_out",
+       [BPF_PROG_TYPE_LWT_XMIT]                = "lwt_xmit",
+       [BPF_PROG_TYPE_SOCK_OPS]                = "sock_ops",
+       [BPF_PROG_TYPE_SK_SKB]                  = "sk_skb",
+       [BPF_PROG_TYPE_CGROUP_DEVICE]           = "cgroup_device",
+       [BPF_PROG_TYPE_SK_MSG]                  = "sk_msg",
+       [BPF_PROG_TYPE_RAW_TRACEPOINT]          = "raw_tracepoint",
+       [BPF_PROG_TYPE_CGROUP_SOCK_ADDR]        = "cgroup_sock_addr",
+       [BPF_PROG_TYPE_LWT_SEG6LOCAL]           = "lwt_seg6local",
+       [BPF_PROG_TYPE_LIRC_MODE2]              = "lirc_mode2",
+       [BPF_PROG_TYPE_SK_REUSEPORT]            = "sk_reuseport",
+       [BPF_PROG_TYPE_FLOW_DISSECTOR]          = "flow_dissector",
+};
+
 enum bpf_obj_type {
        BPF_OBJ_UNKNOWN,
        BPF_OBJ_PROG,
diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c
index 3850f8d65703..8469ea6cf1c8 100644
--- a/tools/bpf/bpftool/map.c
+++ b/tools/bpf/bpftool/map.c
@@ -487,7 +487,6 @@ static int show_map_close_json(int fd, struct bpf_map_info 
*info)
        char *memlock;
 
        memlock = get_fdinfo(fd, "memlock");
-       close(fd);
 
        jsonw_start_object(json_wtr);
 
@@ -514,6 +513,30 @@ static int show_map_close_json(int fd, struct bpf_map_info 
*info)
                jsonw_int_field(json_wtr, "bytes_memlock", atoi(memlock));
        free(memlock);
 
+       if (info->type == BPF_MAP_TYPE_PROG_ARRAY) {
+               char *owner_prog_type = get_fdinfo(fd, "owner_prog_type");
+               char *owner_jited = get_fdinfo(fd, "owner_jited");
+
+               if (owner_prog_type) {
+                       unsigned int prog_type = atoi(owner_prog_type);
+
+                       if (prog_type < ARRAY_SIZE(prog_type_name))
+                               jsonw_string_field(json_wtr, "owner_prog_type",
+                                                  prog_type_name[prog_type]);
+                       else
+                               jsonw_uint_field(json_wtr, "owner_prog_type",
+                                                prog_type);
+               }
+               if (atoi(owner_jited))
+                       jsonw_bool_field(json_wtr, "owner_jited", true);
+               else
+                       jsonw_bool_field(json_wtr, "owner_jited", false);
+
+               free(owner_prog_type);
+               free(owner_jited);
+       }
+       close(fd);
+
        if (!hash_empty(map_table.table)) {
                struct pinned_obj *obj;
 
@@ -536,7 +559,6 @@ static int show_map_close_plain(int fd, struct bpf_map_info 
*info)
        char *memlock;
 
        memlock = get_fdinfo(fd, "memlock");
-       close(fd);
 
        printf("%u: ", info->id);
        if (info->type < ARRAY_SIZE(map_type_name))
@@ -557,6 +579,30 @@ static int show_map_close_plain(int fd, struct 
bpf_map_info *info)
                printf("  memlock %sB", memlock);
        free(memlock);
 
+       if (info->type == BPF_MAP_TYPE_PROG_ARRAY) {
+               char *owner_prog_type = get_fdinfo(fd, "owner_prog_type");
+               char *owner_jited = get_fdinfo(fd, "owner_jited");
+
+               printf("\n\t");
+               if (owner_prog_type) {
+                       unsigned int prog_type = atoi(owner_prog_type);
+
+                       if (prog_type < ARRAY_SIZE(prog_type_name))
+                               printf("owner_prog_type %s  ",
+                                      prog_type_name[prog_type]);
+                       else
+                               printf("owner_prog_type %d  ", prog_type);
+               }
+               if (atoi(owner_jited))
+                       printf("owner jited");
+               else
+                       printf("owner not jited");
+
+               free(owner_prog_type);
+               free(owner_jited);
+       }
+       close(fd);
+
        printf("\n");
        if (!hash_empty(map_table.table)) {
                struct pinned_obj *obj;
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index 4e04699a2350..56db61c5a91f 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -54,30 +54,6 @@
 #include "main.h"
 #include "xlated_dumper.h"
 
-static const char * const prog_type_name[] = {
-       [BPF_PROG_TYPE_UNSPEC]          = "unspec",
-       [BPF_PROG_TYPE_SOCKET_FILTER]   = "socket_filter",
-       [BPF_PROG_TYPE_KPROBE]          = "kprobe",
-       [BPF_PROG_TYPE_SCHED_CLS]       = "sched_cls",
-       [BPF_PROG_TYPE_SCHED_ACT]       = "sched_act",
-       [BPF_PROG_TYPE_TRACEPOINT]      = "tracepoint",
-       [BPF_PROG_TYPE_XDP]             = "xdp",
-       [BPF_PROG_TYPE_PERF_EVENT]      = "perf_event",
-       [BPF_PROG_TYPE_CGROUP_SKB]      = "cgroup_skb",
-       [BPF_PROG_TYPE_CGROUP_SOCK]     = "cgroup_sock",
-       [BPF_PROG_TYPE_LWT_IN]          = "lwt_in",
-       [BPF_PROG_TYPE_LWT_OUT]         = "lwt_out",
-       [BPF_PROG_TYPE_LWT_XMIT]        = "lwt_xmit",
-       [BPF_PROG_TYPE_SOCK_OPS]        = "sock_ops",
-       [BPF_PROG_TYPE_SK_SKB]          = "sk_skb",
-       [BPF_PROG_TYPE_CGROUP_DEVICE]   = "cgroup_device",
-       [BPF_PROG_TYPE_SK_MSG]          = "sk_msg",
-       [BPF_PROG_TYPE_RAW_TRACEPOINT]  = "raw_tracepoint",
-       [BPF_PROG_TYPE_CGROUP_SOCK_ADDR] = "cgroup_sock_addr",
-       [BPF_PROG_TYPE_LIRC_MODE2]      = "lirc_mode2",
-       [BPF_PROG_TYPE_FLOW_DISSECTOR]  = "flow_dissector",
-};
-
 static const char * const attach_type_strings[] = {
        [BPF_SK_SKB_STREAM_PARSER] = "stream_parser",
        [BPF_SK_SKB_STREAM_VERDICT] = "stream_verdict",
@@ -1172,6 +1148,7 @@ static int do_help(int argc, char **argv)
                "                 tracepoint | raw_tracepoint | xdp | 
perf_event | cgroup/skb |\n"
                "                 cgroup/sock | cgroup/dev | lwt_in | lwt_out | 
lwt_xmit |\n"
                "                 lwt_seg6local | sockops | sk_skb | sk_msg | 
lirc_mode2 |\n"
+               "                 sk_reuseport | flow_dissector |\n"
                "                 cgroup/bind4 | cgroup/bind6 | 
cgroup/post_bind4 |\n"
                "                 cgroup/post_bind6 | cgroup/connect4 | 
cgroup/connect6 |\n"
                "                 cgroup/sendmsg4 | cgroup/sendmsg6 }\n"
-- 
2.7.4

Reply via email to