bpftool: Improve handling of ENOENT on map dumps
Subsystems (4)
PATCH 1/1 bpftool: Improve handling of ENOENT on map dumps
From: David Ahern <[email protected]>
bpftool output is not user friendly when dumping a map with only a few populated entries:
$ bpftool map
1: devmap name tx_devmap flags 0x0
key 4B value 4B max_entries 64 memlock 4096B
2: array name tx_idxmap flags 0x0
key 4B value 4B max_entries 64 memlock 4096B $ bpftool map dump id 1
key:
00 00 00 00
value:
No such file or directory
key:
01 00 00 00
value:
No such file or directory
key:
02 00 00 00
value:
No such file or directory
key: 03 00 00 00 value: 03 00 00 00Handle ENOENT by keeping the line format sane and dumping "<no entry>" for the value
$ bpftool map dump id 1
key: 00 00 00 00 value: <no entry>
key: 01 00 00 00 value: <no entry>
key: 02 00 00 00 value: <no entry>
key: 03 00 00 00 value: 03 00 00 00
...---
Alternatively, could just omit the value, so:
key: 00 00 00 00 value:
key: 01 00 00 00 value:
key: 02 00 00 00 value:
key: 03 00 00 00 value: 03 00 00 00
tools/bpf/bpftool/map.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)
tools/bpf/bpftool/map.c +15 -4
@@ -383,7 +383,10 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,printf (single_line ?" " :"\n" );printf ("value:%c" , break_names ?'\n' :' ' ); -fprint_hex (stdout, value, info->value_size," " ); +if (value) +fprint_hex (stdout, value, info->value_size," " ); +else +printf ("<no entry>" );printf ("\n" ); }else {
@@ -398,8 +401,12 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,for (i =0 ; i < n; i++) {printf ("value (CPU %02d):%c" , i, info->value_size >16 ?'\n' :' ' ); -fprint_hex (stdout, value + i * step, - info->value_size," " ); +if (value) { +fprint_hex (stdout, value + i * step, + info->value_size," " ); + }else { +printf ("<no entry>" ); + }printf ("\n" ); } }
@@ -731,7 +738,11 @@ static int dump_map_elem(int fd, void *key, void *value,jsonw_string_field (json_wtr,"error" ,strerror (lookup_errno));jsonw_end_object (json_wtr); }else { -print_entry_error (map_info, key,strerror (lookup_errno)); +if (errno ==ENOENT ) +print_entry_plain (map_info, key,NULL ); +else +print_entry_error (map_info, key, +strerror (lookup_errno)); }return 0 ;
Signature · 1 line
2.11.0
Quoted 29 lines · David Ahern
From: David Ahern <[email protected]>
bpftool output is not user friendly when dumping a map with only a few populated entries:
$ bpftool map 1: devmap name tx_devmap flags 0x0 key 4B value 4B max_entries 64 memlock 4096B 2: array name tx_idxmap flags 0x0 key 4B value 4B max_entries 64 memlock 4096B$ bpftool map dump id 1 key: 00 00 00 00 value: No such file or directory key: 01 00 00 00 value: No such file or directory key: 02 00 00 00 value: No such file or directory key: 03 00 00 00 value: 03 00 00 00Handle ENOENT by keeping the line format sane and dumping "<no entry>" for the value
Quoted 8 lines
$ bpftool map dump id 1 key: 00 00 00 00 value: <no entry> key: 01 00 00 00 value: <no entry> key: 02 00 00 00 value: <no entry> key: 03 00 00 00 value: 03 00 00 00 ...Signed-off-by David Ahern <[email protected]>
Seems good. I wonder why "fd" maps report all indexes in get_next..
Quoted 27 lines
Alternatively, could just omit the value, so:
key: 00 00 00 00 value:
key: 01 00 00 00 value:
key: 02 00 00 00 value:
key: 03 00 00 00 value: 03 00 00 00tools/bpf/bpftool/map.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)tools/bpf/bpftool/map.c +4
-1@@ -383,7 +383,10 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,printf (single_line ?" " :"\n" );printf ("value:%c" , break_names ?'\n' :' ' ); -fprint_hex (stdout, value, info->value_size," " ); +if (value) +fprint_hex (stdout, value, info->value_size," " ); +else +printf ("<no entry>" );printf ("\n" ); }else {@@ -398,8 +401,12 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,for (i =0 ; i < n; i++) {
tools/bpf/bpftool/map.c static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, · line 409
Quoted 10 lines
tools/bpf/bpftool/map.c +6
-2printf ("value (CPU %02d):%c" , i, info->value_size >16 ?'\n' :' ' ); -fprint_hex (stdout, value + i * step, - info->value_size," " ); +if (value) { +fprint_hex (stdout, value + i * step, + info->value_size," " ); + }else { +printf ("<no entry>" ); + }
nit: in other places you don't add { }
Quoted 16 lines
tools/bpf/bpftool/map.c +5
-1printf ("\n" ); } }@@ -731,7 +738,11 @@ static int dump_map_elem(int fd, void *key, void *value,jsonw_string_field (json_wtr,"error" ,strerror (lookup_errno));jsonw_end_object (json_wtr); }else { -print_entry_error (map_info, key,strerror (lookup_errno)); +if (errno ==ENOENT ) +print_entry_plain (map_info, key,NULL ); +else +print_entry_error (map_info, key, +strerror (lookup_errno)); }return 0 ;
Quoted 66 lines · Jakub Kicinski
Quoted 29 lines · David Ahern
From: David Ahern <[email protected]>
bpftool output is not user friendly when dumping a map with only a few populated entries:
$ bpftool map 1: devmap name tx_devmap flags 0x0 key 4B value 4B max_entries 64 memlock 4096B 2: array name tx_idxmap flags 0x0 key 4B value 4B max_entries 64 memlock 4096B$ bpftool map dump id 1 key: 00 00 00 00 value: No such file or directory key: 01 00 00 00 value: No such file or directory key: 02 00 00 00 value: No such file or directory key: 03 00 00 00 value: 03 00 00 00Handle ENOENT by keeping the line format sane and dumping "<no entry>" for the value
Quoted 8 lines
$ bpftool map dump id 1 key: 00 00 00 00 value: <no entry> key: 01 00 00 00 value: <no entry> key: 02 00 00 00 value: <no entry> key: 03 00 00 00 value: 03 00 00 00 ...Signed-off-by David Ahern <[email protected]>Seems good. I wonder why "fd" maps report all indexes in
get_next..Acked-by Jakub Kicinski <[email protected]>Quoted 23 lines
Alternatively, could just omit the value, so:
key: 00 00 00 00 value:
key: 01 00 00 00 value:
key: 02 00 00 00 value:
key: 03 00 00 00 value: 03 00 00 00tools/bpf/bpftool/map.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)tools/bpf/bpftool/map.c +4
-1@@ -383,7 +383,10 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,printf (single_line ?" " :"\n" );printf ("value:%c" , break_names ?'\n' :' ' ); -fprint_hex (stdout, value, info->value_size," " ); +if (value) +fprint_hex (stdout, value, info->value_size," " ); +else +printf ("<no entry>" );
Quoted 16 lines
Quoted 4 lines
tools/bpf/bpftool/map.c +0
-0printf ("\n" ); }else {@@ -398,8 +401,12 @@ static void print_entry_plain(struct bpf_map_info *info, unsigned char *key,for (i =0 ; i < n; i++) {tools/bpf/bpftool/map.c static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, · line 409
Quoted 10 lines
tools/bpf/bpftool/map.c +6
-2printf ("value (CPU %02d):%c" , i, info->value_size >16 ?'\n' :' ' ); -fprint_hex (stdout, value + i * step, - info->value_size," " ); +if (value) { +fprint_hex (stdout, value + i * step, + info->value_size," " ); + }else { +printf ("<no entry>" ); + }nit: in other places you don't add { }
Applied to bpf-next and fixed this nit up while doing so, thanks everyone!