diff options
Diffstat (limited to 'kernel/bpf/arraymap.c')
| -rw-r--r-- | kernel/bpf/arraymap.c | 51 | 
1 files changed, 49 insertions, 2 deletions
| diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c index 0c17aab3ce5f..24583da9ffd1 100644 --- a/kernel/bpf/arraymap.c +++ b/kernel/bpf/arraymap.c @@ -358,6 +358,29 @@ static void array_map_seq_show_elem(struct bpf_map *map, void *key,  	rcu_read_unlock();  } +static void percpu_array_map_seq_show_elem(struct bpf_map *map, void *key, +					   struct seq_file *m) +{ +	struct bpf_array *array = container_of(map, struct bpf_array, map); +	u32 index = *(u32 *)key; +	void __percpu *pptr; +	int cpu; + +	rcu_read_lock(); + +	seq_printf(m, "%u: {\n", *(u32 *)key); +	pptr = array->pptrs[index & array->index_mask]; +	for_each_possible_cpu(cpu) { +		seq_printf(m, "\tcpu%d: ", cpu); +		btf_type_seq_show(map->btf, map->btf_value_type_id, +				  per_cpu_ptr(pptr, cpu), m); +		seq_puts(m, "\n"); +	} +	seq_puts(m, "}\n"); + +	rcu_read_unlock(); +} +  static int array_map_check_btf(const struct bpf_map *map,  			       const struct btf_type *key_type,  			       const struct btf_type *value_type) @@ -398,6 +421,7 @@ const struct bpf_map_ops percpu_array_map_ops = {  	.map_lookup_elem = percpu_array_map_lookup_elem,  	.map_update_elem = array_map_update_elem,  	.map_delete_elem = array_map_delete_elem, +	.map_seq_show_elem = percpu_array_map_seq_show_elem,  	.map_check_btf = array_map_check_btf,  }; @@ -425,7 +449,7 @@ static void fd_array_map_free(struct bpf_map *map)  static void *fd_array_map_lookup_elem(struct bpf_map *map, void *key)  { -	return NULL; +	return ERR_PTR(-EOPNOTSUPP);  }  /* only called from syscall */ @@ -529,6 +553,29 @@ static void bpf_fd_array_map_clear(struct bpf_map *map)  		fd_array_map_delete_elem(map, &i);  } +static void prog_array_map_seq_show_elem(struct bpf_map *map, void *key, +					 struct seq_file *m) +{ +	void **elem, *ptr; +	u32 prog_id; + +	rcu_read_lock(); + +	elem = array_map_lookup_elem(map, key); +	if (elem) { +		ptr = READ_ONCE(*elem); +		if (ptr) { +			seq_printf(m, "%u: ", *(u32 *)key); +			prog_id = prog_fd_array_sys_lookup_elem(ptr); +			btf_type_seq_show(map->btf, map->btf_value_type_id, +					  &prog_id, m); +			seq_puts(m, "\n"); +		} +	} + +	rcu_read_unlock(); +} +  const struct bpf_map_ops prog_array_map_ops = {  	.map_alloc_check = fd_array_map_alloc_check,  	.map_alloc = array_map_alloc, @@ -540,7 +587,7 @@ const struct bpf_map_ops prog_array_map_ops = {  	.map_fd_put_ptr = prog_fd_array_put_ptr,  	.map_fd_sys_lookup_elem = prog_fd_array_sys_lookup_elem,  	.map_release_uref = bpf_fd_array_map_clear, -	.map_check_btf = map_check_no_btf, +	.map_seq_show_elem = prog_array_map_seq_show_elem,  };  static struct bpf_event_entry *bpf_event_entry_gen(struct file *perf_file, | 
