bpftool: Dump map id instead of value for map_of_maps types
authorXueming Feng <kuro@kuroa.me>
Thu, 27 Apr 2023 12:03:13 +0000 (20:03 +0800)
committerMartin KaFai Lau <martin.lau@kernel.org>
Thu, 27 Apr 2023 20:26:34 +0000 (13:26 -0700)
When using `bpftool map dump` with map_of_maps, it is usually
more convenient to show the inner map id instead of raw value.

We are changing the plain print behavior to show inner_map_id
instead of hex value, this would help with quick look up of
inner map with `bpftool map dump id <inner_map_id>`.
To avoid disrupting scripted behavior, we will add a new
`inner_map_id` field to json output instead of replacing value.

plain print:
```
$ bpftool map dump id 138

Without Patch:
key:
fc 00 00 00 00 00 00 00  00 00 00 00 00 00 00 05
27 16 06 00
value:
8b 00 00 00
Found 1 element

With Patch:
key:
fc 00 00 00 00 00 00 00  00 00 00 00 00 00 00 05
27 16 06 00
inner_map_id:
139
Found 1 element
```

json print:
```
$ bpftool -p map dump id 567

Without Patch:
[{
        "key": ["0xc0","0x00","0x02","0x05","0x27","0x16","0x06","0x00"
        ],
        "value": ["0x38","0x02","0x00","0x00"
        ]
    }
]

With Patch:
[{
        "key": ["0xc0","0x00","0x02","0x05","0x27","0x16","0x06","0x00"
        ],
        "value": ["0x38","0x02","0x00","0x00"
        ],
        "inner_map_id": 568
    }
]
```

Signed-off-by: Xueming Feng <kuro@kuroa.me>
Acked-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/r/20230427120313.43574-1-kuro@kuroa.me
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
tools/bpf/bpftool/map.c

index aaeb893..ae9e822 100644 (file)
@@ -139,6 +139,9 @@ static void print_entry_json(struct bpf_map_info *info, unsigned char *key,
                print_hex_data_json(key, info->key_size);
                jsonw_name(json_wtr, "value");
                print_hex_data_json(value, info->value_size);
+               if (map_is_map_of_maps(info->type))
+                       jsonw_uint_field(json_wtr, "inner_map_id",
+                                        *(unsigned int *)value);
                if (btf) {
                        struct btf_dumper d = {
                                .btf = btf,
@@ -259,8 +262,13 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,
                }
 
                if (info->value_size) {
-                       printf("value:%c", break_names ? '\n' : ' ');
-                       fprint_hex(stdout, value, info->value_size, " ");
+                       if (map_is_map_of_maps(info->type)) {
+                               printf("inner_map_id:%c", break_names ? '\n' : ' ');
+                               printf("%u ", *(unsigned int *)value);
+                       } else {
+                               printf("value:%c", break_names ? '\n' : ' ');
+                               fprint_hex(stdout, value, info->value_size, " ");
+                       }
                }
 
                printf("\n");