tools: bpftool: show frozen status for maps
authorQuentin Monnet <quentin.monnet@netronome.com>
Wed, 21 Aug 2019 08:52:18 +0000 (09:52 +0100)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 21 Aug 2019 19:17:27 +0000 (21:17 +0200)
When listing maps, read their "frozen" status from procfs, and tell if
maps are frozen.

As commit log for map freezing command mentions that the feature might
be extended with flags (e.g. for write-only instead of read-only) in the
future, use an integer and not a boolean for JSON output.

Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
tools/bpf/bpftool/map.c

index bfbbc6b4cb83c7c7db9029cebbd5f49118fb66a3..af2e9eb9747bbff04fc49efb9ada30fbb2d3cf46 100644 (file)
@@ -481,9 +481,11 @@ static int parse_elem(char **argv, struct bpf_map_info *info,
 
 static int show_map_close_json(int fd, struct bpf_map_info *info)
 {
-       char *memlock;
+       char *memlock, *frozen_str;
+       int frozen = 0;
 
        memlock = get_fdinfo(fd, "memlock");
+       frozen_str = get_fdinfo(fd, "frozen");
 
        jsonw_start_object(json_wtr);
 
@@ -533,6 +535,12 @@ static int show_map_close_json(int fd, struct bpf_map_info *info)
        }
        close(fd);
 
+       if (frozen_str) {
+               frozen = atoi(frozen_str);
+               free(frozen_str);
+       }
+       jsonw_int_field(json_wtr, "frozen", frozen);
+
        if (info->btf_id)
                jsonw_int_field(json_wtr, "btf_id", info->btf_id);
 
@@ -555,9 +563,11 @@ static int show_map_close_json(int fd, struct bpf_map_info *info)
 
 static int show_map_close_plain(int fd, struct bpf_map_info *info)
 {
-       char *memlock;
+       char *memlock, *frozen_str;
+       int frozen = 0;
 
        memlock = get_fdinfo(fd, "memlock");
+       frozen_str = get_fdinfo(fd, "frozen");
 
        printf("%u: ", info->id);
        if (info->type < ARRAY_SIZE(map_type_name))
@@ -610,9 +620,23 @@ static int show_map_close_plain(int fd, struct bpf_map_info *info)
                                printf("\n\tpinned %s", obj->path);
                }
        }
+       printf("\n");
+
+       if (frozen_str) {
+               frozen = atoi(frozen_str);
+               free(frozen_str);
+       }
+
+       if (!info->btf_id && !frozen)
+               return 0;
+
+       printf("\t");
 
        if (info->btf_id)
-               printf("\n\tbtf_id %d", info->btf_id);
+               printf("btf_id %d", info->btf_id);
+
+       if (frozen)
+               printf("%sfrozen", info->btf_id ? "  " : "");
 
        printf("\n");
        return 0;