diff options
Diffstat (limited to 'tools/bpf/bpftool/link.c')
| -rw-r--r-- | tools/bpf/bpftool/link.c | 45 | 
1 files changed, 28 insertions, 17 deletions
| diff --git a/tools/bpf/bpftool/link.c b/tools/bpf/bpftool/link.c index 8cc3e36f8cc6..2c258db0d352 100644 --- a/tools/bpf/bpftool/link.c +++ b/tools/bpf/bpftool/link.c @@ -7,6 +7,7 @@  #include <unistd.h>  #include <bpf/bpf.h> +#include <bpf/hashmap.h>  #include "json_writer.h"  #include "main.h" @@ -20,6 +21,8 @@ static const char * const link_type_name[] = {  	[BPF_LINK_TYPE_NETNS]			= "netns",  }; +static struct hashmap *link_table; +  static int link_parse_fd(int *argc, char ***argv)  {  	int fd; @@ -156,19 +159,18 @@ static int show_link_close_json(int fd, struct bpf_link_info *info)  		break;  	} -	if (!hash_empty(link_table.table)) { -		struct pinned_obj *obj; +	if (!hashmap__empty(link_table)) { +		struct hashmap_entry *entry;  		jsonw_name(json_wtr, "pinned");  		jsonw_start_array(json_wtr); -		hash_for_each_possible(link_table.table, obj, hash, info->id) { -			if (obj->id == info->id) -				jsonw_string(json_wtr, obj->path); -		} +		hashmap__for_each_key_entry(link_table, entry, +					    u32_as_hash_field(info->id)) +			jsonw_string(json_wtr, entry->value);  		jsonw_end_array(json_wtr);  	} -	emit_obj_refs_json(&refs_table, info->id, json_wtr); +	emit_obj_refs_json(refs_table, info->id, json_wtr);  	jsonw_end_object(json_wtr); @@ -244,15 +246,14 @@ static int show_link_close_plain(int fd, struct bpf_link_info *info)  		break;  	} -	if (!hash_empty(link_table.table)) { -		struct pinned_obj *obj; +	if (!hashmap__empty(link_table)) { +		struct hashmap_entry *entry; -		hash_for_each_possible(link_table.table, obj, hash, info->id) { -			if (obj->id == info->id) -				printf("\n\tpinned %s", obj->path); -		} +		hashmap__for_each_key_entry(link_table, entry, +					    u32_as_hash_field(info->id)) +			printf("\n\tpinned %s", (char *)entry->value);  	} -	emit_obj_refs_plain(&refs_table, info->id, "\n\tpids "); +	emit_obj_refs_plain(refs_table, info->id, "\n\tpids ");  	printf("\n"); @@ -302,8 +303,15 @@ static int do_show(int argc, char **argv)  	__u32 id = 0;  	int err, fd; -	if (show_pinned) -		build_pinned_obj_table(&link_table, BPF_OBJ_LINK); +	if (show_pinned) { +		link_table = hashmap__new(hash_fn_for_key_as_id, +					  equal_fn_for_key_as_id, NULL); +		if (!link_table) { +			p_err("failed to create hashmap for pinned paths"); +			return -1; +		} +		build_pinned_obj_table(link_table, BPF_OBJ_LINK); +	}  	build_obj_refs_table(&refs_table, BPF_OBJ_LINK);  	if (argc == 2) { @@ -344,7 +352,10 @@ static int do_show(int argc, char **argv)  	if (json_output)  		jsonw_end_array(json_wtr); -	delete_obj_refs_table(&refs_table); +	delete_obj_refs_table(refs_table); + +	if (show_pinned) +		delete_pinned_obj_table(link_table);  	return errno == ENOENT ? 0 : -1;  } |