diff options
Diffstat (limited to 'tools/bpf/bpftool/common.c')
| -rw-r--r-- | tools/bpf/bpftool/common.c | 50 | 
1 files changed, 30 insertions, 20 deletions
| diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index d42d930a3ec4..511eccdbdfe6 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -22,6 +22,7 @@  #include <sys/vfs.h>  #include <bpf/bpf.h> +#include <bpf/hashmap.h>  #include <bpf/libbpf.h> /* libbpf_num_possible_cpus */  #include "main.h" @@ -393,7 +394,7 @@ void print_hex_data_json(uint8_t *data, size_t len)  }  /* extra params for nftw cb */ -static struct pinned_obj_table *build_fn_table; +static struct hashmap *build_fn_table;  static enum bpf_obj_type build_fn_type;  static int do_build_table_cb(const char *fpath, const struct stat *sb, @@ -401,9 +402,9 @@ static int do_build_table_cb(const char *fpath, const struct stat *sb,  {  	struct bpf_prog_info pinned_info;  	__u32 len = sizeof(pinned_info); -	struct pinned_obj *obj_node;  	enum bpf_obj_type objtype;  	int fd, err = 0; +	char *path;  	if (typeflag != FTW_F)  		goto out_ret; @@ -420,28 +421,26 @@ static int do_build_table_cb(const char *fpath, const struct stat *sb,  	if (bpf_obj_get_info_by_fd(fd, &pinned_info, &len))  		goto out_close; -	obj_node = calloc(1, sizeof(*obj_node)); -	if (!obj_node) { +	path = strdup(fpath); +	if (!path) {  		err = -1;  		goto out_close;  	} -	obj_node->id = pinned_info.id; -	obj_node->path = strdup(fpath); -	if (!obj_node->path) { -		err = -1; -		free(obj_node); +	err = hashmap__append(build_fn_table, u32_as_hash_field(pinned_info.id), path); +	if (err) { +		p_err("failed to append entry to hashmap for ID %u, path '%s': %s", +		      pinned_info.id, path, strerror(errno));  		goto out_close;  	} -	hash_add(build_fn_table->table, &obj_node->hash, obj_node->id);  out_close:  	close(fd);  out_ret:  	return err;  } -int build_pinned_obj_table(struct pinned_obj_table *tab, +int build_pinned_obj_table(struct hashmap *tab,  			   enum bpf_obj_type type)  {  	struct mntent *mntent = NULL; @@ -470,17 +469,18 @@ int build_pinned_obj_table(struct pinned_obj_table *tab,  	return err;  } -void delete_pinned_obj_table(struct pinned_obj_table *tab) +void delete_pinned_obj_table(struct hashmap *map)  { -	struct pinned_obj *obj; -	struct hlist_node *tmp; -	unsigned int bkt; +	struct hashmap_entry *entry; +	size_t bkt; -	hash_for_each_safe(tab->table, bkt, tmp, obj, hash) { -		hash_del(&obj->hash); -		free(obj->path); -		free(obj); -	} +	if (!map) +		return; + +	hashmap__for_each_entry(map, entry, bkt) +		free(entry->value); + +	hashmap__free(map);  }  unsigned int get_page_size(void) @@ -962,3 +962,13 @@ int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len)  	return fd;  } + +size_t hash_fn_for_key_as_id(const void *key, void *ctx) +{ +	return (size_t)key; +} + +bool equal_fn_for_key_as_id(const void *k1, const void *k2, void *ctx) +{ +	return k1 == k2; +} |