forked from mirrors/linux
		
	tools: bpftool: add owner_prog_type and owner_jited to bpftool output
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 <daniel@iogearbox.net>
Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									73f0b9db53
								
							
						
					
					
						commit
						99a44bef58
					
				
					 3 changed files with 75 additions and 26 deletions
				
			
		|  | @ -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, | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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" | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Quentin Monnet
						Quentin Monnet