diff options
Diffstat (limited to 'tools/bpf/bpftool/pids.c')
| -rw-r--r-- | tools/bpf/bpftool/pids.c | 90 | 
1 files changed, 52 insertions, 38 deletions
| diff --git a/tools/bpf/bpftool/pids.c b/tools/bpf/bpftool/pids.c index 477e55d59c34..56b598eee043 100644 --- a/tools/bpf/bpftool/pids.c +++ b/tools/bpf/bpftool/pids.c @@ -6,35 +6,37 @@  #include <stdlib.h>  #include <string.h>  #include <unistd.h> +  #include <bpf/bpf.h> +#include <bpf/hashmap.h>  #include "main.h"  #include "skeleton/pid_iter.h"  #ifdef BPFTOOL_WITHOUT_SKELETONS -int build_obj_refs_table(struct obj_refs_table *table, enum bpf_obj_type type) +int build_obj_refs_table(struct hashmap **map, enum bpf_obj_type type)  {  	return -ENOTSUP;  } -void delete_obj_refs_table(struct obj_refs_table *table) {} -void emit_obj_refs_plain(struct obj_refs_table *table, __u32 id, const char *prefix) {} -void emit_obj_refs_json(struct obj_refs_table *table, __u32 id, json_writer_t *json_writer) {} +void delete_obj_refs_table(struct hashmap *map) {} +void emit_obj_refs_plain(struct hashmap *map, __u32 id, const char *prefix) {} +void emit_obj_refs_json(struct hashmap *map, __u32 id, json_writer_t *json_writer) {}  #else /* BPFTOOL_WITHOUT_SKELETONS */  #include "pid_iter.skel.h" -static void add_ref(struct obj_refs_table *table, struct pid_iter_entry *e) +static void add_ref(struct hashmap *map, struct pid_iter_entry *e)  { +	struct hashmap_entry *entry;  	struct obj_refs *refs;  	struct obj_ref *ref; +	int err, i;  	void *tmp; -	int i; -	hash_for_each_possible(table->table, refs, node, e->id) { -		if (refs->id != e->id) -			continue; +	hashmap__for_each_key_entry(map, entry, u32_as_hash_field(e->id)) { +		refs = entry->value;  		for (i = 0; i < refs->ref_cnt; i++) {  			if (refs->refs[i].pid == e->pid) @@ -64,7 +66,6 @@ static void add_ref(struct obj_refs_table *table, struct pid_iter_entry *e)  		return;  	} -	refs->id = e->id;  	refs->refs = malloc(sizeof(*refs->refs));  	if (!refs->refs) {  		free(refs); @@ -76,7 +77,11 @@ static void add_ref(struct obj_refs_table *table, struct pid_iter_entry *e)  	ref->pid = e->pid;  	memcpy(ref->comm, e->comm, sizeof(ref->comm));  	refs->ref_cnt = 1; -	hash_add(table->table, &refs->node, e->id); + +	err = hashmap__append(map, u32_as_hash_field(e->id), refs); +	if (err) +		p_err("failed to append entry to hashmap for ID %u: %s", +		      e->id, strerror(errno));  }  static int __printf(2, 0) @@ -87,7 +92,7 @@ libbpf_print_none(__maybe_unused enum libbpf_print_level level,  	return 0;  } -int build_obj_refs_table(struct obj_refs_table *table, enum bpf_obj_type type) +int build_obj_refs_table(struct hashmap **map, enum bpf_obj_type type)  {  	struct pid_iter_entry *e;  	char buf[4096 / sizeof(*e) * sizeof(*e)]; @@ -95,7 +100,11 @@ int build_obj_refs_table(struct obj_refs_table *table, enum bpf_obj_type type)  	int err, ret, fd = -1, i;  	libbpf_print_fn_t default_print; -	hash_init(table->table); +	*map = hashmap__new(hash_fn_for_key_as_id, equal_fn_for_key_as_id, NULL); +	if (!*map) { +		p_err("failed to create hashmap for PID references"); +		return -1; +	}  	set_max_rlimit();  	skel = pid_iter_bpf__open(); @@ -151,7 +160,7 @@ int build_obj_refs_table(struct obj_refs_table *table, enum bpf_obj_type type)  		e = (void *)buf;  		for (i = 0; i < ret; i++, e++) { -			add_ref(table, e); +			add_ref(*map, e);  		}  	}  	err = 0; @@ -162,39 +171,44 @@ out:  	return err;  } -void delete_obj_refs_table(struct obj_refs_table *table) +void delete_obj_refs_table(struct hashmap *map)  { -	struct obj_refs *refs; -	struct hlist_node *tmp; -	unsigned int bkt; +	struct hashmap_entry *entry; +	size_t bkt; + +	if (!map) +		return; + +	hashmap__for_each_entry(map, entry, bkt) { +		struct obj_refs *refs = entry->value; -	hash_for_each_safe(table->table, bkt, tmp, refs, node) { -		hash_del(&refs->node);  		free(refs->refs);  		free(refs);  	} + +	hashmap__free(map);  } -void emit_obj_refs_json(struct obj_refs_table *table, __u32 id, +void emit_obj_refs_json(struct hashmap *map, __u32 id,  			json_writer_t *json_writer)  { -	struct obj_refs *refs; -	struct obj_ref *ref; -	int i; +	struct hashmap_entry *entry; -	if (hash_empty(table->table)) +	if (hashmap__empty(map))  		return; -	hash_for_each_possible(table->table, refs, node, id) { -		if (refs->id != id) -			continue; +	hashmap__for_each_key_entry(map, entry, u32_as_hash_field(id)) { +		struct obj_refs *refs = entry->value; +		int i; +  		if (refs->ref_cnt == 0)  			break;  		jsonw_name(json_writer, "pids");  		jsonw_start_array(json_writer);  		for (i = 0; i < refs->ref_cnt; i++) { -			ref = &refs->refs[i]; +			struct obj_ref *ref = &refs->refs[i]; +  			jsonw_start_object(json_writer);  			jsonw_int_field(json_writer, "pid", ref->pid);  			jsonw_string_field(json_writer, "comm", ref->comm); @@ -205,24 +219,24 @@ void emit_obj_refs_json(struct obj_refs_table *table, __u32 id,  	}  } -void emit_obj_refs_plain(struct obj_refs_table *table, __u32 id, const char *prefix) +void emit_obj_refs_plain(struct hashmap *map, __u32 id, const char *prefix)  { -	struct obj_refs *refs; -	struct obj_ref *ref; -	int i; +	struct hashmap_entry *entry; -	if (hash_empty(table->table)) +	if (hashmap__empty(map))  		return; -	hash_for_each_possible(table->table, refs, node, id) { -		if (refs->id != id) -			continue; +	hashmap__for_each_key_entry(map, entry, u32_as_hash_field(id)) { +		struct obj_refs *refs = entry->value; +		int i; +  		if (refs->ref_cnt == 0)  			break;  		printf("%s", prefix);  		for (i = 0; i < refs->ref_cnt; i++) { -			ref = &refs->refs[i]; +			struct obj_ref *ref = &refs->refs[i]; +  			printf("%s%s(%d)", i == 0 ? "" : ", ", ref->comm, ref->pid);  		}  		break; |