diff options
Diffstat (limited to 'tools/bpf/bpftool/map.c')
| -rw-r--r-- | tools/bpf/bpftool/map.c | 67 | 
1 files changed, 62 insertions, 5 deletions
diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index 5da5a7311f13..de61d73b9030 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c @@ -37,6 +37,7 @@ const char * const map_type_name[] = {  	[BPF_MAP_TYPE_ARRAY_OF_MAPS]		= "array_of_maps",  	[BPF_MAP_TYPE_HASH_OF_MAPS]		= "hash_of_maps",  	[BPF_MAP_TYPE_DEVMAP]			= "devmap", +	[BPF_MAP_TYPE_DEVMAP_HASH]		= "devmap_hash",  	[BPF_MAP_TYPE_SOCKMAP]			= "sockmap",  	[BPF_MAP_TYPE_CPUMAP]			= "cpumap",  	[BPF_MAP_TYPE_XSKMAP]			= "xskmap", @@ -480,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); @@ -532,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); @@ -554,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)) @@ -609,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; @@ -1237,6 +1262,35 @@ exit_free:  	return err;  } +static int do_freeze(int argc, char **argv) +{ +	int err, fd; + +	if (!REQ_ARGS(2)) +		return -1; + +	fd = map_parse_fd(&argc, &argv); +	if (fd < 0) +		return -1; + +	if (argc) { +		close(fd); +		return BAD_ARG(); +	} + +	err = bpf_map_freeze(fd); +	close(fd); +	if (err) { +		p_err("failed to freeze map: %s", strerror(errno)); +		return err; +	} + +	if (json_output) +		jsonw_null(json_wtr); + +	return 0; +} +  static int do_help(int argc, char **argv)  {  	if (json_output) { @@ -1261,6 +1315,7 @@ static int do_help(int argc, char **argv)  		"       %s %s pop        MAP\n"  		"       %s %s enqueue    MAP value VALUE\n"  		"       %s %s dequeue    MAP\n" +		"       %s %s freeze     MAP\n"  		"       %s %s help\n"  		"\n"  		"       " HELP_SPEC_MAP "\n" @@ -1271,7 +1326,7 @@ static int do_help(int argc, char **argv)  		"       TYPE := { hash | array | prog_array | perf_event_array | percpu_hash |\n"  		"                 percpu_array | stack_trace | cgroup_array | lru_hash |\n"  		"                 lru_percpu_hash | lpm_trie | array_of_maps | hash_of_maps |\n" -		"                 devmap | sockmap | cpumap | xskmap | sockhash |\n" +		"                 devmap | devmap_hash | sockmap | cpumap | xskmap | sockhash |\n"  		"                 cgroup_storage | reuseport_sockarray | percpu_cgroup_storage }\n"  		"       " HELP_SPEC_OPTIONS "\n"  		"", @@ -1279,7 +1334,8 @@ static int do_help(int argc, char **argv)  		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],  		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],  		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], -		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2]); +		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], +		bin_name, argv[-2]);  	return 0;  } @@ -1301,6 +1357,7 @@ static const struct cmd cmds[] = {  	{ "enqueue",	do_update },  	{ "pop",	do_pop_dequeue },  	{ "dequeue",	do_pop_dequeue }, +	{ "freeze",	do_freeze },  	{ 0 }  };  |